目标:引用多个父表
反模式:使用多用途外键。这种设计也叫做多态关联,或者杂乱关联。
多态关联和EAV有着相似的特征:元数据对象的名字是存储在字符串中的。
一条记录,要么是存储的X,要么是存储的Y。X、Y可能是有关联的,也可能是完全无关的。
例如:select * from a
left join b on a.xid=b.id and a.xType='b'
lefe join c on a.xid=c.id and a.xType='c'
识别反模式:1、用这种方式,可以和任何表关联。
2、我们的数据库设计不能声明外键。
3、有一个列,是专门用来说明其它列是和什么东西相关的。
合理使用反模式:
尽量避免多态关联——应该使用外键约束来确保引用完整性。多态关联通常过度依赖上层代码而不是数据库的元数据。
解决方案:
1、反向引用。其实多态关联是一个反向关联。
2、创建交叉表。为每个父表创建一个交叉表。
交叉表大多用来存储多对多关系,如果我们现在的关系是一对多,那么可以通过在交叉表上简历UNIQUE约束来保证一对多。
3、创建公用的超级表。即:有多个交叉表,但是所有父表其实是一个公用表。