《sql反模式》读书笔记。
反模式:程序员通常使用逗号分隔的列表来避免在多对多的关系中创建交叉表,我将这种设计方式定义为一种反模式,称为乱穿马路(Jaywalking),因为乱穿马路也是避免过十字路口的一种方式。
建议做法:创建一张交叉表。
反模式:这是一个很前卫的网站,因此,读者可以评论原文甚至相互回复,这样就某一主题的讨论又延伸出很多新的分支,其深度就会大大增加。你选择了一个简单的解决方案来跟踪这些回复分支:每条评论引用它所回复的评论。
建议做法:

反模式:使用了过于普通的id作为表的主键的列名。实际上,绝无理由不使用另一个更加有意义的名称。
建议做法:拥抱自然键和组合键。
反模式:不使用外键。
建议做法:通过使用约束来帮助数据库防止错误。外键约束条件:restrict,cascade,no action,set null/default
反模式:EAV(实体-属性-值)模式,便于扩展字段
建议做法:使用nosql;同步介绍了应对字段变更,扩展字段的方法: 单表继承; 实体表继承;类表继承(结合视图查询);半结构化(BLOB列,xml,json格式)
反模式:有一个解决方案已经流行到足以正式命名了,那就是:多态关联。有时候也叫做杂乱关联,因为它可以同时引用多个表。
建议做法:在每个表与表的关系中,都有一个引用表和一个被引用表。
反模式:多列属性。
建议做法:创建一张从属表,仅使用一列来存储多值属性。将多个值存在多行中而不是多列里。同时,在从属表中定义一个外键,将这个值和主表中的主记录关联起来。
反模式:根据某个字段(比如时间)分表,按照不同的年份分不同的表,或者在同一张表中根据不同的年份插入对应的列。
建议做法:合理归档数据,将历史数据从日常使用的数据中移除。使用水平分区。
CREATE TABLE Bugs (
bug_id SERIAL PRIMARY KEY,
date_reported DATE
) PARTITION BY HASH ( YEAR(date_reported) )
PARTITIONS 4;
使用垂直分区, 垂直分区就是根据列来对表进行拆分。当某些列非常庞大或者很少使用的时候,对表进行按列拆分会比较有优势。