我的数据库设计以前是相当线性的,所以我很难解决可能很容易解决的问题。
我有一个“POSTS”表,其中包含可能是“CATEGORY”或“TOPIC”子项的帖子。定义“POSTS”表的外键的最佳方法是什么?
我想我可以有一个名为POST_CATEGORY_ID的列和一个名为“POST_TOPIC_ID的字段,该字段可以为空,但这听起来不对。当然有一个我想念的简单解决方案!
答案 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)
如果要在数据库中定义外键,那么您建议的解决方案听起来是正确的。我还建议在触发器中编写一些代码,以确保两个字段都不为空。