【问题标题】:Entity-relationship model with one-to-many crossed relationships between entities. Is it wrong?实体之间具有一对多交叉关系的实体关系模型。这是错的吗?
【发布时间】:2017-07-21 03:06:28
【问题描述】:

我正在建模一个数据库,其中有两个交叉关系。该模型看起来不错,但我不知道如何将其转换为关系模型,因为会有两个关系引用递归(如果那是正确的词)。

Entity-relationship model(我省略了这些属性,因为它们没有提供有用的信息)

这就是它的模型:一个生物可以生育 N 次,同时在一次生育中可能会出生多个生物。

我知道在关系模型中,必须先定义关系,然后才能引用它,所以我不知道如何解决这个问题。

编辑:正如 sqlvogel 正确指出的那样,我的模型没有多大意义。为了实用,在 Birth 一侧出生的基数应该是 0..1,因此允许存储“没有父母”的第一层存在。这也应该解决可延迟约束的问题,即使它不是以最优雅的方式。

【问题讨论】:

  • 当定义的各个部分相互定义或定义它们自己时,定义是递归的。在这里,我们只有两个同时存在的约束。 (FK,称为关系,但不是。)它们引用彼此的表。但是没有相互/自我定义。例如,如果我说,表 T 和 U 必须相等,您不会称其为约束的递归定义,它不是值的定义,即使您无法在不更改的情况下更改另一个。

标签: database-design relational-database


【解决方案1】:

这种递归设计本身并没有错。在您的特定示例中,如果您的意图是为 parentage 建模,那么它似乎没有实际意义,因为(除非一个“存在”自己出生)它肯定需要无数次出生并且数据库中的生物。另一方面,您的描述表明您实际上只是在模拟出生而不是亲子关系,在这种情况下,您的模型可能是合理的。

某些 DBMS 确实允许您一次性创建整个架构,因此您不必先创建一个关系再创建另一个关系。如果做不到这一点,应该可以在没有引用约束的情况下创建关系,然后再添加约束。

如果您使用的是 SQL DBMS,则在使用您创建的表时可能会出现另一个潜在问题。在标准 SQL 中,一次只能插入数据或更新数据一个表。填充两个相互依赖的表的标准方法是使用称为“可延迟约束”的功能,这意味着在事务提交时而不是在语句边界处评估约束。并非所有 DBMS 都支持可延迟约束功能,许多数据库设计人员更愿意避免使用它。

【讨论】:

    猜你喜欢
    • 2013-03-27
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 2022-01-05
    • 2018-04-29
    相关资源
    最近更新 更多