我有一个包含多个表的SQL数据库:A,B,C,D。这些表中的实体是完全不同的东西,有不同的列,它们之间有不同的关系。
然而,他们都有一个共同点:在这种情况下,对评论系统的需求将具有相同的结构:author_id,date,content等。
我想知道哪种策略最适合这种模式使用A,.. D表使用注释系统。在一个经典的“博客”网站中,我会在“评论”表中使用一对多的关系与post_id。
这里看起来我需要一个A_comments,B_comments等表来处理这个问题,这看起来有点奇怪。
有更好的方法吗?
答案 0 :(得分:14)
使用comment
主键和评论的各种属性创建comment_id
表。
此外,请创建A_comment
:
CREATE TABLE A_comment (
comment_id PRIMARY KEY REFERENCES comment(comment_id),
A_id REFERENCES A(A_id)
)
同样适用于B,C和D.这可确保comment
与所有其他表之间的参照完整性,如果将ID直接存储在A,B,C和D中,则无法执行此操作。 {1}}。
将comment
声明为主键可确保注释只能属于A中的一个条目。它不会阻止注释属于A中的条目和B中的条目,但只有这样你可以通过外键实现很多目标;这将需要数据库级约束,我知道没有数据库支持。
这种设计也不能阻止孤立的评论,但我想不出任何方法可以在SQL中阻止这种情况,当然,除了你想要避免的事情之外:创建多个评论表。
答案 1 :(得分:4)
我有一个类似的“问题”,包含更多不同对象类型的评论(例如我的案例中的文章和商店,每种类型都有自己的表格)。
我做了什么:在我的评论表中,我有两列管理链接:
object_type
(ENUM type)确定我们要链接的对象/表格,object_id
(与其他表的主键(或其中最大的表匹配)匹配的无符号整数类型)指向特定表中的确切行。列结构为:id
,object_type
,object_id
,author_id
,date
,content
等。
重要的是在两个列(object_type, object_id)
上都有一个索引,以便快速建立索引。
答案 2 :(得分:3)
我认为你所说的是一个带有外键的注释表,而“恰好是A,B,C或D中的一个。”
SQL无法处理这个问题是它的一个基本弱点。这个问题一遍又一遍地被问到。
参见,例如
What is the best way to enforce a 'subset' relationship with integrity constraints
您的约束是从“单个注释”表到视图的“外键”,它是A,B,C和D中标识符的并集.SQL只支持将外键存入基表。
观察SQL作为一种语言确实以CREATE ASSERTION的形式支持您的情况。但是,我知道没有支持该语句的SQL产品。
EDIT 您还应该记住,使用“单个”注释表,您可能需要在A,B,C和D中的密钥之间强制执行不相交,否则可能会在某个时间注释自动在实体之间“共享”时发生来自不同表格的事件,这可能是不可取的。
答案 3 :(得分:1)
你可以有一个评论表,并且在该表中有一个列,该列包含区分评论所属表的值 - 即该列中的1表示它是表A的注释,2表示表B,等等上。如果你不想在评论表中有“魔术数字”,你可以有另一个只有两列的表:一个有数字,另一个详细说明数字所代表的表。
答案 4 :(得分:0)
您不需要为每个其他人提供单独的评论表,一个就足够了。每条评论都有一个唯一的ID,因此您不必担心冲突。