Несколько Внешних Ключей
мои проекты баз данных ранее были довольно линейными, поэтому я в тупике, что, вероятно, очень легко решить проблему.
У меня есть таблица "сообщений", в которой содержатся сообщения, которые могут быть дочерними для "категории" или "темы". Каков был бы лучший способ определить внешний ключ(ы) для таблицы "сообщения"?
Я полагаю, что у меня может быть столбец с именем POST_CATEGORY_ID и поле с именем "POST_TOPIC_ID, которое может быть nullable, но это просто не звучит правильно. Конечно, есть простое решение, которого мне не хватает!
6 ответов
вы можете сделать отношения "многие ко многим" между сообщением и категорией и сообщением и темой:
POST
----
ID
Text ...
...
CATEGORY
--------
ID
Name
TOPIC
-----
ID
Name
POST_CATEGORY
-------------
POST_ID (FK)
CATEGORY_ID (FK)
POST_TOPIC
----------
POST_ID (FK)
TOPIC_ID (FK)
таким образом, сообщение может быть связано с любым количеством категорий и тем.
вы на правильном пути с полями nullable POST_CATEGORY_ID и POST_TOPIC_ID. Это будет моделировать, что сообщение необязательно связано с категорией и необязательно связано с темой.
Если это должно быть исключительным и обязательным, вам нужно будет добавить контрольное ограничение, которое либо равно null,но не оба.
Я думаю, что объявление внешнего ключа может ссылаться только на одну таблицу:
FOREIGN KEY(CATEGORY_ID) REFERENCES CATEGORY(CATEGORY_ID);
FOREIGN KEY(TOPIC_ID) REFERENCES TOPIC(TOPIC_ID);
если я прав, у вас должно быть два внешних ключа, один для таблицы категорий, а другой для темы, и оба должны быть nullable.
Как насчет наличия категорий и тем в одной таблице
создать таблицы topics_categories( идентификационный номер, описание varchar2(100), item_type char (1)); --C или T
затем один внешний ключ к topics_categories
лучший способ-использовать наследование. У вас будет две специализации "Posts": "Posts_Category" и " Posts_Topic" Оба имеют " post_id "(который относится к родительской таблице" Posts") и другое поле:
"Category_ID" ("Posts_Category")
"Topic_ID" ("Posts_Topic")
Если это звучит запутанно, посмотрите на доктрину (PHP ORM) в их документации: http://www.doctrine-project.org/documentation/manual/1_0/en/inheritance
Если вы хотите определить внешние ключи в базе данных, решение, которое ты предлагаешь, звучит правильно. Я также предлагаю написать некоторый код в триггере, чтобы убедиться, что оба поля не равно null.