powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Один внешний ключ и множество первичных в разных таблицах?
51 сообщений из 51, показаны все 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
Один внешний ключ и множество первичных в разных таблицах?
    #38346011
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот Матроскинuser7320Да, я об этом и подумал. Теперь у меня так, как ниже. Кто что скажет?

Я это с самого начала и посоветовал. В этой новой схеме что Вам мешает сделать PK в Car, а внешние ключи в дочерних таблицах?
А можно эти внешние ключи в дочерных таблицах сделать первичными ключами в этих дочерних и одновременно идентификаторами? Чтобы не заводить отдельный столбец для FK в каждой дочерней таблице. Т. е. получится, что Car.Id будет совпадать с соответствующим SportCar.Id. Т. е. примерно так:

Car
IdPriceCarType9991 000 000SportCar1001500 000FamilyCar

SportCar
IdMaxSpeed999300 км/ч

FamilyCar
IdFuelRate10011л/10км

Или какие-то подвохи могут быть?



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

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

Я вижу минус в варианте Dimitry Sibiryakov в том, что придётся городить больше логики в редакторе, чтобы скрыть от юзера кучу пустых полей для разных типов машин. Плюс в том, что не надо делать новую таблицу при появлении нового типа машин. Минус - что придётся добавлять новые столбцы при появлении новых параметров.

У Mr.Fontaine , вроде, в редакторе меньше логики, но более сложные (и долгие) запросы к БД. Тот же плюс, что и у Dimitry Sibiryakov - не надо городить новых таблиц при появлении нового типа машин. И нету минуса при появлении новых параметров - т. е. не надо вставлять новые столбцы в таблицы, а обойтись всего лишь новыми записями.

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

Нет, ни у магазинов, ни тем более у склада такой задачи нет. С теми задачами, которые у
них есть справляется EAV.

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

Может ли считаться в этой модели минусом то, что придётся добавлять столбцы при добавлении типа машин или параметров машин? В варианте Mr.Fontaine, например, столбцов добавлять не надо. Что вы про его вариант думаете, кстати?
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38346026
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Мой вариант, улучшенный Котом Матроскиным, позволяет наглядно создать
наследование и тем самым улучшить восприятие

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

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

Этот вариант и есть EAV, но, поскольку ты его не опознал, см.выше.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38346058
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Ещё проблема в том, что надо будет выводить автомобили по типу и для каждого типа - только актуальные для этого типа данные. Т. е. нельзя, например, вывести прочерк в грузоподъёмности для спортивного автомобиля.

Это наше фсе. Так и продолжайте пока с облегчением забросив запросы на процедурах все начнете делать.

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

Спорткары, или правильно фраеркары обладают грузоподьемностью точно так же, как и прочие кары. С той лишь разницей что у грузовика это измеряется в тоннах, а у фраеркара в литрах объема багажника как и для всех прочих легковых автомобилей. Но не потому что таковы особенности каров, а потому что таковы особенности маркетинга. Обывателю не интересно сколько кг он может увезти, ему интересно сколько влезет барахла. Поэтому измерять грузоподъемность можно и в чемоданах http://www.lakelandgear.com/car-top-carrier-bags/car-top-carrier-capacity-guide.html

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

Ну так и есть. Это не техническая задача, а маркетинговая. И конечно БД должна быть не автомобилецентрическая, а водителетакаяже. Что усугубляет.

Например тип водителя "Блондинка" может оказаться с единственным отношением к таблице Цвет машины и полю "розовый".

Другими словами вам потребуется куча справочников под каждую характеристику (которые вы сейчас типа сгрупировали по совокупности опций в спорткары, семкары и прочие кары) типа: Цвет, Размер колес, Объем багажника, Грузоподъемность, Сколько мешков картошки можно увезти, Тип трансмиссии, Тип тормозов, Набор свистелок и перделок и так далее и конца края не видно.

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

Тогда содержание таблицы тип водителя будет примерно таким

1 Цвет Розовый
1 Объем багажника 110 л
1 Скорость 90 км/час
1 Разгон 10 сек
2 ..
2 ..
2
3
3
4
..

единственное отношение это код водителя слева на таблицу с характеристикой водителей типа 1 - блондинка, 2 - семейный, 3 - холостой 4 - рабочий, 5 - фраер и тд.
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38346115
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дебилоггера понесло. (почти с)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38346228
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Один внешний ключ и множество первичных в разных таблицах?
    #38346246
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо, я понял как делать и составил схему БД.
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38346259
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторКаскадные удаления - это вообще большой экстрим, который в реальной жизни встречается крайне редко. В норме ограничения выглядят как "не дать удалить родителя, если есть дети", "не дать вставить/обновить ребенка, если нет родителя".
И у Вас это можно сделать только триггерами.
Т. е. если я хочу удалить все продукты определённого типа, то вместо того, чтобы удалить тип продукта и каскадно автоматически удалить все продукты этого типа, я должен сначала удалить все продукты этого типа, а потом - этот тип? И сделать триггер, который не даст удалить тип продукта, пока есть хоть один продукт этого типа? Так правильно?
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38346287
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320авторя вот чё понять не могу.... Почему у каждого параметра будет свой тип данных?
Пример больше задание, а не реальная ситуация, где можно сгладить острые углы. Поэтому нужно делать так, как сказали.

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

MasterZiv, скажите, как вам пример Mr.Fontaine? Тут и наследование не нужно, и добавление новых типов машин без добавления таблиц выходит.


Это Eav, тоже можно, но простое наследование таблиц — более простой и прямой вариант.
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38346430
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivMasterZiv, скажите, как вам пример Mr.Fontaine? Тут и наследование не нужно, и добавление новых типов машин без добавления таблиц выходит.


Это Eav, тоже можно, но простое наследование таблиц — более простой и прямой вариант.[/quot]
Я использовал и то, и другое. В частности, общие поля я вынес в родительскую таблицу, а частные - в потомковые. А EAV, я использовал для той сложной штуки, где надо было сделать отношения между типами машин, собственно машинами, параметрами и главными параметрами, да ещё с разным типом данных. Это упрощённый пример. На самом деле у меня задача немного посложнее, поэтому там нашлось место и наследованию, и EAV. Надеюсь, это не является плохой практикой - смешивать разные способы организации данных в одной БД?
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38346558
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Это Eav, тоже можно, но простое наследование таблиц — более простой и прямой вариант.


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

Если так необходимо иметь парметиры разных типов, то сделай в таблице параметров поле type_value
А таблицу характиристик машин разбей на требуемое количество типов: Строковые характеристики машин, Числовые характеристики машин, Бинарные характеристики машин и т.д.
Я вот по последнему не понял, когда нужны разные типы параметров. Как лучше сделать? В таблице числовых характеристик завести столбцы типа stringValue, integerValue, floatValue и т. п. - "разрежённая матрица"? Или лучше на каждый тип значения свою таблицу? Или ещё как-то?

Может, сделать все параметры строками, даже числа, а потом поддерживать систему конвертации этих строк в соответствующие числа по типу параметра? Как-то слишком наворочено выглядит. Как обычно делают, когда надо параметры разных типов?
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38390774
Mr.Fontaine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320, я подразумевал "разряжённую матрицу"
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38393149
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320
Я придумал так, как на картинке во вложении. Проблема в том, что я сомневаюсь в правильности того, что один внешний ключ в таблице Car может сослаться на несколько первичных в разных таблицах. Также я не знаю, какие лучше правила обновления-удаления к таким отношениям приложить - каскадные, может, не стоит? Но по-другому лучше не могу придумать, как сделать. Посоветуйте, пожалуйста, какой лучше вариант организации таблиц для такой задачи сделать.

Придумал ты почти правильно. Но ссылаться должен не Car (родительская таблица) на дочерние, а наоборот,
СпортивнаяМашина, ГрузоваяМашина и т.д. должны по FK ссылаться на Car .
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38393984
Гхостик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кот Матроскин Каскадные удаления - это вообще большой экстрим, который в реальной жизни встречается крайне редко.Если время жизни сущности и связанной с ней совпадает, почему не сделать каскадное удаление? Например, удаляем фактуру, и все её строки сразу.
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38393990
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГхостикНапример, удаляем фактуру
Да, да, вот так берём и уничтожаем документ строгой отчётности...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38394037
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, насчёт правил удаления это с опытом приходит. Где-то надо каскадно, где-то лучше наллы установить.
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38394044
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГхостикКот Матроскин Каскадные удаления - это вообще большой экстрим, который в реальной жизни встречается крайне редко.Если время жизни сущности и связанной с ней совпадает, почему не сделать каскадное удаление?

Потому что контроля меньше. Если разработчик хочет удалить фактуру со всеми элементами - пусть укажет это явно.
Гораздо лучше получить ошибку constraint-а (потому что разработчик забыл явно удалить все подчиненные элементы), чем молча ошибочно удалить бизнес сущность (потому что разработчик забыл проверить, есть ли у сущности дочерние элементы).
...
Рейтинг: 0 / 0
Один внешний ключ и множество первичных в разных таблицах?
    #38394108
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГхостикКот Матроскин Каскадные удаления - это вообще большой экстрим, который в реальной жизни встречается крайне редко.Если время жизни сущности и связанной с ней совпадает, почему не сделать каскадное удаление? Например, удаляем фактуру, и все её строки сразу.
Потому, что приложения развиваются и их бизнес-логика усложняется. Завтра на эту строку надо будет кинуть внешний ключ, послезавтра - для строк в статусе "зарезервировано" предварительно снять резерв, а строки в статусе "оплачено" вообще удалять только по паролю главбуха. Всё это живёт и дышет среди сотен других "мелочей", и каскадное удаление вносит огромную сумятицу, особенно если программист "современный" и вдобавок не пользуется триггерами.
...
Рейтинг: 0 / 0
51 сообщений из 51, показаны все 3 страниц
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Один внешний ключ и множество первичных в разных таблицах?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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