zoukankan      html  css  js  c++  java
  • SQL三大范式原来如此呵呵

     

    第一范式(1NF)

    (必须有主键,列不可分)

    数据库表中的何字段都是单一属性的,不可再分

    create table aa(id int,NameAge varchar(100))
    insert aa values(1,''无限-女
    '')
    没有达到第一范式


    create table aa(id int,name varcahr(10),age char(2))
    insert aa values(1,''无限'',''女
    '')
    达到第一范式

    第二范式(2NF)

    数据库表中非关键字段对一候选关键字段的 不存在部分函数依赖

    (当一个表是复合主键时,非主键的字段不依赖于部分主键(即必须依赖于全部的主键字段))

    create table sci(

       sno int(32),cno int(32),grade int(32),credit int(32),

    primary key sno,cno

    )

    课程(cno)1---1学分(credit)

    学生(sno)n---n课程(cno)

    学生+课程--->分数(grade)

    sci

    sno cno grade credit

    1    1   60     80

    2    1    90     80

    3   1    70     80

    .   .   .      .

    .   .   .     .

    .    .   .     .

    如此以来,学分被大量重复存储,数据冗余

    如要某课程学分,则要大量重复操作

    如要加新课程,由于sno和cno共同做为主键,则在加入新课程时,必须有人选该课

    如某学生某课程结业,则该学生其它课程信息也同时被删除了

    总之

    这种设计不太好吧,非关键字属性credit仅函数依赖于cno,也就是credit部分依赖组合关键字(sno,cno)而不是完全依赖

    解决

    分成两个关系模式 sc1(sno,cno,grade),c2(cno,credit)。新关系包括两个关系模式,它们之间通过sc1中的外关键字cno相联系,需要时再进行自然联接,恢复了原来的关系

    第三范式(3NF)

    关系模式R(U,F)中的所有非主属性对何候选关键字都不存在传递依赖

    例----S1(SNO,SNAME,DNO,   DNAME, LOCATION)

              学号 姓名   所在系 系名称 系地址
    关键字SNO决定各个属性。由于是单个关键字,没有部分依赖的问题,肯定是2NF。但这关系肯定有大量的冗余,有关学生所在的几个属性DNO,DNAME,LOCATION将重复存储,插入,删除和修改时也将产生类似以上例的情况。
    原因:关系中存在传递依赖造成的。即SNO 1->1 DNO。 而DNO 1->n SNO却不存在, 而DNO -> LOCATION存在, 因此关键辽 SNO 对 LOCATION 函数决定是通过传递依赖 SNO -> LOCATION 实现的。也就是说,SNO不直接决定非主属性LOCATION。
    解决目地:每个关系模式中不能留有传递依赖。
    解决方法:分为两个关系 S(SNO,SNAME,DNO),D(DNO,DNAME,LOCATION)
    注意:关系S中不能没有外关键字DNO。否则两个关系之间失去联系

    鲍依斯-科得范式(BCNF)

    在3NF的基础上,库表中何字段对一候选关键字段的传递函数依赖都不存在

    仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且管理员1---1仓库;仓库1---n物品。这个数据库表中存在如下决定关系:
      (仓库ID, 存储物品ID) →(管理员ID, 数量)
    (管理员ID, 存储物品ID) → (仓库ID, 数量)
    所以,(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:
    (仓库ID) → (管理员ID)
    (管理员ID) → (仓库ID)
    即存在关键字段决定关键字段的情况,所以其不符合BCNF范式

    解决:

    把仓库管理关系表分解为二个关系表:
      仓库管理:StorehouseManage(仓库ID, 管理员ID)
    仓库:Storehouse(仓库ID, 存储物品ID, 数量)

  • 相关阅读:
    BZOJ 3205 [Apio2013]机器人 ——斯坦纳树
    BZOJ 3782 上学路线 ——动态规划 Lucas定理 中国剩余定理
    HDU 1423 Greatest Common Increasing Subsequence ——动态规划
    BZOJ 3309 DZY Loves Math ——莫比乌斯反演
    POJ 1038 Bugs Integrated, Inc. ——状压DP
    POJ 3693 Maximum repetition substring ——后缀数组
    POJ 2699 The Maximum Number of Strong Kings ——网络流
    POJ 2396 Budget ——有上下界的网络流
    BZOJ 4650 [Noi2016]优秀的拆分 ——后缀数组
    源码安装python
  • 原文地址:https://www.cnblogs.com/haofaner/p/2294461.html
Copyright © 2011-2022 走看看