想象一下以下数据库:
表“公司”具有字段 id、名称和旗舰产品 ID。表“产品”具有字段 id、name 和 company_id。
一个公司必须有一个旗舰产品(1:1 关系),所有产品都有一个公司(1:N 关系)。
使用 MyISM 等存储引擎时,上述场景应该没有任何问题,但使用 InnoDB 等引擎时,INSERTing new data 时会出现问题。
除了允许初始 INSERT 的 NULL 关系之外,还有什么好的解决方案?
总而言之,一家公司必须有一个旗舰产品。
想象一下以下数据库:
表“公司”具有字段 id、名称和旗舰产品 ID。表“产品”具有字段 id、name 和 company_id。
一个公司必须有一个旗舰产品(1:1 关系),所有产品都有一个公司(1:N 关系)。
使用 MyISM 等存储引擎时,上述场景应该没有任何问题,但使用 InnoDB 等引擎时,INSERTing new data 时会出现问题。
除了允许初始 INSERT 的 NULL 关系之外,还有什么好的解决方案?
总而言之,一家公司必须有一个旗舰产品。
您要么必须在旗舰产品中允许 NULL,要么重新考虑如何模拟这种情况。考虑将旗舰产品作为产品的布尔字段。那么你就没有循环依赖了。或者在产品上有一个 product_type 字段,该字段可能具有 FLAGSHIP 或 NORMAL 或 OBSOLETE 等值。当然,您必须强制执行,但过去我发现它是解决此类问题的更清洁的方法。
我建议使用以下数据模型:
公司
产品
旗舰_产品
在表中创建 FLAGSHIP 列PRODUCTS
并不能确保只有一种产品是给定公司的旗舰产品,因为:
我不知道那个特定的数据库引擎,但是寻找一种在原子插入和更新操作期间临时暂停数据一致性检查或引用完整性的方法。
为什么不将旗舰产品字段作为布尔值放入产品表中...您可以索引该产品和 companyid 并进行快速查找
唯一能够正确处理此类情况的智能和强大的产品是完全接受/实施多重分配概念的系统。
在那个联盟中没有一个单一的 SQL 系统。
编辑
SQL 系统延迟了约束检查,但使用它会变得混乱。
这是可能的解决方法的概述。我不确定这在 Kludge 量表上有多高,但它就在那里。
此后,每当创建客户或产品时,如果尚未创建正确引用的产品/公司,则初始化新项目以指向虚拟占位符。接下来,您输入该项目,并通过更新第一个条目来完成。
好处是,一旦数据库初始化例程完成,您就具有绝对的引用完整性——并且您只在可能非常受控的情况下运行一次,因此请仔细观察并确保它不会失败!不利的一面是,您现在在每个表中都有一个“额外”项目,使您的系统变得混乱。
您需要通过将参考完整性约束之一推迟到事务结束来打破循环。
请用谷歌搜索“最初延期延期”。
(不确定 InnoDB 是否支持这个)