• 从表的设计去理解数据库范式

    用例子来深入探讨
    服务器君一共花费 13.950 ms 进行了 4 次数据库查询,努力地为您提供了这个页面。
    广告很萌的

    前面我们介绍了数据库范式,还有一些常见的 NF,但是例子可能不够深入。下面我们用详细的例子帮助大家理解各种方式。

    数据库规范化,又称数据库或资料库的正规化、标准化,是数据库设计中的一系列原理和技术,以减少数据库中数据冗余,增进数据的一致性。关系模型的发明者埃德加·科德最早提出这一概念,并于1970年代初定义了第一范式、第二范式和第三范式的概念,还与Raymond F. Boyce于1974年共同定义了第三范式的改进范式——BC范式。

    除外还包括针对多值依赖的第四范式,连接依赖的第五范式,DK范式和第六范式。现在数据库设计最多满足3NF,普遍认为范式过高,虽然具有对数据关系更好的约束性,但也导致数据关系表增加而令数据库IO更易繁忙,原来交由数据库处理的关系约束现更多在数据库使用程序中完成。

    数据库表结构设计时,遵从一定的范式(NF,Normal Form)可以减少数据冗余和操作异常。

    第一范式(1NF)

    1NF指的是每个属性值都是不可再分的。

    满足1NF的关系被称为规范化的关系,1NF也是关系模式应具备的最起码的条件。比如有这样一张表user的两列:

    • name
    • phone_number

    phone_number 这一列只存储一个电话号码,如果一条数据同时存储了住宅电话和手机号码,比如:“010-65576558,13765556765”,那么这个属性是可以再分的,违背了1NF。

    第二范式(2NF)

    2NF要求去除局部依赖。

    也就是说,表中的属性完全依赖于全部主键,而不是部分主键。比方说user表包含下面几列:

    • user_id
    • name
    • phone_number
    • job_id
    • job_description

    其中 job_description 依赖于 job_id,而不是全部主键(user_id,job_id),所以违背了2NF。这时可以把 job 部分单独抽取成一张job表,去除冗余。

    第三范式(3NF)

    3NF要求消除非主属性对候选键的传递依赖。比如user表现在组成如下:

    • user_id
    • name
    • classification

    仅有 user_id 是主键,用户姓名依赖于主键 user_id,根据姓名 name 来给用户分类,而用户可能重名,因此 name 是允许重复的,再有用户分类 classification 依赖于用户姓名。这张表已经满足了2NF,即属性依赖于全部主键 user_id,但是形成了从 classification 到非候选键 name 再到主键 user_id 的传递依赖,不符合3NF。

    BC范式(BCNF)

    3NF中只是排除了非主属性对候选键的传递依赖,于是更进一步,BCNF还要求消除主属性对候选键在内的传递依赖。

    user表现在变成这样:

    • user_id
    • card_id
    • passport_id

    其中护照号passport_id是主键,身份证号card_id和用户号user_id都是候选键,存在主属性passport_id到card_id再到候选键user_id的传递依赖。

    第四范式(4NF)

    4NF是要消除多值依赖。

    在关系模式中,函数依赖不能表示属性值之间的一对多联系,这些属性之间有些虽然没有直接关系,但存在间接的关系,把没有直接联系、但有间接的联系称为多值依赖的数据依赖。

    比如user表:

    • user_id
    • position
    • salary_level

    user_id是主键,薪水等级salary_level看似被用户id直接确定,但其实薪水等级是根据职位position来确定的,和用户本身无直接关系,这就是多值依赖。

    第五范式(5NF)、DK范式(DKNF)和第六范式(6NF)

    5NF要求消除连接依赖,并且必须保证数据完整。多值依赖是连接依赖的特殊情况,定义稍复杂。这几种范式已经很少涉及。

    在保证数据完整性基础上,通常达到3NF,有时达到2NF已经足够了,追求过高的NF级别会导致混乱的库表,大量的多表连接查询,性能低下。

更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [移动开发] 从代码角度去认识 Handler 4 个条目
  2. [PHP程序设计] fsockopen,curl与file_get_contents 12 个条目
  3. [数据库技术] MySQL常用自带函数 3 个条目
  4. [PHP程序设计] Nginx基本操作释疑 7 个条目
  5. [软件工程与项目管理] 开始了解Git 5 个条目
  6. [Python程序设计] Python语言概述 6 个条目
  7. [移动开发] 从代码角度去认识 Activity 4 个条目
  8. [数据库技术] SQL基础语法 1 个条目
  9. [移动开发] Android与SQLite数据库 7 个条目
  10. [Python程序设计] 标准库:urllib/urllib2 14 个条目
  11. [PHP程序设计] PHP中的Hash算法 3 个条目
  12. [Python程序设计] Python数据类型 11 个条目
窗口 -- [协会]