Несколько Внешних Ключей

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

У меня есть таблица "сообщений", в которой содержатся сообщения, которые могут быть дочерними для "категории" или "темы". Каков был бы лучший способ определить внешний ключ(ы) для таблицы "сообщения"?

Я полагаю, что у меня может быть столбец с именем 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.