Database design 多个外键

Database design 多个外键,database-design,normalization,Database Design,Normalization,我的数据库设计以前是相当线性的,所以我被一个很容易解决的问题难住了 我有一个“帖子”表,其中包含的帖子可能是“类别”或“主题”的子帖子。为“POSTS”表定义外键的最佳方法是什么 我想我可以有一个名为POST\u CATEGORY\u ID的列和一个名为“POST\u TOPIC\u ID”的字段,这可能是空的,但这听起来不太正确。肯定有一个我缺少的简单解决方案!我认为外键声明只能引用一个表: FOREIGN KEY(CATEGORY_ID) REFERENCES CATEGORY(CATEGO

我的数据库设计以前是相当线性的,所以我被一个很容易解决的问题难住了

我有一个“帖子”表,其中包含的帖子可能是“类别”或“主题”的子帖子。为“POSTS”表定义外键的最佳方法是什么


我想我可以有一个名为POST\u CATEGORY\u ID的列和一个名为“POST\u TOPIC\u ID”的字段,这可能是空的,但这听起来不太正确。肯定有一个我缺少的简单解决方案!

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

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

如果我是正确的,您必须有两个外键,一个用于类别表,另一个用于主题,并且两者都需要可为空。

您使用可为空的POST\u CATEGORY\u ID和POST\u TOPIC\u ID字段是正确的。这将建模一篇文章可以选择与类别相关,也可以选择与主题相关


如果这是排他性和强制性的,则需要添加一个检查约束,该约束要么为null,要么为null。

最好的方法是使用继承。 您将有两种“帖子”的专门化:“帖子\类别”和“帖子\主题” 两者都有“post_id”(与父表“Posts”相关)和另一个字段:

“类别ID”(“职位类别”)

“主题ID”(“帖子主题”)

如果这听起来令人困惑,请查看其文档中的条令(PHP ORM):

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

将类别和主题放在同一个表中如何

创建表格主题和类别( 身份证号码, 说明varchar2(100), 项目_类型字符(1));--C或T


然后,只需一个主题和类别的外键,就可以在帖子和类别以及帖子和主题之间建立多对多关系:

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)

通过这种方式,一篇文章可以与任意数量的类别和主题关联。

让我困扰的是,如果以后有其他内容包含文章怎么办?我必须修改该表以支持引用新表的另一个可为空的列。我也不能不这样做,它似乎不知怎么地关闭了。这听起来更像是tensible-至少从中间表的角度来看,但这不就是从POSTS表中取出我的可空列并用它们创建一个新表吗?我认为如果这样做,您不需要任何可空项。如果关系存在一分钟,您只需在多对多表中插入一条记录-我想我现在就明白了。所以,在未来,假设我有一个名为BOOKS的新表,它需要子帖子,我只是添加了一个名为POST_BOOK的表,其中包含POST和BOOKS的外键?是的,通过这种方式,您可以添加任意多个关系,而无需接触现有的表。但需要注意的一点是多对多关系。您可能不会ways需要多对多关系。(例如,一篇文章可能只有一个类别,而不是多个类别)(续)…您可以通过编写代码的方式解决这个问题,或者您可以在多对多表的适当列上设置唯一约束,以便一篇文章只能有一个类别,等等。