目标:引用多个父表

反模式:使用多用途外键。这种设计也叫做多态关联,或者杂乱关联。

多态关联和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反模式,系列学习汇总

1SQL反模式学习笔记1 开篇

2、SQL反模式学习笔记2 乱穿马路

3、SQL反模式学习笔记3 单纯的树

4、SQL反模式学习笔记4 建立主键规范【需要ID】

5、SQL反模式学习笔记5 外键约束【不用钥匙的入口】

6、SQL反模式学习笔记6 支持可变属性【实体-属性-值】

7、SQL反模式学习笔记7 多态关联

8、SQL反模式学习笔记8 多列属性

9、SQL反模式学习笔记9 元数据分裂

10、SQL反模式学习笔记10 取整错误

11、SQL反模式学习笔记11 限定列的有效值

12、SQL反模式学习笔记12 存储图片或其他多媒体大文件

13、SQL反模式学习笔记13 使用索引

14、SQL反模式学习笔记14 关于Null值的使用

15、SQL反模式学习笔记15 分组

16、SQL反模式学习笔记16 使用随机数排序

17、SQL反模式学习笔记17 全文搜索

18、SQL反模式学习笔记18 减少SQL查询数据,避免使用一条SQL语句解决复杂问题

19、SQL反模式学习笔记19 使用*号,隐式的列

20、SQL反模式学习笔记20 明文密码

21、SQL反模式学习笔记21 SQL注入

22、SQL反模式学习笔记22 伪键洁癖,整理数据

04-23 06:47