SQL语言艺术(一)制定计划:为性能而设计
第一章强调良好的模型和合理的数据库设计的重要性
sql的背后有着关系模型的数学理论做为基础,以前一直以为关系模型指的是一个表通过外键与其它表关联起来,实际却不是这样。关系模型不是因为不同表之间建立了关系,而是因为表内不同字段之间存在关系。几个值就处于表的同一行,它们之间就存在关系。关系理论的关键原理是:关系不包含重复数据,且记录之间没有顺序
规范化是关系理论很重要的一部分,它的原理是按照严格的逻辑要求,将松散的数据组织在一起,形成结构化的信息,这种严格性是通过不同级别的范式来界定的。最具代表性的是1NF,2NF,3NF,通常符合3NF的数据库也符合BCNF和5NF
1NF:原子性,确定主键,这是规范化的基础
以前的接触的教材仅从技术角度强调1NF指的每个字段都是不可分割的,从实用角度讲,原子性表示字段能在where子句中充分利用,如果where子句中必须引用字段的某一部分,则这个字段没有达到原子性的级别,必须进一步拆分。至于将数据拆分到什么级别应该根据应用需用,看应用如何使用数据
原子性有两个优点:
1.高效搜索的能力,因为常规索引通常以具有原子性的值作为键
2.从数据库保角度证数据的正确性
2NF:对键的完全依赖
非关键字段必须完全依赖于任一组候选关键字,不能存在部分依赖(A, B)-->(C, D), (A-->C)
3NF:检查属性独立性,不能存在转递依赖
除了唯一键所包含的字段外,不能由其它任何字段的值确定另一字段的值(A-->B, C, D), (C-->D)
违反2,3范式容易造成冗余,数据不一致,影响查询性能
还存在一种设计缺陷的征兆:太多的NULL值
如果表存在太多NULL,尤其是两个字段不可能同时有值,显然是违背了2NF或3NF。NULL有可能影响查询的优化。关系模型的完备性是以二值逻辑(two-valued logic, yes or no)为基础的,where子句中的条件必须明确,但NULL代表不确定。举个例子:
where color not in ('RED', null)