【问题标题】:How to avoid circular dependency here如何在这里避免循环依赖
【发布时间】:2016-08-09 08:07:32
【问题描述】:

我有两张桌子;为了简化示例,我们称它们为lawnmowerlawn

  • 割草机总是在修剪草坪。
  • 多台割草机可以割同一块草坪。
  • 草坪只有一台割草机负责该草坪。
  • 然而,一台割草机可以同时负责 3 个草坪 时间。

直观的解决方案:

  • 让割草机参考它正在割的草坪
  • 让草坪参考负责的割草机

这给出了循环依赖。避免这种情况的最佳解决方案是什么?我目前正在考虑使用带有外键的responsiblefor 桌子和草坪和割草机。然而,这使得多台割草机可以负责同一块草坪,这在以前是不可能的。

【问题讨论】:

  • 循环依赖的 OOP 问题不适用于数据库。您的直观解决方案没有任何问题。
  • 直觉上这也是不可能的。没有另一个就不能存在。我永远无法创建我的第一台草坪或割草机,因为它们需要彼此存在。
  • 这就是交易的用途。
  • 然后我想到了一个问题:那是好的设计吗,什么时候可以避免?
  • 为了强制执行完整性,您仍然需要将事务与任何其他设计一起使用。如果它只允许记录有效数据,同时易于操作和查询,这是一个很好的设计。在这种情况下,我相信它可以与其他设计进行比较。避免非问题对我来说并不重要。

标签: sql database database-design database-schema


【解决方案1】:

首先,您需要一个联结表,因为这基本上是一个 n-m 关系。这张桌子每台割草机和每片草坪都有一排(我会称之为LawnmowerLawns 或类似的名称)。

现在处理要点:

  • 第一个要求在此表中为每台割草机设置一行。这可以通过大多数数据库中的触发器来处理。可能还有其他解决方案。
  • 第二个由联结表处理。
  • 第三个是通过在表中使用一个标志来处理的,以表示每个草坪的“主要”割草机。这可以通过触发器或其他机制强制执行。
  • 第四个需要触发器(依赖关系通常需要触发器)。

【讨论】:

  • 听起来我在正确的轨道上。唯一不同的是,我保留了使用割草机修剪草坪的参考,仅使用连接表来映射责任。将其包含在联结表中是否有任何论据?
  • 由于我们要处理两个不同的谓词(lawnmower mows lawnlawnmower is responsible for lawn),我建议使用两个单独的关系表。这允许我们使用 PK 或唯一键来执行关系基数。
猜你喜欢
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
  • 2013-04-02
  • 2020-11-11
  • 2012-08-10
  • 1970-01-01
相关资源
最近更新 更多