在包含三个表(地区、国家和州)的数据库架构中,存在层次关系,其中国家可以位于区域和国家内的可能存在于区域或国家内。这在尝试创建第四个表popular_areas(其中包含region_id和popular_place_id列)时提出了挑战,其中后者应该引用在国家或州中找到的地点。
多态关联的概念本身就是解决这一困境的潜在解决方案。本质上,这个想法涉及建立一个外键列,该外键列引用一组可能的目标表中相应的 id 值。但是,此策略需要包含一个附加列,用于指定哪个目标表保存引用的值。
就目前情况而言,SQL 约束不支持多态关联的实现,因为外键约束限制对单一目标表。 Rails 和 Hibernate 等框架提供对多态关联的支持,但需要停用 SQL 约束才能促进此功能。为了代替此类约束,框架通过验证外键值与允许的目标表中的条目是否一致来承担确保引用完整性的责任。
尽管它们很有吸引力,多态关联在确保数据库一致性方面引入了漏洞。数据完整性取决于引用完整性逻辑的一致应用及其在所有数据库访问点上不存在缺陷。
因此,值得考虑利用数据库强制引用完整性的替代方法:
1.建立单独的补充表:
一种方法涉及为每个目标创建一个附加表,例如popular_states和popular_countries,它们分别与州和国家/地区建立连接。这些表还维护与用户配置文件的关系。
2.具有继承性的超级表:
作为替代解决方案,popular_areas 表可以引用超级表,例如地方,作为州和国家/地区的父表。州和国家的主键可以成为将它们链接到地点的外键。
3.双工列实施:
使用两列(state_id 和country_id)而不是使用能够引用多个目标表的单列,这被证明是一种可行的替代方案。在任何给定时间,这些列中只有一列应该具有非 NULL 值。
总之,引用完整性和数据规范化原则建议谨慎使用多态关联。依赖于数据库执行引用完整性的替代策略为跨表实体建立外键关系提供了更强大且一致的解决方案。
以上是数据库设计中如何有效管理跨表外键?的详细内容。更多信息请关注PHP中文网其他相关文章!