time 
设为首页】【收藏本站
当前位置: 主页 > 数据库 > 数据库理论 > SQL语言艺术(一)制定计划:为性能而设计

SQL语言艺术(一)制定计划:为性能而设计

时间:2010-03-08 23:18 点击:859次 字体:[ ]




第一章强调良好的模型和合理的数据库设计的重要性

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)

以上条件不会返回任何结果,因为SQL引擎无法确定null代表什么。如果表中出现了太多的空值,应当考虑是否需要引入新的表

理解子类型

子类型可能被误用,大量查询频繁引用父表不是高效的做法。如果父表保存着查询必需的信息,则所有查询都会来访问父表。子类型之间必须有逻辑差异性,千万不要受到OO思想的启发,而设计出继承性很强的schema

约束应明确声明

数据中存在隐含约束是一种不良设计,隐含约束通常只有人知道,但DBMS不知道,不能帮助优化器实现最高效的数据访问。应当尽可能多地定义约束,约束不仅有助于保证数据完整性,还为DBMS优化器提供了数据的重要信息

历史数据

处理不断变化并需要保存变化历史的数据,必须根据数据改变的快慢程度小心地设计策略

设计仅做到功能正确是不够的,设计时必须考虑性能,性能拙劣的罪魁祸首是错误的设计。后续的调优,可做为解决性能问题的补充手段。有时打着改善性能的旗号进行非规范化的处理,经常使性能问题变得更加糟糕,成功的数据库建模应该严格遵守基本的设计原则


本文地址 : http://www.fengfly.com/plus/view-171205-1.html
标签: 性能 SQL
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码: