我的数据库设计以前是相当线性的,所以我对可能很容易解决的问题感到困惑。
我有一个“POSTS”表,其中包含可能是“CATEGORY”或“TOPIC”子项的帖子。为“POSTS”表定义外键的最佳方法是什么?
我想我可以有一个名为 POST_CATEGORY_ID 的列和一个名为“POST_TOPIC_ID”的字段,它可以为空,但这听起来不对。当然,我缺少一个简单的解决方案!
我的数据库设计以前是相当线性的,所以我对可能很容易解决的问题感到困惑。
我有一个“POSTS”表,其中包含可能是“CATEGORY”或“TOPIC”子项的帖子。为“POSTS”表定义外键的最佳方法是什么?
我想我可以有一个名为 POST_CATEGORY_ID 的列和一个名为“POST_TOPIC_ID”的字段,它可以为空,但这听起来不对。当然,我缺少一个简单的解决方案!
您在可以为空的 POST_CATEGORY_ID 和 POST_TOPIC_ID 字段的正确轨道上。这将模拟帖子可选地与类别相关并且可选地与主题相关。
如果这是排他性和强制性的,则需要添加一个检查约束,要么为空,但不能同时为空。
您可以在 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)
这样,帖子可以与任意数量的类别和主题相关联。
我认为外键声明只能引用一个表:
FOREIGN KEY(CATEGORY_ID) REFERENCES CATEGORY(CATEGORY_ID);
FOREIGN KEY(TOPIC_ID) REFERENCES TOPIC(TOPIC_ID);
如果我是正确的,您将必须有两个外键,一个用于 CATEGORY 表,另一个用于 TOPIC,并且都需要为空。
如何将类别和主题放在同一个表中
创建表topics_categories(id号,描述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”)
如果这听起来令人困惑,请查看他们的文档中的 Doctrine (PHP ORM):http: //www.doctrine-project.org/documentation/manual/1_0/en/inheritance
如果您想在数据库中定义外键,您建议的解决方案听起来不错。我还建议在触发器中编写一些代码,以确保两个字段都不为空。