powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Один внешний ключ и множество первичных в разных таблицах?
25 сообщений из 51, страница 1 из 3
Один внешний ключ и множество первичных в разных таблицах?
    #38345040
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СУБД MS SQL Server.

Есть машины. У каждой машины есть цена. Машины бывают разных видов и у каждого вида свой основной параметр - спортинвые (макс. скорость), грузовые (грузоподъёмность), семейные (расход горючего). У каждого основного параметра по условию будет свой тип данных. Как это сделать в БД и как отношения расставить?

Я придумал так, как на картинке во вложении. Проблема в том, что я сомневаюсь в правильности того, что один внешний ключ в таблице Car может сослаться на несколько первичных в разных таблицах. Также я не знаю, какие лучше правила обновления-удаления к таким отношениям приложить - каскадные, может, не стоит? Но по-другому лучше не могу придумать, как сделать. Посоветуйте, пожалуйста, какой лучше вариант организации таблиц для такой задачи сделать.
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38345052
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПроблема в том, что я сомневаюсь в правильности того, что один внешний ключ в таблице Car может сослаться на несколько первичных в разных таблицах.
Ну, т. е. дизайнер БД дать-то может мне и даст так сделать, но я сомневаюсь в правильном архитектурном решении.

Если для кого-то кажется это простым - наверное. Я давно уже не брал в руки шашек и последний год вообще к проектированию БД отношения не имел. Всё повылетало из головы.
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38345057
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Посоветуйте, пожалуйста, какой лучше вариант организации таблиц для такой
задачи сделать.
Одна таблица Car, вторая таблица - "Характеристики автомобиля", куда и спихать все
характеристики. Ссылается на первую.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38345058
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, в таблице CarType перечислены все типы, которые представлены таблицами - для каждого типа по отдельной таблице.
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38345064
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovuser7320Посоветуйте, пожалуйста, какой лучше вариант организации таблиц для такой
задачи сделать.
Одна таблица Car, вторая таблица - "Характеристики автомобиля", куда и спихать все
характеристики. Ссылается на первую.

Хмм, у меня пример не совсем удачный... Вобщем, ограничение, что не все характеристики одного типа автомобиля должны присутствовать в другом. Предлагаете при вставке нового автомобиля просто сделать пропуски в тех стобцах, для которых нет данных?
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38345067
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И да, мне ещё важно знать, имеет ли право на жизнь моё решение и какие у него могут быть минусы.
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38345075
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё проблема в том, что надо будет выводить автомобили по типу и для каждого типа - только актуальные для этого типа данные. Т. е. нельзя, например, вывести прочерк в грузоподъёмности для спортивного автомобиля.
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38345088
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320И да, мне ещё важно знать, имеет ли право на жизнь моё решение и какие у него могут быть минусы.
Правильнеее сделать наоборот - первичный ключ в таблице Car и внешние ключи в дочерних таблицах.
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38345098
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320нельзя, например, вывести прочерк в грузоподъёмности для спортивного
автомобиля.
А что там можно вывести? Т.е. как ты такой вывод себе представляешь?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38345103
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот Матроскинuser7320И да, мне ещё важно знать, имеет ли право на жизнь моё решение и какие у него могут быть минусы.
Правильнеее сделать наоборот - первичный ключ в таблице Car и внешние ключи в дочерних таблицах.
Почему? Количество машин с конкретной максимальной скоростью ограничено (скажем, есть градации максимальных скоростей, даже если эти градации идут с шаком 1 км/ч, например), а количество машин вообще - нет. На одну машину приходится один класс машин с конкретной максимальной скоростью, но на один класс машин с конкретной максимальной скоростью приходится много машин.
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38345113
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovuser7320нельзя, например, вывести прочерк в грузоподъёмности для спортивного
автомобиля.
А что там можно вывести? Т.е. как ты такой вывод себе представляешь?

По вашему вывод будет примерно такой:

список машин для семьи:

№PriceMaxSpeedTonnageFuelRate1500 000--1л/10км

список спортивных машин:

№PriceMaxSpeedTonnageFuelRate11 000 000300 км/ч--

список машин вообще:

№PriceMaxSpeedTonnageFuelRate1500 000--1л/10км21 000 000300 км/ч--

Нелогично.
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38345116
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Кот Матроскинпропущено...

Правильнеее сделать наоборот - первичный ключ в таблице Car и внешние ключи в дочерних таблицах.
Почему? Количество машин с конкретной максимальной скоростью ограничено (скажем, есть градации максимальных скоростей, даже если эти градации идут с шаком 1 км/ч, например), а количество машин вообще - нет. На одну машину приходится один класс машин с конкретной максимальной скоростью, но на один класс машин с конкретной максимальной скоростью приходится много машин.
у Вас SportCar и т.д. - это справочники, а не дочерние таблицы, что ли?
Тогда это все равно плохое решение
1. Ограничений целостности, считай, нет.
2. Cоединение делать сложно - потребуется динамический SQL.
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38345129
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320По вашему вывод будет примерно такой:

Нет, чудик, я спрашиваю какой по-твоему должен быть вывод.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38345136
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

кроме того, при добавлении в базу нового типа автомобилей, для которых появляется новый ключевой параметр, которого раньше не было для других автомобилей (его может даже ПРИНЦИПИАЛЬНО не быть для других автомобилей), придётся редактировать схему уже созданной и заполненной таблицы "Характеристики автомобилей". Я вот не уверен, что это можно делать - может, придётся создавать новую таблицу и переносить в неё данные из старой.

А в моём случае просто добавляется свежая таблица в БД, добавляется запись в таблицу CarType и добавляются записи в таблицу Car - ничего не надо менять ИЗ УЖЕ ГОТОВОГО и ничего никуда переносить не надо.

Если я ошибаюсь и менять структуру уже созданной таблицы можно хотя бы в части добавления новых столбцов, то ваш вариант по этому вопросу уже проходит. Но остаётся неудосбвто, что я выше описал с выводом.
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38345143
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovuser7320По вашему вывод будет примерно такой:

Нет, чудик, я спрашиваю какой по-твоему должен быть вывод.

В выводе должны быть только те данные, которые актуальны для конкретного типа автомобиля. Т. е. сущность "тип автомобиля" уже как минимум должна быть.
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38345145
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот похожую проблему нашёл http://www.sql.ru/forum/67152/nasledovanie-v-baze-dannyh . Но там так и не предложили конечной схемы БД, а топикстартер как-то и забыл про это, похоже.
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38345150
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320В выводе должны быть только те данные, которые актуальны для конкретного
типа автомобиля.
Как это должно выглядеть ?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38345197
Mr.Fontaine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я вот чё понять не могу.... Почему у каждого параметра будет свой тип данных?
Там везде делай тип строка и ваще никаких проблем. При сортировке значений параметров значения которых содержат цифры (наример скорость или грузоподъёмность) не трудно в число перевести значение параметра

Тогда вместо кучи таблиц типов машин (что в общем-то хрень какая-то ибо, что делать в случае, когда оператор просто ошибся с типом при заведении информации о новой машине? Да и может быть случай, когда завели как спортивную машину, а подумав решили перевести в семейные. Чё делать в таких случаях с кучей таблиц?)

Так вот вместо кучи таблиц добавляешь ещё две:
Параметры(id, name)
Характеристики машин(id_type, id_parameter, value, is_main) в поле is_main будешь отмечать является ли парамтер основным, ибо я струдом представляю, что тебе нужны только одни основные парметры. Ну даже если и только основные, будут в этом столбце отметки, что параметр основной, плохо что ли?
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38345205
Mr.Fontaine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а... чё-то я фигню какую-то написал. В таблице характеристик не надо value
его в отдельную таблицу выводи: Характеристики машин (id_car, id_parameter, value)
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38345221
Mr.Fontaine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем достаточно таблиц
Машины(id, name, id_type)
Типы машин (id, name)
Параметры (id, name)
Список параметров по типам машин (id_type, id_parameter, is_main)
Характеристики машин (id_car, id_parameter, value)

Если так необходимо иметь парметиры разных типов, то сделай в таблице параметров поле type_value
А таблицу характиристик машин разбей на требуемое количество типов: Строковые характеристики машин, Числовые характеристики машин, Бинарные характеристики машин и т.д.
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38345255
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,

Сколько можно всем повторять?
Используйте наследование таблиц, оно же отношение подкатегории.

О том, как это делается, можно прочитать в статьях по ErWin-у (на interface.ru, например),
или в документации по PostgreSQL -- там ровно оно и реализовано в виде наследования таблиц, только ещё много автоматизма добавляется. Автоматизм вовсе не обязателен, а принцип тот же.
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38345752
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovuser7320В выводе должны быть только те данные, которые актуальны для конкретного
типа автомобиля.
Как это должно выглядеть ?

машины для семьи:

№PriceFuelRate1500 0001л/10км

грузовые машины:

№PriceTonnage11 500 0005т

и т. д.

Вобщем, если завести сущность "Тип машины" и завести связь этой сущности с сущностью Car (которая, в свою очередь, будет связана с сущностью "Характеристики машин"), то можно в запросе просто указать условие, какие параметры отбирать из характеристик машин в зависимости от того, каким типом машина является.

В моём случае с отдельной сущностью для каждого типа машин (это кроме сущности "список типов машин") примерно то же самое будет. Просто немного другой запрос. Вобщем, и в вашем, и в моём варианте проблем с запросом не будет.

И ещё, я проверил через Студию - можно в уже готовую таблицу с заполненными данными новые столбцы добавлять, старые (с данным) удалять... Вобщем, что-то сильно много вольностей позволяют. Ну, т. е. ваша организация данных (все характеристики всех типов машин в одной таблице) вроде как с этой стороны не имеет минусов при добавлении новых типов машин с новыми параметрами. Вобщем, если не получится мой вариант или он выйдет слишком сложным, я возьму ваш как наиболее простой.


Кот Матроскинuser7320пропущено...

Почему? Количество машин с конкретной максимальной скоростью ограничено (скажем, есть градации максимальных скоростей, даже если эти градации идут с шаком 1 км/ч, например), а количество машин вообще - нет. На одну машину приходится один класс машин с конкретной максимальной скоростью, но на один класс машин с конкретной максимальной скоростью приходится много машин.
у Вас SportCar и т.д. - это справочники, а не дочерние таблицы, что ли?
Тогда это все равно плохое решение
1. Ограничений целостности, считай, нет.
2. Cоединение делать сложно - потребуется динамический SQL.
Я так понимаю, что ограничения целостности можно организовать просто добавив каскадные правила для удаления и хорошо написав софт, работающий с БД?

SportCar и т.д. - это да, вроде как справочники. Но по идее надо наследованием, ибо если без, то придётся, скорее всего, вводить категории основного параметра (например, не любая макс. скорость, а "до 300 км/ч", "до 320 км/ч" и т. д.) и относить каждую машину к категории основного параметра, а не к его произвольному значению. Иначе будет тупо список уникальных значений основного параметра. Наследование позволит избежать категорий и сделать то, что по сути и требуется - список уникальных значений основного параметра. При этом общие для всех машин свойства (Price, например) выносятся в родитеслькую таблицу, а уникальные для каждого конкретного типа машин - в соответствующие таблицы типов машин.

Но при этом я всё равно оставляю ещё одну таблицу - список типов машин. Ибо как-то надо же отметить, что машина такого-то типа. Вобщем, посмотрите ниже на новую схему - почти ничего не изменилось, только наследование добавил.


авторя вот чё понять не могу.... Почему у каждого параметра будет свой тип данных?
Таковы требования.

авторСколько можно всем повторять?
Используйте наследование таблиц, оно же отношение подкатегории.
Да, я об этом и подумал. Теперь у меня так, как ниже. Кто что скажет?
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38345774
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторя вот чё понять не могу.... Почему у каждого параметра будет свой тип данных?
Пример больше задание, а не реальная ситуация, где можно сгладить острые углы. Поэтому нужно делать так, как сказали.

авторМашины(id, name, id_type)
Типы машин (id, name)
Параметры (id, name)
Список параметров по типам машин (id_type, id_parameter, is_main)
Характеристики машин (id_car, id_parameter, value)
Я так понимаю, что при добавлении нового типа машин (и новых параметров) у вас новых таблиц добавлять не надо. Да, это лучше, чем мой вариант. Подумаю над этим.

MasterZiv, скажите, как вам пример Mr.Fontaine? Тут и наследование не нужно, и добавление новых типов машин без добавления таблиц выходит.
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38345795
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320и т. д.
Ну так вали все характеристики в одну таблицу (можно прямо в Car), а в запросах не
используй *:
Код: sql
1.
2.
select id,Price,FuelRate ...
select id,Price,Tonnage ...


И будет тебе счастье.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38345893
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Кот Матроскинпропущено...

у Вас SportCar и т.д. - это справочники, а не дочерние таблицы, что ли?
Тогда это все равно плохое решение
1. Ограничений целостности, считай, нет.
2. Cоединение делать сложно - потребуется динамический SQL.
Я так понимаю, что ограничения целостности можно организовать просто добавив каскадные правила для удаления и хорошо написав софт, работающий с БД?

Каскадные удаления - это вообще большой экстрим, который в реальной жизни встречается крайне редко. В норме ограничения выглядят как "не дать удалить родителя, если есть дети", "не дать вставить/обновить ребенка, если нет родителя".
И у Вас это можно сделать только триггерами.


user7320Да, я об этом и подумал. Теперь у меня так, как ниже. Кто что скажет?

Я это с самого начала и посоветовал. В этой новой схеме что Вам мешает сделать PK в Car, а внешние ключи в дочерних таблицах?
...
Рейтинг: 0 / 0
25 сообщений из 51, страница 1 из 3
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Один внешний ключ и множество первичных в разных таблицах?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]