摘要:
目标:随机排序,使用高效的SQL语句查询获取随机数据样本。 反模式:使用RAND()随机函数 SELECT * FROM Employees AS e ORDER BY RAND() Limit 1 缺点:无法利用索引,每次选择的时候都不同且不可预测。进行全表遍历,性能极差。 如何识别反模式:当出现 阅读全文
摘要:
目标:查询得到每组的max(或者min等其他聚合函数)值,并且得到这个行的其他字段 反模式:引用非分组列 单值规则:跟在Select之后的选择列表中的每一列,对于每个分组来说都必须返回且仅返回一直值。 select ProductId,Max(DateReported) as Latest from 阅读全文
摘要:
目标:辨别并使用Null值 反模式:将Null值作为普通的值,反之亦然 1、在表达式中使用Null: Null值与空字符串是不一样的,Null值参与任何的加、减、乘、除等其他运算,结果都是Null; Null值与False也不同。And、Or和Not三个bool操作如果设计Null,结果很迷惑。 2 阅读全文
摘要:
目标:优化性能 改善性能最好的技术就是在数据库中合理地使用索引。 索引也是数据结构,它能使数据库将指定列中的某个值快速定位在相应的行。 反模式:无规划的使用索引 1、不使用索引或索引不足 2、使用了太多的索引或一些无效的索引 (1)大多数数据库会自动地位主键建立索引,因此额外再定义一个索引就是冗余。 阅读全文
摘要:
目标:存储图片或其他多媒体大文件 反模式:图片存储在数据库外的文件系统中,数据库表中存储文件的对应的路径和名称。 缺点: 1、文件不支持Delete操作。使用SQL语句删除一条记录时,对应的文件不会被删除,需要使用额外的程序来操作。 2、文件不支持事务隔离 3、文件不支持回滚操作 4、文件不支持数据 阅读全文
摘要:
目标:限定列的有效值,将一列的有效字段值约束在一个固定的集合中。类似于数据字典。 反模式:在列定义上指定可选值 1、 对某一列定义一个检查约束项,这个约束不允许往列中插入或者更新任何会导致约束失败的值: create table Bugs(status varchar(20) check(statu 阅读全文
摘要:
目标:使用小数取代整数 反模式:使用Float类型 根据IEEE754标识,float类型使用二进制格式编码实数数据。 缺点:(1)舍入的必要性: 并不是所有的十进制中描述的信息都能使用二进制存储,处于一些必要的因素, 浮点数通常是舍入到了一个非常接近的值。 举例:select rate from 阅读全文
摘要:
目标:支持可扩展性。优化数据库的结构来提升查询的性能以及支持表的平滑扩展。 反模式:克隆表与克隆列 1、将一张很长的表拆分成多张较小的表,使用表中某一个特定的数据字段来给这些拆分出来的表命名。 2、将一个列拆分成多个之列,使用别的列中的不同值给拆分出来的列命名。 为了达到减少每张表记录数的目的,你不 阅读全文
摘要:
目标:存储多值属性 反模式:创建多个列。比如一个人具有多个电话号码、座机号码、手机号码等。 1、查询:多个列的话,查询时可能不得不用IN,或者多个OR; 2、添加、删除时确保唯一性、判断是否有值:这些都很麻烦; 3、字段的列数无法确定具体数量。 如何识别反模式:当出现以下情况时,可能是反模式 1、应 阅读全文
摘要:
目标:引用多个父表 反模式:使用多用途外键。这种设计也叫做多态关联,或者杂乱关联。 多态关联和EAV有着相似的特征:元数据对象的名字是存储在字符串中的。 在多态关联中,父表的名字是存储在Issue_Type单独一列中,有时候这样的设计被称作:混合数据与原数据。 查询示例: select * from 阅读全文