针对1对多对多关系的更好的数据库设计?

时间:2011-11-02 00:14:21

标签: database design-patterns

我目前遇到一个问题,并想知道是否存在更好的解决方案。最初我有三个实体,A,B和X.他们的关系如下。

  • A-B:1对多
  • A-X:1对多
  • B-X:1对多

例如,A中的一行可能与B和X中的许多行相关联。此外,B中的一行可能在X中有许多其他关联的行。

我考虑过的一些选项:

  1. 复制X

    所以我们有A-B,A-X1和B-X2,其中X1和X2是相同的,只是不同的表名。

  2. 使用多态关联

    X现在有两列 parent_id ,表示与哪个表A或B相关联。

  3. 反转多态关联

    创建另外两个表AX和BX。这段关系很简单。

    A - AX - X - BX - B

  4. 为X使用额外的外键。

    X现在有两列, A_id B_id 。如果行与A关联,则 B_id 为空。如果某行与B相关联,则 A_id = A.id且 B_id = B.id。

  5. 当然,他们都有权衡。我想知道是否有更好的解决方案来解决这个问题。请建议您认识的任何人。

    谢谢!

1 个答案:

答案 0 :(得分:1)

我认为#3是你最好的选择。这种关系的常见数据库建模术语是Junction Tables。这是在表之间创建多对多关系的一种非常简洁的方法。正如你所说:

  

这种关系很简单。

使用联结表,您不需要使用重复项(#1)或创建标志,指示将其链接到哪个表(#2),#4看起来与#2略有不同。

许多db建模器会对额外的连接产生影响,但只要正确设置了索引,模型就会具有高性能。如果您厌倦了写出联接,请创建一些视图。

相关问题