zoukankan      html  css  js  c++  java
  • [数据库笔记]规范化(Normalization)-把数据冗余降下来

    怎样验证好的relations?

    最小化冗余,使得其在每个属性(column)中只出现一次,除非这些属性全部或部分担任的是foreign keys的角色。

    为何这不是个好design? 

    冗余!

    冗余会导致异常:

    1. 插入异常:由于没有某些属性信息,而该属性又不能为 null,导致无法插入。

    比如新录用了一个lecturer, 系里还没生成lecturer的lecID,  就导致无法插入该lecturer的信息到表格里

    2. 删除异常:只想删除一条信息却连带的删除了其他信息。

    若该系仅有的两位lecturer退休,将则两位lecturer的信息从database里删除,则该dept的相关信息也丢失了

    3. 更新异常:更新一条记录却连带的需要更新其他多条记录。

    若电话系统更新,deptPhone换掉,则所有带deptPhone的table都要连带更新

    函数依赖(functional dependency)

    类似于函数 y = x2    当x = 2时,可以确定y = 4;  但是当y等于4时,不能确定x = 2(也可能等于-2)

    也就是说,若relation R中存在 x-> y(函数依赖中,x 决定 y),则有t1[x] = t2[x] (都为a)可以确定t1[y] = t2[y] (都为b) 

    完全函数依赖 X、Y 是表的属性或属性组,若 X → Y,且对于 X 的任何一个真子集(假如属性组 X 包含超过一个属性的话),X → Y 成立,那么我们称 Y 完全函数依赖于 X 。

    比如: lectID -> deptCode

    lectID可以确定deptCode

    部分函数依赖 X、Y 是表的属性或属性组,若 X → Y,且存在 X 的一个真子集(假如属性组 X 包含超过一个属性的话),X → Y 成立,那么我们称 Y 部分函数依赖于 X 。

    比如: lectID,  name -> deptCode

    可以看到(lectID,  name)的组合键可以确定deptCode, 但组合键的一个部分lectID就可以确定deptCode

    第一范式(1NF,First Normal Form): 列不再分

    总结
    1. 一个表如果每一行都是唯一,并且任何行都没有包含多个值的列,则它满足1NF。但对于关系表来说,真正的规范化过程从第二范式开始,因为关系表本身已经满足1NF了。

    2. 要满足1NF就要保证数据在实际使用时, 不用对列(column)进行二次拆分(原子性)

    3. 1NF主要处理颗粒大的行(row)

    4. 仍然存在四个问题: 插入异常,删除异常,更新异常,数据冗余

    第二范式(2NF,Second Normal Form):消除非主属性对码的部分函数依赖

    总结

    1. 解决列(column)部分依赖主键(复合主键)的问题

    2.在实际中,几乎不用复合主键,因此可以完美避免违背第二范式

    3. 插入异常和数据冗余问题有改进,但仍存在,仍存在删除异常和更新异常。

    第三范式(3NF,Third Normal Form):消除非主属性对码的传递函数依赖

    Boyce-Codd 范式(BCNF,Boyce-Codd normal form)

  • 相关阅读:
    【HDOJ】4347 The Closest M Points
    【HDOJ】4341 Gold miner
    【HDOJ】4333 Revolving Digits
    【HDOJ】4336 Card Collector
    【HDOJ】4328 Cut the cake
    【HDOJ】4322 Candy
    【HDOJ】4317 Unfair Nim
    串口接收线程退出与优先级问题
    EVC编程与调试过程出现的问题
    Windows CE创建桌面快捷方式
  • 原文地址:https://www.cnblogs.com/liuliu5151/p/10947389.html
Copyright © 2011-2022 走看看