• 规范化(Normalization)


    规范化是一种形式化上数学处理过程,以确保每个实体只由一个关系来表示。

    第一范式(1NF):第一范式要示表中的行必须是唯一的,属性应该是原子的(atomic)。这个范式对关系的定义来说是冗余的,换句话说,如果一个表真可以表示一个关系,那么它一定符合第一范式。

    行的唯一性是通过在表中定义一个唯一的主键而实现的。

    对于属性,只能使用随属性的数据类型定义一起定义的操作来对它们进行操作。和集合定义具有主观性一样,属性的原子性也是主观的。例如,表示人的信息的地址,应该将它表示为一个属性(省市城)、三个属性(省,市,城)?结论要依应用程序而定。如果应用程序需单独处理地址的各个部分,那么将地址的各个部分分开保存是有意义的;否则,将地址分开保存就没有什么意义。

    第二范式(2NF):第二范式包括两条规则,首先数据必须满足第一范式,其次要求非键属性(nonkey attribute)和候选键属性之间必须满足一定的条件。对于每个候选键,每个非键属性都必须完全函数依赖于整个候选键。换句话说,一个非键属性不能只完全函数依赖于候选键的一部分。非正式地说,如果要获得任何非键属性值,就必须提供同一行中某个候选键的所有属性值。如果知道了一个候选键的所有属性值,就能够找到任意行的任意属性值。

    假设定义了一个名为 Orders 的关系,用于表示有关订单和订单详情的信息。Orders 关系包含以下属性:orderid、productid、orderdate、qty、customerid,以及 companyname。主键是定义在 orderid 和 productid 上的复合主键。

    因为其中存在非键属性部分依赖候选键(这个例子中的主键)的情况。例如,只通过 orderid 属性就可以找到订单的 orderdate,以及 customerid 和 companyname 属性。为了符合第二范式,需要将原来的关系拆分成两个关系:Orders 和 OrderDetails 属性。Orders 关系将包含以下属性:Orderid、orderdate 、customerid 及 companyname。主键定义在 orderid 上。OrderDetails 关系将包含以下属性:Orderid 、productid 及 qty,主键定义在 orderid、productid 上。

    第三范式(3NF):第三范式也有两条规则。首先,数据必须满足第二范式。其次,所有非键属性必须非传递依赖于候选键。通俗地说,这条规则意味着所有非键属性都必须互相独立。换句话说,一个非键属性不能依赖于其他非键属性。

    接上例,我们的 Orders 和 OrderDetails  关系现在已经符合第二范式。此时在 Orders 关系中,我们要知道整个主键才能找到下订单的 customerid。同样,需要知道整个主键才能找到下订单的客户的公司名称。然而,customerid 和  companyname 属性也是互相依赖的。为了满足第三范式,需要增加一个 Customers 关系,它的属性包含 customerid (主键) 和 companyname, 并删除 Orders 关系中的 companyname 属性。

    可以将第二范式和第三范式通俗地概括为:“每个非键属性都依赖于键,全部键,除了键没有别的”。

  • 相关阅读:
    Tomcat 服务器的安装和配置
    谈谈如何在面试中发掘程序猿的核心竞争力
    Apache2.4卡住无法访问的解决……
    如何设计一个编辑窗体的基类
    我是如何实现一个通用的验证基类的?
    我的微信头像换成国旗后的遭遇
    如何安装一个优秀的BUG管理平台——真的是手把手教学!
    DevExpress学习系列(控件篇):GridControl的基本应用
    打车软件烧钱背后的商业逻辑
    如何给你的为知笔记添加一个漂亮的导航目录
  • 原文地址:https://www.cnblogs.com/zhangdx/p/2788346.html
Copyright © 2020-2023  润新知