【问题标题】:A better db design for 1-to-many-to-many relationship?一对多对多关系的更好的数据库设计?
【发布时间】:2011-11-02 00:14:20
【问题描述】:

我目前遇到一个问题,想知道是否有更好的解决方案来解决这种情况。最初我有三个实体,A、B 和 X。它们的关系如下。

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

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

我考虑过的一些选项:

  1. 复制 X

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

  2. 使用多态关联

    X 现在有两列 parentparent_id 指示行与哪个表 A 或 B 相关联。

  3. 反转多态关联

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

    A--AX--X--BX--B

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

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

当然,它们都有权衡取舍。我想知道这个问题是否有更好的解决方案。请推荐任何你认识的人。

谢谢!

【问题讨论】:

    标签: database design-patterns


    【解决方案1】:

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

    关系很简单。

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

    许多数据库建模者会对额外的连接感到恼火,但只要您的索引设置正确,模型就会表现出色。如果您厌倦了写出联接,请创建一些视图。

    【讨论】:

    • 谢谢,保罗。如果不使用选项#3,那么您认为哪个选项是下一个候选者?问题是我必须尝试减少连接语句的数量。
    • 在这种情况下,#4 听起来像是下一个最干净的,但 #3 会进一步减少您的连接。为什么要担心加入的数量?
    • 我认为 #4 也是次佳。谢谢!实际上,该设计稍后将主要由报告团队使用,而不是开发人员。由于历史原因,他们对分布在多个表中的数据感到不舒服。报告团队的设计过程是我们提出一个严格规范化的设计,然后他们对其进行评论以适应他们的需要(主要是非规范化设计)。因此,我们通常会使用/违反一些反模式,如 EAV 或多态关联。但是团队接受了权衡,所以我们同意了。
    • 有趣。感谢您的反馈!
    猜你喜欢
    • 2012-09-30
    • 2011-05-01
    • 2011-04-13
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多