目标:引用多个父表
反模式:使用多用途外键。这种设计也叫做多态关联,或者杂乱关联。
多态关联和EAV有着相似的特征:元数据对象的名字是存储在字符串中的。
在多态关联中,父表的名字是存储在Issue_Type单独一列中,有时候这样的设计被称作:混合数据与原数据。
查询示例:
select * from A as a
left join B as b on a.xId=b.Id and a.xType='b'
lefe join C as c on a.xId=c.Id and a.xType='c'
如何识别反模式:当出现以下情况时,可能是反模式
(1)这种标记框架可以让你将标记(或者其他属性)和数据库中的任何其他资源联系起来。
就想EAV的设计一样,应该怀疑任何生成有无线扩展性的设计。
(2)不能在数据库中国声明外键。
(3)有一列,用来说明这条记录的其他列是和什么相关的。
任何外键都强制一张表中所有的行引用同一张表。
合理使用反模式:应该尽量避免使用多态关联,应该使用外键约束等来确保引用完整性。
因为:多态关联通常过度依赖上层程序设计而不是数据库的元数据。
解决方案:让关系变得简单
1、反向引用,多态关联是一个反向关联
2、创建交叉表:为每个父表创建一张独立的交叉表,每张交叉表同时包含一个指向目标表的外键和一个指向对应附表的外键。
交叉表大多用来存储多对多关系,如果关系是一对多,那么可以通过在交叉表上建立UNIQUE约束来保证一对多。
使用交叉表可以保证引用完整性。
3、创建公用的超级表:创建一个基类表,并让所有的父表都继承该基类表。
SQL反模式,系列学习汇总