为什么数据库系统不直接支持1:M和1:1关系?

问题描述 投票:2回答:1

我正在通过关系数据库,它被提到只有物理数据模式。

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

所有关系数据库都支持。它不支持两者

1:M和1:1

关系直接。我无法理解它为什么不支持。任何帮助将受到高度赞赏

database-design relational-database data-modeling
1个回答
2
投票

我相信你问的是强制参与参照完整性。原则上,RDBMS可以支持约束的“双方”强制的参照完整性约束,并且一些允许这样做。

使用Tutorial D语法:

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

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

在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供应商没有太多理由改进引擎级别对引用完整性的支持。

© www.soinside.com 2019 - 2024. All rights reserved.