Вопрос по таблицам в БД

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
louisvuitton
Сообщения: 203
Зарегистрирован: 2014.02.16, 03:09

Вопрос по таблицам в БД

Сообщение louisvuitton »

Возник вопрос.
Допустим есть таблица Газет (newspapaer) и Журналов (magazine),
а также таблица Новостей (news), которые могут принадлежать либо журналу, либо газете.

Следовательно в таблице news есть поля id_magazine, id_newspapaer (внешние ключи на соответствующие id)

Проблема в том, что внешний ключ всегда должен быть и должен указывать на какую-то запись в связной таблице (в immodb)
А тут один из них остается пустой, и бд не дает сохранить запись.

Как правильно организуется такая связь?
Аватара пользователя
Roksalana
Сообщения: 215
Зарегистрирован: 2014.01.14, 09:34

Re: Вопрос по таблицам в БД

Сообщение Roksalana »

Я бы сделала один внешний ключ и поле типа. В зависимости от значения этого поля внешний ключ указывает на одну или другую таблицу. Вот только указать его как внешний ключ будет нельзя, можно только логически его таковым подразумевать. При джоине делать выборку по полю типа и джоинить по ключу с нужной таблицой.
А объединить журналы и газеты в одну таб не получится? Тоже деля их по типу. Общие поля оставить, а различающиеся вынести в связные таблицы.
louisvuitton
Сообщения: 203
Зарегистрирован: 2014.02.16, 03:09

Re: Вопрос по таблицам в БД

Сообщение louisvuitton »

Хорошие идеи, мои мысли такие:
В первом случае, если отказываться от внешнего ключа, тогда вообще смысл в Innodb отпадает, теряется контроль над данными со стороны бд, и можно просто null ставить туда где надо.

Объединять не получится, т.к. связи посложнее (в моем случае у газет и журналов (я их для простоты придумал чтоб вопрос сформулировать
тоже есть связь между собой)

Интересно если ввести в таблицы журналов и газет записи с id = 1, которые будут означать пустую запись.
А потом, если новость - журнал, ставить газетный внешний ключ 1 на эту пустую запись,
а если новость газета, журнальный ключ = 1.
(при работе с газетами\журналами в afterfind можно удалять эту запись, чтоб не путалась, где не надо)

Это жесткий костыль или нормально?
Аватара пользователя
valentinich
Сообщения: 171
Зарегистрирован: 2014.03.25, 13:58

Re: Вопрос по таблицам в БД

Сообщение valentinich »

Как вариант, ввести еще 2 таблицы newspapaer_has_news и magazine_has_news
1. newspapaer_has_news (newspapaer_id, news_id)
2. magazine_has_news (magazine_id, news_id)
Тяжела и неказиста жизнь простого программиста :|
Ответить