第一范式,第二范式,第三范式,BCNF范式理解

第一范式,第二范式,第三范式,BCNF范式理解第一范式、第二范式、第三范式参考了https://www.zhihu.com/question/24696366https://www.cnblogs.com/lca1826/p/6601395.html基础知识实体:现实世界中客观存在并可以被区别的事物。比如“一个学生”、“一本书”、“一门课”等等。值得强调的是这里所说的“事物”不仅仅是看得见摸得着的“东西”,它也…

大家好,又见面了,我是你们的朋友全栈君。

第一范式、第二范式、第三范式

参考了https://www.zhihu.com/question/24696366
https://www.cnblogs.com/lca1826/p/6601395.html

基础知识

实体:现实世界中客观存在并可以被区别的事物。比如“一个学生”、“一本书”、“一门课”等等。值得强调的是这里所说的“事物”不仅仅是看得见摸得着的“东西”,它也可以是虚拟的,比如说“老师与学校的关系”。

属性:教科书上解释为:“实体所具有的某一特性”,由此可见,属性一开始是个逻辑概念,比如说,“性别”是“人”的一个属性。在关系数据库中,属性又是个物理概念,属性可以看作是“表的一列”。

元组:表中的一行就是一个元组。

分量:元组的某个属性值。在一个关系数据库中,它是一个操作原子,即关系数据库在做任何操作的时候,属性是“不可分的”。否则就不是关系数据库了。

码:表中可以唯一确定一个元组的某个属性(或者属性组),如果这样的码有不止一个,那么大家都叫候选码,我们从候选码中挑一个出来做老大,它就叫主码。

全码:如果一个码包含了所有的属性,这个码就是全码。

主属性:一个属性只要在任何一个候选码中出现过,这个属性就是主属性。

非主属性:与上面相反,没有在任何候选码中出现过,这个属性就是非主属性。

外码:一个属性(或属性组),它不是码,但是它别的表的码,它就是外码。

第一范式

第一范式列不能再分。

第二范式

第二范式建立在第一范式的基础上,非主属性完全依赖于码。
简单说:消除部分依赖。

(什么是码?) 表中可以唯一确定一个元组的某个属性(或者属性组),如果这样的码有不止一个,那么大家都叫候选码,我们从候选码中挑一个出来做老大,它就叫主码。主码可以包含多个属性。

要理解第二第三范式需要理解完全函数依赖、部分函数依赖、传递函数依赖。


完全函数依赖

定义:设X,Y是关系R的两个属性集合,X’是X的真子集,存在X→Y,但对每一个X’都有X’!→Y,则称Y完全函数依赖于X。

比如通过学号->姓名


部分函数依赖

定义:设X,Y是关系R的两个属性集合,存在X→Y,若X’是X的真子集,存在X’→Y,则称Y部分函数依赖于X。

需要借用知乎刘慰教师的例子用一下,自己也理解了很长时间。

第一范式,第二范式,第三范式,BCNF范式理解

码用(学号+课程),为什么要加课程呢?因为不同课程成绩是通过学号查不出来的。

不过用(学号+课程)当作码是不是有些问题?

(学号+课程)->姓名,但是学号->姓名

(学号+课程)->系名,但是学号->系名

(学号+课程)->系主任,但是学号->系主任

这个就是部分依赖,说实话我看定义一脸懵逼。

要是上面那张表符合第二范式。需要将表拆分为两张表。

一张是 学号、课程、分数表

另外一张是 学号、姓名、系名、系主任表

第一范式,第二范式,第三范式,BCNF范式理解


传递函数依赖

设X,Y,Z是关系R中互不相同的属性集合,存在X→Y(Y !→X),Y→Z,则称Z传递函数依赖于X。

https://blog.csdn.net/rl529014/article/details/48391465

采用这位大佬的例子
在关系R(学号 ,宿舍, 费用)中,(学号)->(宿舍),宿舍!=学号,(宿舍)->(费用),费用!=宿舍,所以符合传递函数的要求

第三范式

满足第二范式的条件下不存在传递函数依赖。

要满足第三范式,在分成两张表的时候第二张表还是有问题?

学号->系名,系名->系主任 传递依赖。

需要将系名和系主任另外新建一张表。

第一范式,第二范式,第三范式,BCNF范式理解

总结:

第一范式:简单说 列不能再分

第二范式:简单说 建立在第一范式基础上,消除部分依赖

第三范式:简单说 建立在第二范式基础上,消除传递依赖。


码:表中可以唯一确定一个元组的某个属性(或者属性组),如果这样的码有不止一个,那么大家都叫候选码,我们从候选码中挑一个出来做老大,它就叫主码。

主属性:一个属性只要在任何一个候选码中出现过,这个属性就是主属性。

非主属性:与上面相反,没有在任何候选码中出现过,这个属性就是非主属性。

BCNF范式

https://www.2cto.com/database/201404/290140.html

BCNF是3NF的改进形式

一个满足BCNF的关系模式的条件:

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

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

3.没有任何属性完全函数依赖于非码的任何一组属性。

第一范式,第二范式,第三范式,BCNF范式理解

如上表

(仓库名,管理员)->(物品名,数量)

(管理员,物品名)->(仓库名,数量)

但是(仓库名)->(管理员) 不满足第二条

所以需要改成两种表:

第一张:仓库名,管理员

第二张:仓库名,物品名,数量

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/142137.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • oracle函数的创建

    oracle函数的创建函数和存储过程有一定的相似之处,函数用于返回特定的数据,当建立函数时,在函数头部就会包含return字句,而在函数体内必须包含return语句返回的数据,可以使用createfunction来创建函数。案例1输入雇员的姓名,返回雇员的年薪。创建函数:createorreplacefunctionc_hs1(srnamevarchar2)returnnumber …

    2025年9月4日
    5
  • VBScript FormatDateTime 函数

    定义和用法FormatDateTime函数可格式化并返回一个合法的日期或时间表达式。语法FormatDateTime(date,format)参数描述date必需的。任何合法的日期表达式。(比如Date()或Now())format可选的。规定所使用的日期/时间格式的格式值。format参数:常数值描述…

    2022年4月7日
    38
  • oracle一次提交大量数据_oracle修改数据

    oracle一次提交大量数据_oracle修改数据StringBuilderstrSql=newStringBuilder();strSql.Append(“insertintoLB000(“);strSql.Append(“LBID,CARRIER,COMPANY_NAME,DOM_ASTD_WGT,FRN_ASTD_WGT,DOM_CSTD_WT,FRN_CSTD_WT,DOM_ISTD_WT,FRN_ISTD_WT,DOM_CREW…

    2025年9月24日
    7
  • Linux安装nmtui(nmtui连接wifi)

    Step1yuminstallNetworkManager-tuiStep2systemctlstartNetworkManagerStep3nmtui

    2022年4月18日
    173
  • Kaptcha验证码SSM实现

    Kaptcha验证码SSM实现Kaptcha验证码SSM实现CodeUtil静态类:用于接收验证码图片上字符串及验证码框里字符串,并且比较两者,相等返回ture。importjavax.servlet.http.HttpServletRequest;publicclassCodeUtil{publicstaticbooleancheckVerifyCode(HttpServletRequest…

    2022年6月22日
    51
  • 高通IMEI写入最新版_博思得g3106打印机设置

    高通IMEI写入最新版_博思得g3106打印机设置检查自己写的pdaf驱动是否正确主要就是依据打印出来的pdaflog,那如果log出不来肯定是有问题的,接下来说下如何排查问题:1:首先我们要检查sensor驱动h文件有没有打开pdaf,如果没有打开pdaf的log肯定出不来的。2:然后要检查otp驱动是否加载正确,因为otp中有pdaf相关的校正。3:效果目录3A文件的log有没有打开(举个例子)sen

    2025年8月29日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号