《SQL反模式》笔记

一、乱穿马路
在字段中使用分隔符以达到记录多值的方法是一种反模式,尤其是可能被查询条件,统计条件使用的字段。
解决方法是建立交叉表,在交叉表中记录多对多的关系。

二、树形结构
以评论树的案例讲解了数据库存储树结构的方法。简单记录上级节点的设计(邻接表模型)是一种反模式,虽然简单,但是在查询,统计等数据库操作中很复杂。
反模式只能在树层级很少很少(最多2~3层)的时候可以使用。
解决方法就是让记录的信息多一些(冗余换性能)。可以使用路径枚举、嵌套集、闭包表。
路径枚举就是把所有祖先信息联合成一个字符串,缺点是查找所有祖先节点时比较复杂。路径枚举设计在新增和简单删除操作时简单。
嵌套集设计使用存储子节点的键值的范围的方式,缺点是新增、删除节点操作很复杂。
闭包表记录树中所有节点的关系,也就是每一个父子关系都是一条记录(节点和节点自身也是父子关系)。闭包表的新增和删除都不是简单操作一条记录,需要关联删除。

三、伪主键-ID
使用指代意义明确的字段名,主键的目的是唯一确定一条记录,主键需要满足索引特性,使用组合键是必要的。

四、是否需要使用外键?
外键可以有效保证数据库数据的完整性和一致性,但是除了影响性能外,还可能造成业务死锁。
不使用外键,那么数据库数据完整性需要在代码中自己实现。
cascade和restrict

五、实体-属性-值
实际情况:数据对象是继承产生的,如何存储对象?
反模式设计:设计一张表包含实体、属性、属性值;因为要存储多个属性,所以属性值只能是字符串。每个属性-值对被处理为一条记录。缺点:破坏了数据库的特性。
建议的设计:
单表继承,子类很少且子类特性比较明确时可以采用,把所有列都设计在一个表中,需要特性字段支持null。
实体表继承:每一个子类设计一个完整字段表,(很多表字段相同),增加一个通用列的修改任务很大,查询所有子类属性困难。
类表继承:定义个基类表包含所有通用字段,定义子表包含子类的特性字段,子表和基类表通过元数据关联,子表的主键同时也是外键。
半结构化设计:把特性字段以xml或者json的格式存储在一个列中。不推荐。

六、多态关联
如果非要保证引用一致性(外键),那么就建一个超级表,保存超类对象ID。

七、元数据分裂
当一张表数据确实很大时,可能需要分表。分表中一种设计就是不停的增加新表或者增加固定数量的表。
依靠数据库分片的特性分表,例如mysql的partition。
使用关联表(把不常用的列分离出来),这种方法没有彻底分表。

你可能感兴趣的:(数据库)