powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Один внешний ключ и множество первичных в разных таблицах?
25 сообщений из 51, страница 2 из 3
Один внешний ключ и множество первичных в разных таблицах?
    #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
25 сообщений из 51, страница 2 из 3
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Один внешний ключ и множество первичных в разных таблицах?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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