数据库的范式(第一范式,第二范式,第三范式,BCNF范式)「建议收藏」

在了解范式之前我们先了解下数据库中关于码的概念1.码1.超码能够唯一标识元组的某一属性或属性组,任何包含超码的超集也是超码,这里唯一标识元组可以简单的理解为根据某一个字段或几个字段的值,查询出某一行特定的数据2.候选码从超码中选出的最小的码,即其任何真子集都不能满足条件。即属性不可再删减。3.主码从候选码中选出一个作为主码。2.范式(NF)范式:符合某一种级别的关系模式的集合,简…

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

在了解范式之前我们先了解下数据库中关于码的概念

1.码

1.1 超码

能够唯一标识元组的某一属性或属性组,任何包含超码的超集也是超码,这里唯一标识元组可以简单的理解为根据某一个字段或几个字段的值,查询出某一行特定的数据

1.2 候选码

从超码中选出的最小的码,即其任何真子集都不能满足条件。即属性不可再删减。

1.3 主码

从候选码中选出一个作为主码。

2.范式(NF)

范式:符合某一种级别的关系模式的集合,简而言之就数据库表设计的标准级别,范式有1NF,2NF,3NF,BCNF,4NF等,通常高级别的范式包含低级别的范式。数据库的设计一般到BCNF即可,有时候为了性能要就也会

2.1 1范式(1NF)

1范式:关系中的表的属性不可再分割。
举个简单的例子,有个学生表,有以下字段,sid,sname,address,sid为主键,sname为学生姓名,address为地址,地址的数据可能包括省份,城市,街道之类的。日后可能我们需要单独统计有个城市有多少学生之类的,而将这么多信息合成一个属性,即不符合第1范式,属性应该分割成省份,城市等多个字段,来满足业务要求。

2.2 2范式(2NF)

2范式:消除非主属性对码的部分函数依赖。
函数依赖:简单的说,如果对于每个x属性或属性组都有对应的确切的y值与之对应,则称Y函数依赖于x。记做 x->y
完全函数依赖:有x->y,但对于x的任意真子集都不存在x’->y,称之为完全函数依赖。比如有一张成绩表,有若干字段,学号,课程,成绩。
(学号,课程)->成绩,任意(学号) !-> 成绩,(课程)!-》成绩,我们称成绩完全依赖于(学号,课程)
部分函数依赖:Y函数不完全依赖于x叫部分函数依赖,例如(学号,课程)->课程名),学号和课程名无关,即(课程)->课程名。

2.3 3范式(3NF)

3范式:消除非主属性对码的传递函数依赖
传递函数依赖
一个关系R(U),X,Y,Z为属性集U上的子集,其中存在X→Y和Y→Z,但Y不决定X,即 Y!->X 同时Y不包含Z,则存在X→Z,即X传递函数决定Z,Z传递函数依赖于X。
例如:商品表:商品名->仓库,仓库!->商品,仓库->仓库管理员,仓库管理员 !->仓库(假定一个仓库可以有多个管理员)

2.4 BCNF范式(BCNF)

BCNF范式:消除主属性之间的间接函数依赖和传递函数依赖。

3.总结

一般我们数据库设计到3范式或BCNF范式即可,但是在实际项目中总是在性能和扩展性中做取舍。数据库设计标准越高,可扩展性越好,耦合性越低,但性能也会受损。所以有时候会到2范式,为了减少表与表之间的关联,加快查询速度,各种利弊还需自己权衡。

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

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

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


相关推荐

  • 年薪500万大数据工程师:讲解大数据建模方法和经验

    年薪500万大数据工程师:讲解大数据建模方法和经验大数据前言:建模的过程和方法是不断发展和完善的。可以说,不同的数据类型、不同的业务场景和不同的需求将有不同的建模方法。我同意他们的观点。但我想说的是,无论您的数据是什么,在大数据中构建自己的数据模型是很正常的。1。数据准备两。开展探索性数据分析三。初始模型的建立四。模型迭代构造分享大数据学习交流群:722680258零基础中高级视频资料,欢迎加入不定期分享资源数据准备:在大数据计算中没有太多的数据…

    2022年5月25日
    49
  • 视图索引问题

    视图索引问题  最近和一直在研究如何加快查询数据库的速度,看了网络上说用索引,会加快查询的速度.我就认真看了索引了一些文章,也建立了表索引.但是在建立视图索引的时候遇到问题了, 无法在视图 SBK_VIEW 上创建 索引,因为该视图未绑定到架购.查一下相关的资料,发现:定义索引视图的  SELECT  语句不得包含视图、行集函数、行内函数或派生表。同一物理表在该语句中只能出现一次

    2022年7月22日
    16
  • 淘宝网店装修代码使用方法大全图_淘宝店铺装修代码用什么软件做的

    淘宝网店装修代码使用方法大全图_淘宝店铺装修代码用什么软件做的公告栏大小:宽不要超过480像素,高可以随意代码:店铺公告地址”/>要求:图片一定要通过网上空间或相册放置:管理我的店铺——基本设置——公告可以预览看一下悬挂饰物代码::你图片的地址”style=”left:20px;position:relative;top:0px”/>要求:不能是自己电脑上的图片,要在网上的图片地址才行放置:管理我的店铺—

    2025年6月25日
    3
  • 联想Win10安装Ubuntu双系统教程

    联想Win10安装Ubuntu双系统教程前言:最近为了更好的做一名程序员(猿),所以准备装一个双系统,也就是Ubuntu系统,网上坑太多,所以决定自己写一点操作步骤首先看一下我的计算机配置,联想小新700Tip:这里的安装步骤仅仅针对联想Win10改型号或者相关型号,其他品牌型号安装过程可能有所差异,在这里不多说(因为穷,没用过其他的)首先要明确装双系统有一个步骤,在这里分为:(1)下载Ubuntu镜像文件;(2…

    2022年7月24日
    26
  • ABP源码分析十四:Entity的设计

    ABP源码分析十四:Entity的设计

    2021年9月13日
    42
  • idea maven创建springboot项目_springboot项目

    idea maven创建springboot项目_springboot项目前言:如今springboot越来越火,越来越多的公司选择使用springboot作为项目的开发框架,其设计目的就是用来简化spring项目的搭建和开发过程,省略了传统spring、springmvc项目繁琐的配置,可以让开发人员快速上手。下面详细说明下如何使用idea创建我们的第一个springboot项目:首先打开idea主界面选择CreateNewProject在弹…

    2022年10月13日
    2

发表回复

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

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