多个表需要一对多的关系

时间:2011-04-04 11:25:44

标签: sql database-design

我有一个包含多个表的SQL数据库:A,B,C,D。这些表中的实体是完全不同的东西,有不同的列,它们之间有不同的关系。
然而,他们都有一个共同点:在这种情况下,对评论系统的需求将具有相同的结构:author_id,date,content等。

我想知道哪种策略最适合这种模式使用A,.. D表使用注释系统。在一个经典的“博客”网站中,我会在“评论”表中使用一对多的关系与post_id。

这里看起来我需要一个A_comments,B_comments等表来处理这个问题,这看起来有点奇怪。

有更好的方法吗?

5 个答案:

答案 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_typeENUM type)确定我们要链接的对象/表格,
  • object_id(与其他表的主键(或其中最大的表匹配)匹配的无符号整数类型)指向特定表中的确切行。

列结构为:idobject_typeobject_idauthor_iddatecontent等。

重要的是在两个列(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,因此您不必担心冲突。