SQL Server学习记忆——数据库设计的技巧并举例(二)

来源:互联网 发布:中电大数据 张振兴 编辑:程序博客网 时间:2024/05/17 03:38

SQL Server学习记忆——数据库设计的技巧并举例(二)1

前言

这篇博文中对数据库的关系模型,主键和外键,如何避免冗余进行了讲解,并用示例说明了数据库表的组成。

关系模型

连个公共表之间联系有三种:一对一,一对多和多对多。
1. 一对一
表A中的每一行最多和表B有一个相匹配的行。
2. 一对多
表A中的每一行和表B有0~n个相匹配的行,但不可逆。如:出版社可以出版多本书,但一本书只能被一个出版社出版。
3. 多对多
表A中的每一行和表B有0~n个相匹配的行,表B中的每一行和表A有0~n个相匹配的行。

主键与外键

主键与外键一般而言,一个实体不能既无主键又无外键。主键与外键的设计,在全局数据库的设计中,占有重要地位。当全局数据库的设计完成以后,有个美国数据库设计专家说:“键,到处都是键,除了键之外,什么也没有”,这就是他的数据库设计经验之谈,也反映了他对信息系统核心(数据模型)的高度抽象思想。因为:主键是实体的高度抽象,主键与外键的配对,表示实体之间的连接。

规范化

规范化是通过修改表以减少冗余和矛盾的一系列步骤。
1. 第一范式(1NF)
(1)列仅包含原子值(原子值,是不能再细分的单一值);
(2)没有重复的组(两个或多个逻辑相关联的列的集合。

title_id title_name authors T01 1977! A01 T02 But I Did It… A03,A04 T03 Perhaps… A03,A04,A05

这个表的列authors给出了多个作者,因此违反了1NF。

title_id title_name author1 author2 author3 T01 1977! A01 T02 But I Did It… A03 A04 T03 Perhaps… A03 A04 A05

这个表违反了1NF的第2条规则。

  1. 第二范式(2NF)
    (1)主键是一个列(关键字不是组合);
    (2)表中所有的列是主键的一部分;
    (3)满足第一范式;
    (4)非部分函数依赖。

  2. 第三范式(3NF)
    (1)满足2NF;
    (2)没有传递依赖。

每一种范式都比前一种更稳健,符合3NF的数据库也符合2NF和1NF。规范化水平越高,表的数量就越多。

示例数据库

使用名为books的数据库,该数据库包含表有:authors,publishers,titles和titles_authors。
1. 表authors
authors描述书的作者,每一个作者有唯一的标识符,称为主键。表authors的结构如下:

列名 描述 数据类型 空? 主键 au_id 作者唯一标识符 CHAR(3) 主键 au_fname 名 VARCHAR(15) au_lname 姓 VARCHAR(15) phone 电话号码 VARCHAR(12) 是

2. 表authors的内容如下:

au_id au_fname au_lname phone A01 zw s 15210679868 A02 yj x 15210679867 A03 zx z 15210679866 A04 cy z 15210679865

3. 表publishers

pub_id pub_name city country P01 Earth Shang Hai China P02 Sky Bei Jing China P03 Water Da Lian China

4.表 titles

title_id title_name pub_id pubdate T01 1977! P01 2000-08-01 T02 2000 Years of… P03 2009-09-21 T03 Water World P02 1987-05-12

4. 表title_authors

title_id authors_id T01 A01 T02 A03 T03 A02

正确认识数据冗余

主键与外键在多表中的重复出现, 不属于数据冗余。非键字段的重复出现,才是数据冗余!而且是一种低级冗余,即重复性的冗余。高级冗余不是字段的重复出现,而是字段的派生出现。

  〖例4〗:商品中的“单价、数量、金额”三个字段,“金额”就是由“单价”乘以“数量”派生出来的,它就是冗余,而且是一种高级冗余。冗余的目的是为了提高处理速度。只有低级冗余才会增加数据的不一致性,因为同一数据,可能从不同时间、地点、角色上多次录入。因此,我们提倡高级冗余(派生性冗余),反对低级冗余(重复性冗余)。



  1. [1] SQL基础教程(第三版). ↩
0 0
原创粉丝点击