SQL 中的自引用关系
在数据库模式中,两个表可能会相互引用。然而,考虑这种自引用关系的后果很重要。
如提供的表设计所示,表 products 和 products_pictures 形成循环引用:products.DEFAULT_PICTURE_ID 引用 products_pictures.ID 和 products_pictures .PRODUCT_ID 引用 products.ID。
循环担忧
表之间的循环引用可能会带来复杂性和潜在问题:
缓解选项
避免缺点对于循环引用,请考虑以下选项:
选项 1:可为 Null外键
使外键列之一可为空。这样就可以在一个表中创建记录,而不必先在相关表中创建记录,从而解决了先有鸡还是先有蛋的问题。但是,需要额外的约束来防止无效关系,如提供的示例所示。
选项 2:IsDefault Indicator
将 products 表中的外键替换为products_pictures 表中的布尔列 IsDefault。此方法需要额外的表级约束,以确保每个产品只能指定一张图像作为默认图像。然而,MySQL 不支持此类部分索引约束。
选项 3:可延迟约束
此选项涉及将外键约束的执行推迟到数据插入之后。虽然某些 DBMS 支持此功能,但在 MySQL 中不可用。
选项 4:附加联接表
引入单独的联接表来建立产品和产品之间的关系产品_图片表。这消除了循环引用,并允许将外键声明为非空。
MySQL 总结
在讨论的选项中,MySQL 支持以下两个:
以上是MySQL中如何有效管理SQL数据库中的循环引用?的详细内容。更多信息请关注PHP中文网其他相关文章!