代码之家  ›  专栏  ›  技术社区  ›  LiraNuna

数据库设计:循环依赖

  •  8
  • LiraNuna  · 技术社区  · 15 年前

    想象一下以下数据库:

    表'companies'包含字段ID、名称和旗舰产品ID。 表'products'具有字段ID、名称和公司ID。

    一个公司必须有一个旗舰产品(1:1关系),所有产品都有一个公司(1:N关系)。

    当使用myism这样的存储引擎时,上面的场景不应该有任何问题,但是当使用innodb这样的引擎时,插入新数据时会产生问题。

    除了允许初始插入的空关系之外,什么是好的解决方案?

    总而言之,一家公司 必须 旗舰产品。

    7 回复  |  直到 13 年前
        1
  •  1
  •   Jason Kleban    15 年前

    我不知道特定的数据库引擎,但在您的原子插入和更新操作期间,寻找一种临时挂起数据一致性检查或引用完整性的方法。

        2
  •  5
  •   cletus    15 年前

    你要么在旗舰产品中允许空值,要么重新考虑如何建模这种情况。考虑将旗舰产品作为产品的布尔字段。那么你就没有循环依赖了。或者在产品上有一个“产品类型”字段,该字段可能具有旗舰、普通或过时等价值。当然,你必须强制执行,但在过去,我发现它是解决这类问题的一个更清洁的方法。

        3
  •  3
  •   OMG Ponies    15 年前

    我建议使用以下数据模型:

    公司

    • 公司PK

    产品

    • 产品标识(PK)
    • 公司会员(FK)

    旗舰产品

    • 公司ID(pk,fk)
    • 产品标识(FK)

    在中创建旗舰列 PRODUCTS 表不能确保只有一种产品是给定公司的旗舰产品,因为:

    • 旗舰列上的唯一键要求值彼此不同
    • 检查约束只是可接受值的列表
        4
  •  2
  •   David    15 年前

    为什么不将旗舰产品字段作为布尔值放入产品表中呢?你可以为它和CompanyID编制索引,然后快速查找

        5
  •  1
  •   Erwin Smout    15 年前

    唯一能够正确处理此类情况的智能和强大产品是完全接受/实施多重分配概念的系统。

    在那个联盟中没有一个SQL系统。

    编辑

    SQL系统已经延迟了约束检查,但是使用它可能会变得混乱。

        6
  •  0
  •   Philip Kelley    15 年前

    这是一个可能的工作大纲。我不知道这个克卢吉比例有多高,但它就在上面。

    • 创建数据库
    • 创建客户机和产品表
    • 在每一行中插入一个占位符或“虚拟”行,配置为相互引用
    • 在 桌子

    此后,每当创建客户或产品时,如果尚未创建适当的参考产品/公司,则初始化新项目以指向虚拟标语。接下来输入该项目,并通过更新第一个条目来完成。

    好处是,一旦数据库初始化例程完成,您就拥有绝对的引用完整性——并且您大概只在 非常 控制环境,所以仔细观察,确保它不会失败!不坏的一面是,您现在在每个表中都有一个“额外”项目,使您的系统混乱不堪。

        7
  •  0
  •   Branko Dimitrijevic    13 年前

    你需要打破这个循环 推迟 在事务结束之前,引用完整性约束之一。

    请谷歌搜索“最初延期可延期”。

    (不确定InnoDB是否支持)