Home > 分享 > 范式设计简单介绍(一)

范式设计简单介绍(一)1+

6,679 views / 2009.09.08 / 1:01 下午

范式设计是关系数据库的一个延伸理论。目的是在关系数据库的基础上,减少重叠数据的冗余,并且在将列(属性) 逐渐拆分成表(关系) 的过程中,从理论上减少了异常数据产生的几率。增强了数据的关系性能,在一定程度上,增强了关系查询效率。

术语:通常在具体的 RDBMS 如 MySQL 的应用开发中,将一个关系叫做表,一条元组(tuple) 称为行,一个属性叫做列。 因为范式(NF) 设计主要是讲理论,所以在本文中,一律将表称为关系,将行称为tuple,将列称为属性。

如图:

范式设计

1.1] First Normal Form(1NF)

1NF(第一范式) 的目的是将数据拆分成原子状态。例如 一个大型文章发布系统的文章序列号的组成是 8 位用户名 + 该用户所属的文章号,如某用户的用户名是 ID_001 ,他发表的某一篇文章,在他的文章列表中的序列号是 15 ,这篇文章在该系统中唯一序列号是 ID_00115 。

将文章序列号存储到关系中去,通常的做法是这样的:

错误的方式

+———————-+—————–+—————+

some属性…… | 文章序列号 | other 列……

———————-+—————–+—————-

……| ID_00115 |

这么做是不符合 1NF 规范的。因为文章序列号是两部分组成的,如果存成一个属性那么就违反了 1NF 的原子性原则。

符合 1NF 的属性划分方法如下:

正确方式:

+———————-+————–+——–+—————+

some属性…… | 用户号 | 文章号 | other 列……

———————-+—————+——–+—————-

……| ID_001 | 15 |

+———————-+————-+——–+—————+

1.2] Second Normal Form(2NF)

2NF 划分关系的原则是:一个关系中的所有非 Key属性s 必须完全的依赖于 Key。如果是多主键的话,那么非主键属性s 必须完全依赖所有的主键.

1NF 的范围是同一关系的不同属性之间的划分。而 2NF(第二范式) 的范围是将一个大的,数据相互重叠与冗余的关系拆分成众多小的,关系 ,他们之间相互的联系就是 Key ,Key 是一个关系中唯一标示一个tuple 的标识。而且在 2NF 中,所有有效的单一的 Key 默认都是 Primary key。(多个 Key 唯一定位一个tuple ,那么这些Key 称为复合主键) 。

另外一点需要特别注意的是,范式是属性递增的,因此,只有在完成了 1NF 之后,才能进行 2NF 的划分。

例如某文章系统中,一个存储某一篇文章的关系,有如下字段

错误方式:

+————————–+————+———-+———–+———–+————–+—————-+———–+——————

..some属性s | 用户号 | 文章号 | 文章标题 | 文章内容 | 文章创建时间 | 用户发表文章数 | 用户登录数| other 列 …

+————————–+————+———-+———–+———–+————–+—————-+———–+——————

……| ID_001 | 15 | Article | Cnt … | 1223372589 | 4 | 20 | ……

其中,‘用户号’和‘文章号’对于 ‘文章标题’、‘文章内容’、‘文章创建时间’来说,可以算是复合主键,因为要查出这些属性,必须完全依赖 ‘文章号’和 ‘用户号’这两个属性,缺一不可。

而 ‘用户发表文章数’和 ‘用户登录数’这两个属性仅依靠 ‘用户号’就可以出来,所以 ‘用户号’是 ‘用户发表文章数’和 ‘用户登录数’的主键,而 ‘文章号’则和这两个属性没有关系。也可以说 ‘用户发表文章数’和 ‘用户登录数’没有完全依赖于复合主键,所以这个表不符合 2NF 标准(但是所有属性都是原子不可分状态,因此这个表符合 1NF 标准)。

如果要符合 2NF 标准,就需要将这个关系拆分成两个关系

正确方式:

+————————–+————+———-+———–+———–+————–+————————–

..some属性s | 用户号 | 文章号 | 文章标题 | 文章内容 | 文章创建时间 | other 列 …

+————————–+————+———-+———–+———–+————–+————————–

……| ID_001 | 15 | Article | Cnt … | 1223372589 | ……

+————————–+————+———-+———–+———–+————–+—————————

正确方式:

+————————–+————+—————–+———–+——————-

..some属性s | 用户号 | 用户发表文章数 | 用户登录数| other 列 …

+————————–+————+—————–+———–+——————-

……| ID_001 | 4 | 20 | ……

+————————–+————+—————–+———–+——————-

这样,Right way one . 中剔出了不符合完全依赖的两个属性s ,所有的属性s 都完全依赖 composite primary key ,可以认为 Right way one. 符合 2NF 标准。

另外,将 Wrong way. 中剔出的两个属性s 划分到了 Right way two. 里面,primary key 是 ‘用户号’。因此 Right way two. 仅就一个 primary key ,并且所有内容都依赖于 primary key 查询,所以可以说 Right way two. 符合 2NF 的要求。

1.2.1] 关系模式

经过 2NF 的拆分,现在关系的数量在增加,但是属性之间的关系趋向于更加的简单明了。

关系之间根据对应联系的不同,有三种不同的关系模式:

· 一对一

· 一对多

· 多对多

·一对一 , 既一个属性仅可以对应一个其他的属性

例如:一个用户号和用户之间就是一对一的关系,一个用户只能有一个用户号,一个用户号只能指定某一个用户。

·一对多 , 既一个属性可以对应多个其他的属性

例如: 一个用户号可以对应多个文章号,因为用户可以发表多篇的文章.

·多对多 , 既多个属性可以对应多个其他的属性

完全多对多就是 Cartesian product(笛卡尔积或直积)。

例如: 一个用户可以发相同标题的不同文章。而拥有相同标题的文章,可以由不同的用户发。

本站内容受著作权法保护。个人 blog 转载时请遵循 “署名-非商业用途-保持一致” 的创作共用协议;商业网站或未授权媒体不得复制本站内容。
Categories: 分享 Tags: ,

Comments (1) Trackbacks (0) 本篇共有 1 篇评论↓
  1. 2009-12-06 17:16 | #1

    杜工很牛啊!正在佩服你中……

  1. No trackbacks yet.