2009-03-24 5 views
6

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

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

Я полагаю, я мог бы иметь столбец с именем POST_CATEGORY_ID и поле с именем «POST_TOPIC_ID, который может быть обнуляемым, но это просто не звучит. Конечно, есть простое решение, которое я пропускаю!

ответ

2

Вы могли бы сделать многие-ко-многим между POST и категории и POST и темы:

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) 

Таким образом, пост может быть связано с любым количеством категорий и тем.

+0

Это звучит более расширяемо - по крайней мере, с точки зрения промежуточного стола, но разве это не просто снимает только мои столбцы с нулевым значением из таблицы POSTS и создает из них новую таблицу? – 2009-03-24 01:13:58

+0

Я думаю, что вам не понадобятся никакие значения NULL, если вы это сделаете. Вы только вставляете запись в таблицу «многие ко многим», если существует связь –

+0

Подождите минуту - я думаю, что я следую сейчас. Итак, в будущем, скажем, у меня есть новая таблица под названием BOOKS, для которой требуются дочерние POSTS, я просто добавляю таблицу POST_BOOK с внешними ключами в POSTS и BOOKS? – 2009-03-24 01:20:42

1

Я думаю, что внешний ключ объявление может относиться только к одной таблице:

FOREIGN KEY(CATEGORY_ID) REFERENCES CATEGORY(CATEGORY_ID); 
FOREIGN KEY(TOPIC_ID) REFERENCES TOPIC(TOPIC_ID); 

Если я правильно, вы будете иметь два внешние ключи, один за стол КАТЕГОРИИ, а другой для темы, и обе потребности

4

Вы на правильном пути с остроумием h nullable POST_CATEGORY_ID и POST_TOPIC_ID поля. Это позволит моделировать, что сообщение, возможно, связано с категорией и необязательно связано с темой.

Если это должно быть эксклюзивным и обязательным, вам нужно добавить ограничение проверки, которое равно null, но не для обоих.

+0

Вещь, которая беспокоит меня об этом, заключается в том, что, если что-то еще позже содержит POSTS? Я должен был бы изменить таблицу для поддержки другого столбца с нулевым значением, который ссылается на новую таблицу. Я не застрахован от этого, кажется, что-то не так. – 2009-03-24 01:11:52

0

Лучший способ - использовать Наследование. Вы будете иметь две специализации «Сообщения»: «Posts_Category» и «Posts_Topic» Оба имеют «post_id» (который относится к родительской таблице «Сообщения») и другое поле:

«CATEGORY_ID» («Posts_Category»)

"Topic_ID" ("Posts_Topic")

Если это звучит путать взгляд на доктрины (PHP ORM) в их документации: http://www.doctrine-project.org/documentation/manual/1_0/en/inheritance

0

Если вы хотите, чтобы определить внешние ключи в базе данных, решение, которое вы предлагаете звучит правильно. Я также предлагаю написать код в триггере, чтобы убедиться, что оба поля не равны нулю.

1

Как о том, категории и темы в той же таблице

создать таблицу topics_categories (номер И.Д., описание varchar2 (100), item_type символ (1)); -С или T

Тогда один внешний ключ topics_categories

Смежные вопросы