多个外键

时间:2009-03-24 00:49:25

标签: database-design normalization

我的数据库设计以前是相当线性的,所以我很难解决可能很容易解决的问题。

我有一个“POSTS”表,其中包含可能是“CATEGORY”或“TOPIC”子项的帖子。定义“POSTS”表的外键的最佳方法是什么?

我想我可以有一个名为POST_CATEGORY_ID的列和一个名为“POST_TOPIC_ID的字段,该字段可以为空,但这听起来不对。当然有一个我想念的简单解决方案!

6 个答案:

答案 0 :(得分:4)

你在可靠的POST_CATEGORY_ID和POST_TOPIC_ID字段的正确轨道上。这将模拟帖子可选地与类别相关并且可选地与主题相关。

如果这是独占和强制性的,则需要添加一个检查约束,该约束可以为null,但不能同时为两者。

答案 1 :(得分:2)

你可以在POST和CATEGORY以及POST和TOPIC之间建立多对多的关系:

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)

这样,帖子可以与任意数量的类别和主题相关联。

答案 2 :(得分:1)

我认为外键声明只能引用一个表:

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

如果我是正确的,你必须有两个外键,一个用于CATEGORY表,另一个用于TOPIC,两者都需要可以为空。

答案 3 :(得分:1)

如何在同一个表格中使用类别和主题

创建表topic_categories(     身份证号码,     description varchar2(100),     item_type char(1)); --C或T

然后是topic_categories

的单个外键

答案 4 :(得分:0)

最好的方法是使用继承。 您将有两个“帖子”专业:“Posts_Category”和“Posts_Topic” 两者都有“post_id”(与父表“帖子”有关)和另一个字段:

“Category_ID”(“Posts_Category”)

“Topic_ID”(“Posts_Topic”)

如果这听起来很混乱,请查看Doctrine(PHP ORM)的文档: http://www.doctrine-project.org/documentation/manual/1_0/en/inheritance

答案 5 :(得分:0)

如果要在数据库中定义外键,那么您建议的解决方案听起来是正确的。我还建议在触发器中编写一些代码,以确保两个字段都不为空。