zoukankan      html  css  js  c++  java
  • SQL 第一范式、第二范式、第三范式、BCNF

    作者 : Dolphin

    原文地址: http://blog.csdn.net/qingdujun/article/details/27365979

    一、第一范式 1NF

    要求:每一个分量必须是不可分的数据项。

    特点:

    1)有主键,且主键不能为空。

    2)字段不能再分。

    示例:(以下例子 不满足 第一范式)

    /*学号      年龄        信息*/
      Sno       Sage        Sinfo
      1001      19          陕西省西安市,电话:10086
      1001      20          陕西,宝鸡

    主键:Sno

    不满足原因:1)主键重复。2)Sinfo字段可以再分。

    二、第二范式 2NF

    要求:在范式一的基础上,且每一个非主属性完全函数依赖于码。

    特点:

    1)满足第一范式。

    2)表中的每一个非主属性,必须完全依赖于本表码。

    3)只有当一个表中,主码由两个或以上的属性组成的时候,才会出现不符合第二范式的情况。

    示例:(以下例子 不符合 第二范式)

    /*学号    课程号     得分    课程名*/
      Sno      Cno      Score    Sname
      1001     001       99      数据库

    主键: Sno,Cno

    不满足原因:Sname不完全依赖于码,课程名部分依赖于码Cno。

    三、第三范式 3NF

    要求:在满足第二范式的基础上,且每一个非主属性既不部分依赖于码也不传递依赖于码。

    特点:

    1)满足第二范式。

    2)非主属性不能传递依赖于码。

    示例:(以下例子 不符合 第三范式)

    /*学号     系别     系主任*/
      Sno     Sdept     Shead
      1001   计算机系    张三

    主键:Sno

    不满足原因:Shead传递依赖于码,Sno->Sdept->Shead,可得Sno->Shead。

    四、BCNF

    要求:在满足第三范式的基础上,且不允许主键的一部分被另一部分或其它部分决定。

    特定:

    1)满足第三范式。

    2)所有非主属性对每一个码都是完全函数依赖。

    3)所有的主属性对每一个不包含它的码,也是完全函数依赖。

    4)没有任何属性完全函数依赖于飞码的任何一组属性。

    示例:(以下例子 不符合 第BCNF范式)

    /*学生       老师        课程*/
      Stu      Teacher      Course
      张三       李开复       数据库

    假设:每个老师只教一门课。

    候选码:

    (Stu,Teacher)->Course

    (Stu,Course)->Teacher

    这两个码由两个属性组成,而且它们是相互交叉的,所以不存在传递依赖,所以为3NF。

    但是由于:Teacher->Course,(主键的一部分被另一部分决定),所以不符合BCNF。

    参考文献:王珊,萨师煊.数据库系统概论(第4版) [M].北京:高等教育出版社,2006.170-178. 

    GISerYang博客园.第一范式,第二范式,第三范式[CP/OL].http://www.cnblogs.com/GISerYang/archive/2012/05/09/2491996.html ,2012-05-09/2014-05-28.

    Ruthless博客园.数据库设计三大范式[CP/OL].http://www.cnblogs.com/linjiqin/archive/2012/04/01/2428695.html ,2012-04-01/2014-05-28. 
    AllenLSY 孤而无寂的CSDN博客.第一范式,第二范式,第三范式,BCNF[CP/OL].http://blog.csdn.net/allenlsy/article/details/5356899 ,2010-03-08/2014-05-28

  • 相关阅读:
    springboot使用mybatis-plus表单更新null值问题通用解决方案
    ASP.NET MVC快速开发框架FastExecutor开发全过程感受及总结
    NetCore实现Transitional自定义注解事物
    NetCore3.0实现自定义IOC容器注入
    ADO.NET事务封装
    ASP.NET MVC模块化开发——动态挂载外部项目
    后台管理tab栏滑动解决方案
    c#使用CefSharp开发winform——环境搭建
    c#通过Redis实现轻量级消息组件
    ASP.NET MVC实现依赖注入
  • 原文地址:https://www.cnblogs.com/0to9/p/5044778.html
Copyright © 2011-2022 走看看