我正在阅读开发人员对Stackoverflow进行问答时最常见的数据库设计错误。最初的答案是关于专有弧的短语:
如果用两个或多个外键创建一个表,并且其中一个只能为非空,则独占弧是一个常见错误。大错。一方面,维护数据完整性变得更加困难。毕竟,即使具有参照完整性,也无法阻止设置两个或多个这些外键(尽管有复杂的检查约束)。
我真的不明白为什么排斥弧是邪恶的。可能我不了解它的基本知识。排他弧线有什么好的解释吗?
我正在阅读开发人员对Stackoverflow进行问答时最常见的数据库设计错误。最初的答案是关于专有弧的短语:
如果用两个或多个外键创建一个表,并且其中一个只能为非空,则独占弧是一个常见错误。大错。一方面,维护数据完整性变得更加困难。毕竟,即使具有参照完整性,也无法阻止设置两个或多个这些外键(尽管有复杂的检查约束)。
我真的不明白为什么排斥弧是邪恶的。可能我不了解它的基本知识。排他弧线有什么好的解释吗?
Answers:
据我很久以前的了解,在一个专有弧中,一个表包含许多列,这些列是其他表的外键,但是一次只能设置其中的一个(由于对域的某些逻辑约束)以下来自现实世界)。由于无法在数据库上强制执行此规则,因此可能会创建损坏的记录,其中多个外键中的一个具有一个值。
我举一个例子。考虑一个公司跟踪其用于运送货物的卡车的应用。卡车只能同时位于三个位置之一:可以与员工一起使用,可以在停车场中或可以在维修店中使用。可以通过创建一个包含employeeId,parkingGarageId和maintenanceShopId的Truck表来建模,并引用Employee,ParkingGarage和MaintenanceShop表。无法强制执行以下规则:仅在数据库级别填写这些字段之一。错误的代码或可以直接访问数据库的人可能会插入一条记录,该记录具有两个或三个填充的字段,这将导致数据库中的数据损坏。
alter table mytable add constraint myconstraint check ((col1 is not null and col2 is null and col3 is null) or (col1 is null and col2 is not null and col3 is null) or (col1 is null and col2 is null and col3 is not null))
。我不喜欢专有弧,但是可以通过检查约束来强制执行。当然也必须存在FK约束。