6

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

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

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

4

6 回答 6

4

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

如果这是排他性和强制性的,则需要添加一个检查约束,要么为空,但不能同时为空。

于 2009-03-24T00:56:32.883 回答
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)

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

于 2009-03-24T00:58:31.113 回答
1

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

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

如果我是正确的,您将必须有两个外键,一个用于 CATEGORY 表,另一个用于 TOPIC,并且都需要为空。

于 2009-03-24T00:55:47.173 回答
1

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

创建表topics_categories(id号,描述varchar2(100),item_type char(1));--C 或 T

然后是topics_categories的单个外键

于 2009-03-24T00:58:29.990 回答
0

最好的方法是使用继承。您将拥有“Posts”的两个特化:“Posts_Category”和“Posts_Topic”两者都有“post_id”(与父表“Posts”相关)和另一个字段:

“Category_ID”(“Posts_Category”)

“Topic_ID”(“Posts_Topic”)

如果这听起来令人困惑,请查看他们的文档中的 Doctrine (PHP ORM):http: //www.doctrine-project.org/documentation/manual/1_0/en/inheritance

于 2009-03-24T00:57:17.483 回答
0

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

于 2009-03-24T00:57:33.847 回答