【问题标题】:Why don't database systems support 1:M and 1:1 relationships directly?为什么数据库系统不直接支持 1:M 和 1:1 关系?
【发布时间】:2019-08-01 02:03:09
【问题描述】:

我正在浏览关系数据库,有人提到只有物理数据模式。

1:C (0 OR 1) 和 1:MC (>=1)

在所有关系数据库中都受支持。两者都不支持

1:M 和 1:1

直接关系。我无法理解为什么它不支持。任何帮助将不胜感激

【问题讨论】:

  • 请注明并引用您的来源。有许多不同的设计方法。关系数据库或 ERM 设计通过具有 n 个属性/列的关系/表来表示 n 元关系/关系/关联。不了解关系模型或 ERM 的方法/工具/演示文稿错误地将 FK(外键)和关系中的实体的参与称为“关系”。 (您可以在“物理”上找到类似的混淆。)

标签: database-design relational-database data-modeling


【解决方案1】:

我相信您是在询问强制参与参照完整性的问题。原则上,RDBMS 可以支持在约束的“两侧”都是强制性的引用完整性约束,并且有些确实允许这样做。

使用教程 D 语法:

CONSTRAINT non_empty_order (ORD{ordnum} = ORDITEM{ordnum});

此完整性约束要求每个订单必须在 ORDITEM 表中至少有一行,在 ORD 表中至少有一行。因此,两个表都必须存在任何给定的序号。

在 SQL DBMS 中,等效的完整性约束是:

CREATE ASSERTION non_empty_order CHECK
(NOT EXISTS (SELECT ordnum FROM ORD EXCEPT SELECT ordnum FROM ORDITEM) AND
 NOT EXISTS (SELECT ordnum FROM ORDITEM EXCEPT SELECT ordnum FROM ORD));

很遗憾,大多数 SQL DBMS 不支持 ASSERTION。即使他们这样做了,SQL 也有另一个限制,阻碍了使用此类约束。大多数 SQL DBMS 通常不允许您同时更新多个表(称为 多重赋值 的功能),因此当多个表以这种方式受到约束时,它们通常不能在不禁用约束的情况下更新更新持续时间。

由于这些限制,大多数 SQL 数据库设计人员将坚持使用 SQL 的 FOREIGN KEY 约束语法来进行引用约束。在 SQL 中,FOREIGN KEY 约束不需要引用方的强制参与:

ALTER TABLE ORDITEM ADD CONSTRAINT fk_order FOREIGN KEY (ordnum) REFERENCES ORD (ordnum);

此约束要求 ORDITEM 中的每个 ordnum 都必须具有相应的订单,但不会阻止创建空订单(即 ORD 中的 ordnum 但 ORDITEM 中没有对应的 ordnum)。

在过去 20 年左右的时间里,SQL DBMS 对完整性约束的支持并没有太大改善。它的局限性已成为许多数据库设计人员的第二天性,他们养成了忽略不适合 SQL 模型的业务规则的习惯。更复杂的规则往往在应用程序、规则引擎或数据库过程中实现,因此 DBMS 供应商没有太多理由改进引擎级对引用完整性的支持。

【讨论】:

  • 一些 SQL 系统允许将约束检查推迟到提交时间。这绕过了一些限制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
  • 2011-06-12
  • 1970-01-01
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多