sql server 2008学习7 规范化和其他基本设计问题

第一范式: 

全部是关于消除重复数据组和保证原子性的规范化信息.

通俗讲 就是 创建主键,然后将任何重复的数据组移动到新的表中,为这些表创建新键.

原始表结构:

image

 

一个客户可能对应很多订单,那么表中将出现大量的重复数据.解决办法就是 将重复列 移到另一个表中

imageimage

 

第二范式:

进一步减少重复的数据出现.(不一定是数据组)

尽量使所有列 都依赖于真个键.

第三范式:

处理的问题是 使得表中所有列 不仅仅是依赖于某个事物--而是要依赖于 正确的事物.

第三范式的规则:

1.首先实现第二范式.

2.任何列都不能依赖于非键列.

3.不可以有派生的数据.(派生 就是 有 表中其他的列 计算得到的列)

 

Boyce-Codd范式(实际是第三范式的变体):

试图解决 多个重叠候选键的情况,这只能在下列条件下发生:

1.所有候选键是组合键(即键由多个列组成).

2.不只一个候选键

3.每个候选键至少有一个列和另外一个候选键的列相同.

 

关系:

有三种主要关系:

  • 一对一
  • 一对多
  • 多对多

 

一对一关系:

一对一关系是指: 如果在是一个表中有一个记录,那么另一个表也会有一个与之匹配的记录.

零或一对一关系:

这本质上和一对一相同,不同的是 关系的一方可以选择有一个记录或者没有记录.

 

一对一或一对多关系:

一个表中的记录,对应另一个表的多个数据.

 

多对多关系:

那么一个权限的例子, 每个用户都可能有多种权限,  多个用户可以公有一种权限

 

image

 

就此建立了一多对多 关系的三个表  ;

 

反规范化:

  • 如果声明一个计算列或者派生列 数据有助于更有效地运行报表,那么不管怎么样也要采用.只需考虑有点和可能的风险(如果汇总数据与所派生的数据不同步该怎么办?)
  • 在表中包括一个或者多个 饭规范化的列,可以消除或者显著减少检索信息所需的连接数量.
  • 如果要保持原始数据(大部分不改动的,而且只用于报表的数据),那么完整性问题是相对次要的.

 

超出规范化的一些过则

  1. 保持简单.要避免在数据库中引入 的复杂性超出真正所需.最低要求的方法通常产生的结果不仅更容易编辑,而且运行更快.
  2. 选择数据类型. 比如 需要存储月份,1-12 那么数据类型 选择 单字节的 tinyint足够了,没必要选择int.
posted @ 2012-09-11 12:29  左正  阅读(242)  评论(0编辑  收藏  举报