|
|
|
Один внешний ключ и множество первичных в разных таблицах?
|
|||
|---|---|---|---|
|
#18+
СУБД MS SQL Server. Есть машины. У каждой машины есть цена. Машины бывают разных видов и у каждого вида свой основной параметр - спортинвые (макс. скорость), грузовые (грузоподъёмность), семейные (расход горючего). У каждого основного параметра по условию будет свой тип данных. Как это сделать в БД и как отношения расставить? Я придумал так, как на картинке во вложении. Проблема в том, что я сомневаюсь в правильности того, что один внешний ключ в таблице Car может сослаться на несколько первичных в разных таблицах. Также я не знаю, какие лучше правила обновления-удаления к таким отношениям приложить - каскадные, может, не стоит? Но по-другому лучше не могу придумать, как сделать. Посоветуйте, пожалуйста, какой лучше вариант организации таблиц для такой задачи сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 12:47 |
|
||
|
Один внешний ключ и множество первичных в разных таблицах?
|
|||
|---|---|---|---|
|
#18+
авторПроблема в том, что я сомневаюсь в правильности того, что один внешний ключ в таблице Car может сослаться на несколько первичных в разных таблицах. Ну, т. е. дизайнер БД дать-то может мне и даст так сделать, но я сомневаюсь в правильном архитектурном решении. Если для кого-то кажется это простым - наверное. Я давно уже не брал в руки шашек и последний год вообще к проектированию БД отношения не имел. Всё повылетало из головы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 12:51 |
|
||
|
Один внешний ключ и множество первичных в разных таблицах?
|
|||
|---|---|---|---|
|
#18+
user7320Посоветуйте, пожалуйста, какой лучше вариант организации таблиц для такой задачи сделать. Одна таблица Car, вторая таблица - "Характеристики автомобиля", куда и спихать все характеристики. Ссылается на первую. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 12:52 |
|
||
|
Один внешний ключ и множество первичных в разных таблицах?
|
|||
|---|---|---|---|
|
#18+
Да, в таблице CarType перечислены все типы, которые представлены таблицами - для каждого типа по отдельной таблице. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 12:53 |
|
||
|
Один внешний ключ и множество первичных в разных таблицах?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovuser7320Посоветуйте, пожалуйста, какой лучше вариант организации таблиц для такой задачи сделать. Одна таблица Car, вторая таблица - "Характеристики автомобиля", куда и спихать все характеристики. Ссылается на первую. Хмм, у меня пример не совсем удачный... Вобщем, ограничение, что не все характеристики одного типа автомобиля должны присутствовать в другом. Предлагаете при вставке нового автомобиля просто сделать пропуски в тех стобцах, для которых нет данных? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 12:54 |
|
||
|
Один внешний ключ и множество первичных в разных таблицах?
|
|||
|---|---|---|---|
|
#18+
И да, мне ещё важно знать, имеет ли право на жизнь моё решение и какие у него могут быть минусы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 12:55 |
|
||
|
Один внешний ключ и множество первичных в разных таблицах?
|
|||
|---|---|---|---|
|
#18+
Ещё проблема в том, что надо будет выводить автомобили по типу и для каждого типа - только актуальные для этого типа данные. Т. е. нельзя, например, вывести прочерк в грузоподъёмности для спортивного автомобиля. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 12:59 |
|
||
|
Один внешний ключ и множество первичных в разных таблицах?
|
|||
|---|---|---|---|
|
#18+
user7320И да, мне ещё важно знать, имеет ли право на жизнь моё решение и какие у него могут быть минусы. Правильнеее сделать наоборот - первичный ключ в таблице Car и внешние ключи в дочерних таблицах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 13:06 |
|
||
|
Один внешний ключ и множество первичных в разных таблицах?
|
|||
|---|---|---|---|
|
#18+
user7320нельзя, например, вывести прочерк в грузоподъёмности для спортивного автомобиля. А что там можно вывести? Т.е. как ты такой вывод себе представляешь? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 13:12 |
|
||
|
Один внешний ключ и множество первичных в разных таблицах?
|
|||
|---|---|---|---|
|
#18+
Кот Матроскинuser7320И да, мне ещё важно знать, имеет ли право на жизнь моё решение и какие у него могут быть минусы. Правильнеее сделать наоборот - первичный ключ в таблице Car и внешние ключи в дочерних таблицах. Почему? Количество машин с конкретной максимальной скоростью ограничено (скажем, есть градации максимальных скоростей, даже если эти градации идут с шаком 1 км/ч, например), а количество машин вообще - нет. На одну машину приходится один класс машин с конкретной максимальной скоростью, но на один класс машин с конкретной максимальной скоростью приходится много машин. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 13:14 |
|
||
|
Один внешний ключ и множество первичных в разных таблицах?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovuser7320нельзя, например, вывести прочерк в грузоподъёмности для спортивного автомобиля. А что там можно вывести? Т.е. как ты такой вывод себе представляешь? По вашему вывод будет примерно такой: список машин для семьи: №PriceMaxSpeedTonnageFuelRate1500 000--1л/10км список спортивных машин: №PriceMaxSpeedTonnageFuelRate11 000 000300 км/ч-- список машин вообще: №PriceMaxSpeedTonnageFuelRate1500 000--1л/10км21 000 000300 км/ч-- Нелогично. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 13:20 |
|
||
|
Один внешний ключ и множество первичных в разных таблицах?
|
|||
|---|---|---|---|
|
#18+
user7320Кот Матроскинпропущено... Правильнеее сделать наоборот - первичный ключ в таблице Car и внешние ключи в дочерних таблицах. Почему? Количество машин с конкретной максимальной скоростью ограничено (скажем, есть градации максимальных скоростей, даже если эти градации идут с шаком 1 км/ч, например), а количество машин вообще - нет. На одну машину приходится один класс машин с конкретной максимальной скоростью, но на один класс машин с конкретной максимальной скоростью приходится много машин. у Вас SportCar и т.д. - это справочники, а не дочерние таблицы, что ли? Тогда это все равно плохое решение 1. Ограничений целостности, считай, нет. 2. Cоединение делать сложно - потребуется динамический SQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 13:21 |
|
||
|
Один внешний ключ и множество первичных в разных таблицах?
|
|||
|---|---|---|---|
|
#18+
user7320По вашему вывод будет примерно такой: Нет, чудик, я спрашиваю какой по-твоему должен быть вывод. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 13:27 |
|
||
|
Один внешний ключ и множество первичных в разных таблицах?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, кроме того, при добавлении в базу нового типа автомобилей, для которых появляется новый ключевой параметр, которого раньше не было для других автомобилей (его может даже ПРИНЦИПИАЛЬНО не быть для других автомобилей), придётся редактировать схему уже созданной и заполненной таблицы "Характеристики автомобилей". Я вот не уверен, что это можно делать - может, придётся создавать новую таблицу и переносить в неё данные из старой. А в моём случае просто добавляется свежая таблица в БД, добавляется запись в таблицу CarType и добавляются записи в таблицу Car - ничего не надо менять ИЗ УЖЕ ГОТОВОГО и ничего никуда переносить не надо. Если я ошибаюсь и менять структуру уже созданной таблицы можно хотя бы в части добавления новых столбцов, то ваш вариант по этому вопросу уже проходит. Но остаётся неудосбвто, что я выше описал с выводом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 13:29 |
|
||
|
Один внешний ключ и множество первичных в разных таблицах?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovuser7320По вашему вывод будет примерно такой: Нет, чудик, я спрашиваю какой по-твоему должен быть вывод. В выводе должны быть только те данные, которые актуальны для конкретного типа автомобиля. Т. е. сущность "тип автомобиля" уже как минимум должна быть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 13:30 |
|
||
|
Один внешний ключ и множество первичных в разных таблицах?
|
|||
|---|---|---|---|
|
#18+
Вот похожую проблему нашёл http://www.sql.ru/forum/67152/nasledovanie-v-baze-dannyh . Но там так и не предложили конечной схемы БД, а топикстартер как-то и забыл про это, похоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 13:32 |
|
||
|
Один внешний ключ и множество первичных в разных таблицах?
|
|||
|---|---|---|---|
|
#18+
user7320В выводе должны быть только те данные, которые актуальны для конкретного типа автомобиля. Как это должно выглядеть ? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 13:34 |
|
||
|
Один внешний ключ и множество первичных в разных таблицах?
|
|||
|---|---|---|---|
|
#18+
я вот чё понять не могу.... Почему у каждого параметра будет свой тип данных? Там везде делай тип строка и ваще никаких проблем. При сортировке значений параметров значения которых содержат цифры (наример скорость или грузоподъёмность) не трудно в число перевести значение параметра Тогда вместо кучи таблиц типов машин (что в общем-то хрень какая-то ибо, что делать в случае, когда оператор просто ошибся с типом при заведении информации о новой машине? Да и может быть случай, когда завели как спортивную машину, а подумав решили перевести в семейные. Чё делать в таких случаях с кучей таблиц?) Так вот вместо кучи таблиц добавляешь ещё две: Параметры(id, name) Характеристики машин(id_type, id_parameter, value, is_main) в поле is_main будешь отмечать является ли парамтер основным, ибо я струдом представляю, что тебе нужны только одни основные парметры. Ну даже если и только основные, будут в этом столбце отметки, что параметр основной, плохо что ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 13:55 |
|
||
|
Один внешний ключ и множество первичных в разных таблицах?
|
|||
|---|---|---|---|
|
#18+
а... чё-то я фигню какую-то написал. В таблице характеристик не надо value его в отдельную таблицу выводи: Характеристики машин (id_car, id_parameter, value) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 13:59 |
|
||
|
Один внешний ключ и множество первичных в разных таблицах?
|
|||
|---|---|---|---|
|
#18+
В общем достаточно таблиц Машины(id, name, id_type) Типы машин (id, name) Параметры (id, name) Список параметров по типам машин (id_type, id_parameter, is_main) Характеристики машин (id_car, id_parameter, value) Если так необходимо иметь парметиры разных типов, то сделай в таблице параметров поле type_value А таблицу характиристик машин разбей на требуемое количество типов: Строковые характеристики машин, Числовые характеристики машин, Бинарные характеристики машин и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 14:04 |
|
||
|
Один внешний ключ и множество первичных в разных таблицах?
|
|||
|---|---|---|---|
|
#18+
user7320, Сколько можно всем повторять? Используйте наследование таблиц, оно же отношение подкатегории. О том, как это делается, можно прочитать в статьях по ErWin-у (на interface.ru, например), или в документации по PostgreSQL -- там ровно оно и реализовано в виде наследования таблиц, только ещё много автоматизма добавляется. Автоматизм вовсе не обязателен, а принцип тот же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 14:26 |
|
||
|
Один внешний ключ и множество первичных в разных таблицах?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovuser7320В выводе должны быть только те данные, которые актуальны для конкретного типа автомобиля. Как это должно выглядеть ? машины для семьи: №PriceFuelRate1500 0001л/10км грузовые машины: №PriceTonnage11 500 0005т и т. д. Вобщем, если завести сущность "Тип машины" и завести связь этой сущности с сущностью Car (которая, в свою очередь, будет связана с сущностью "Характеристики машин"), то можно в запросе просто указать условие, какие параметры отбирать из характеристик машин в зависимости от того, каким типом машина является. В моём случае с отдельной сущностью для каждого типа машин (это кроме сущности "список типов машин") примерно то же самое будет. Просто немного другой запрос. Вобщем, и в вашем, и в моём варианте проблем с запросом не будет. И ещё, я проверил через Студию - можно в уже готовую таблицу с заполненными данными новые столбцы добавлять, старые (с данным) удалять... Вобщем, что-то сильно много вольностей позволяют. Ну, т. е. ваша организация данных (все характеристики всех типов машин в одной таблице) вроде как с этой стороны не имеет минусов при добавлении новых типов машин с новыми параметрами. Вобщем, если не получится мой вариант или он выйдет слишком сложным, я возьму ваш как наиболее простой. Кот Матроскинuser7320пропущено... Почему? Количество машин с конкретной максимальной скоростью ограничено (скажем, есть градации максимальных скоростей, даже если эти градации идут с шаком 1 км/ч, например), а количество машин вообще - нет. На одну машину приходится один класс машин с конкретной максимальной скоростью, но на один класс машин с конкретной максимальной скоростью приходится много машин. у Вас SportCar и т.д. - это справочники, а не дочерние таблицы, что ли? Тогда это все равно плохое решение 1. Ограничений целостности, считай, нет. 2. Cоединение делать сложно - потребуется динамический SQL. Я так понимаю, что ограничения целостности можно организовать просто добавив каскадные правила для удаления и хорошо написав софт, работающий с БД? SportCar и т.д. - это да, вроде как справочники. Но по идее надо наследованием, ибо если без, то придётся, скорее всего, вводить категории основного параметра (например, не любая макс. скорость, а "до 300 км/ч", "до 320 км/ч" и т. д.) и относить каждую машину к категории основного параметра, а не к его произвольному значению. Иначе будет тупо список уникальных значений основного параметра. Наследование позволит избежать категорий и сделать то, что по сути и требуется - список уникальных значений основного параметра. При этом общие для всех машин свойства (Price, например) выносятся в родитеслькую таблицу, а уникальные для каждого конкретного типа машин - в соответствующие таблицы типов машин. Но при этом я всё равно оставляю ещё одну таблицу - список типов машин. Ибо как-то надо же отметить, что машина такого-то типа. Вобщем, посмотрите ниже на новую схему - почти ничего не изменилось, только наследование добавил. авторя вот чё понять не могу.... Почему у каждого параметра будет свой тип данных? Таковы требования. авторСколько можно всем повторять? Используйте наследование таблиц, оно же отношение подкатегории. Да, я об этом и подумал. Теперь у меня так, как ниже. Кто что скажет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 17:39 |
|
||
|
Один внешний ключ и множество первичных в разных таблицах?
|
|||
|---|---|---|---|
|
#18+
авторя вот чё понять не могу.... Почему у каждого параметра будет свой тип данных? Пример больше задание, а не реальная ситуация, где можно сгладить острые углы. Поэтому нужно делать так, как сказали. авторМашины(id, name, id_type) Типы машин (id, name) Параметры (id, name) Список параметров по типам машин (id_type, id_parameter, is_main) Характеристики машин (id_car, id_parameter, value) Я так понимаю, что при добавлении нового типа машин (и новых параметров) у вас новых таблиц добавлять не надо. Да, это лучше, чем мой вариант. Подумаю над этим. MasterZiv, скажите, как вам пример Mr.Fontaine? Тут и наследование не нужно, и добавление новых типов машин без добавления таблиц выходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 17:46 |
|
||
|
Один внешний ключ и множество первичных в разных таблицах?
|
|||
|---|---|---|---|
|
#18+
user7320и т. д. Ну так вали все характеристики в одну таблицу (можно прямо в Car), а в запросах не используй *: Код: sql 1. 2. И будет тебе счастье. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 17:55 |
|
||
|
Один внешний ключ и множество первичных в разных таблицах?
|
|||
|---|---|---|---|
|
#18+
user7320Кот Матроскинпропущено... у Вас SportCar и т.д. - это справочники, а не дочерние таблицы, что ли? Тогда это все равно плохое решение 1. Ограничений целостности, считай, нет. 2. Cоединение делать сложно - потребуется динамический SQL. Я так понимаю, что ограничения целостности можно организовать просто добавив каскадные правила для удаления и хорошо написав софт, работающий с БД? Каскадные удаления - это вообще большой экстрим, который в реальной жизни встречается крайне редко. В норме ограничения выглядят как "не дать удалить родителя, если есть дети", "не дать вставить/обновить ребенка, если нет родителя". И у Вас это можно сделать только триггерами. user7320Да, я об этом и подумал. Теперь у меня так, как ниже. Кто что скажет? Я это с самого начала и посоветовал. В этой новой схеме что Вам мешает сделать PK в Car, а внешние ключи в дочерних таблицах? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 18:35 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=38345150&tid=1541126]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
142ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 12ms |
| total: | 249ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...