参考资料

  • 数据库管理系统原理与设计(Database Mangement System 3rd)
  • 百度
  • wiki

术语对照

  • 码 = 键 = Key
  • 码约束 = Key Constraints

码约束

码(key)

能够唯一区分关系中各个记录的最小字段集合称为码(Key)。

唯一性

要作为一个关系表的码那么它肯定是在所有记录中都唯一的,否则给出一个码就不能唯一的获得一条记录。由于字段意义是于实际业务强关联的,唯一性也需要根据实际进行分析定义。如一个学校可以根据每个人得学号唯一的找到学生,但是当系统扩展到多个学校时,学号就不具有唯一性了。

最小

码除了唯一性要求外还要求它是满足唯一性的最小的一个字段集合。这个表达起来可能有些歧义,这个最小是相对于已经能够体现唯一性的条件的字段集合来说的。即码中不能有对体现唯一性没有帮助的字段。举个例子在某个地区几个学校中确定一个学生可以使用(学校id,学生校内id)作为一个码,此时将什么班级编号加入其中并没什么用。或者说码中字段的子集肯定不具有唯一性。

对于上面的例子还可以把(学校id,校内年级序号,班级序号,班内学生序号)作为一个码,所以码的最小这个约束是对已经具有唯一性的一个字段集合来讲的,而不是各个具有唯一性的码集合之间选择包含字段数最少的一个。因此码可以存在多个。

候选码(candidate key)

即关系上的所有码

主码(primary key)

从候选码里挑一个作为主要查询依据,是一个人为选择的结果。

超码 (super key)

包含码的一个字段集合

范式

范式就跟设计模式一样,是人为指定的规范形式。它主要用来消除数据库存储时的冗余和操作异常。一般数据库设计应该符合3NF,BCNF。

范式种类

1NF

第一范式要求关系模式R中的每个元素都是不可再分的,即数据表中的列已经是基本字段了。比如一个存储地址信息可以是将省市区街道连起来做为一个单一字段,也可以是把各个级别分别存储。这取决于系统中是否需要细粒度的区域地址信息,其实就是从使用需求上来看该字段是否可分。

另外一列中也不能出现同类型字段值组合的情况,而是应该分成多行进行记录。如关系take_course(name, course),不能出现

Mao, Math&Science

这样的情况而是应该存储为

Mao, Math
Mao, Science

不过许多系统会把某一个长整数类型的列用来存储权限,不同的bit代表不同的权限。权限列实际上存储了组合值,一定程度上违反了1NF。不过由于这样存储的权限值一般也不会用于连接或者做特定权限的选择(比如选出所有具有删除权限的用户)操作,是可以接受的。当系统内权限类型比较多且会动态添加或者改变时就不能使用这种方案了。

2NF

第二范式要求表中记录能被唯一的区分,且不存在部分依赖,且满足第一范式。

唯一区分

为了唯一区分关系表中的记录,可以选择一个码作为区分依据。

部分依赖

如果有依赖X->A,那么就是X决定A,相当于一个函数的关系,比如身份证号->姓名。X和A可以对应字段集合。关系表R中的部分依赖就是对于一个依赖X->A中的X仅仅是关系码中的部分字段。举个例子如果有关系(班级编号,班内学生编号,学生姓名,学生平均分,班主任),可以选择(班级编号,班内学生编号)作为码,但这个关系中存在一个部分依赖:班级编号->班主任。

可见如果有多少个学生,班主任这个字段就要被存储多少次。但实际上班主任字段被存储的次数应该只需好班级数目想匹配即可(毕竟一个班级一个班主任)。如果某个班级更换了班主任,则更新操作需要比分开存储多做许多(只需一次更新)。

3NF

第三范式要求满足2NF,且不存在多数传递依赖。对于关系R上的所有依赖X->A满足:

  1. A是X的一部分
  2. X是R的超码
  3. A是R的码的一部分

假设存在一个关系:take_course(student, course, book, price, press)就有依赖course->book(属于部分依赖违反2NF), book->price(属于传递依赖,book不是R的超码,price也不是码的一部分)。所以应该分为三个关系take_course(student, course),course_book(course, book),bookinfo(book, price, press)

BCNF (boyce-codd NF)

对于关系R上的所有依赖X->A满足:

  1. A是X的一部分
  2. X是R的超码

它的定义比3NF更严格一些。可以理解为每个属性都是在描述由码确定的当前实体或者关系。

数据库概念:码 键 Key & 范式 Normal Form的更多相关文章

  1. 探索Redis设计与实现9:数据库redisDb与键过期删除策略

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  2. 【Normal Form】数据库表结构设计所遵从的范式

    参考的优秀文章 数据库(第一范式,第二范式,第三范式) 数据库设计是件严肃.关键的事儿,一毕业,加入一个大型的行业项目,那儿的前辈资深工程师,就给我灌输数据库如何关键.神圣.深不可测的观念,所以,我一 ...

  3. 数据库范式小结 1NF 2NF BCNF 3NF 4NF DB normal form

    1. 1NF指关系中的每个变量不可再分 2. 2NF指消除了非主属性对码(candidate key)的部分依赖的1NF 比如(S#,C#)-> SN ,(S#,C#)-> SD .S#- ...

  4. 关系数据库 范式(NF: Normal Form) 说明

    关系数据库 范式(NF: Normal Form) 说明 数据库电话insertdelete存储oracle   目录(?)[+]   一.范式概述(NF:NormalForm) 数据库的设计范式是数 ...

  5. Redis源码解析:09redis数据库实现(键值对操作、键超时功能、键空间通知)

    本章对Redis服务器的数据库实现进行介绍,说明Redis数据库相关操作的实现,包括数据库中键值对的添加.删除.查看.更新等操作的实现:客户端切换数据库的实现:键超时相关功能的实现.键空间事件通知等. ...

  6. Database: Normal form

    refer to wikipedia--- 1NF(first normal form): 1. There's no top-to-bottom ordering to the rows. 2. T ...

  7. MySQL数据库建立外键失败的原因总结

    在MySQL数据库创建外键时,经常会发生一些错误,这是一件很令人头疼的事.一个典型的错误就是:Can’t create table... 的错误.在很多实例中,这种错误的发生都是因为mysql一直以来 ...

  8. First normal formal Second normal form

    https://en.wikipedia.org/wiki/First_normal_form https://en.wikipedia.org/wiki/Second_normal_form A r ...

  9. 【Redis】命令学习笔记——键(key)(20个超全字典版)

    安装完redis和redis-desktop-manager后,开始学习命令啦!本篇基于redis 4.0.11版本,从对键(key)开始挖坑! 准备工作,使用db1(默认db0,由于之前练习用db0 ...

随机推荐

  1. sax解析xml,验证格式并支持自定义标签

    一.sax简介 SAX是事件驱动型的XML解析方式.顺序读取XML文件,生成事件,传播到用户定义的回调方法中来处理XML文件. 优点: 分段处理xml,而不是将整个xml一次加载进内存,内存占用少,速 ...

  2. Swfit 里 Array(五)和 NSArray 转换

     只看 Swift Array 到 NSArray Array 里的源代码 extension Array { @inlinable public // @SPI(Foundation) func ...

  3. D3.js (v3)+react框架 基础部分之认识选择集和如何绘制一个矢量图

    首先需要下载安装d3.js  :  yarn add d3 然后在组建中引入 :  import * as d3 from 'd3' 然后定义一个方法,在componentDidMount()这个钩子 ...

  4. 《Python编程从入门到实践》--- 学习过程笔记(3)列表

    一.用[](方括号)表示列表,用,(逗号)分隔其中的元素. >>> name=['limei', 'hanmeimei', 'xiaoming'] >>> prin ...

  5. C#递归方法遍历目录及子目录

    众所周知,获得某一目录下第一级的所有文件和文件夹列表,很容易办到:DirectoryInfo di=new DirectoryInfo(strBaseDir);//strBaseDir是起始目录,绝对 ...

  6. Django设置联合唯一约束 -- migrate时报错处理

    异常信息: a unique database constraint for 2 or more fields together 场景描述: 对于ORM中多对多关系的中间表,如果该关系表是手动创建的, ...

  7. Docker 创建 mysql 容器

    docker -v Docker version 18.06.1-ce, build e68fc7a   拉取 docker mysql 最新的镜像 docker pull mysql   Using ...

  8. MySQL笔记(1)---MySQL体系结构和存储引擎

    1.前言 本系列记录MYSQL数据库的一些结构和实现特点,方便查询. 2.基本概念 数据库:物理操作系统文件或者其他形式文件类型的集合.MySQL中数据库文件可以是frm.MYD.MYI.ibd结尾的 ...

  9. 修改gitlab仓库地址

    最近使用GitLab 搭建了Git的私有仓库,但是发现私有仓库的地址是一串序列号,搞了半天克隆时都是提醒仓库无效,后来才觉得不对,不是本机的IP地址如图 对此我们需要修改gitlab.yml文件: 1 ...

  10. 微信小程序(wx:for)遍历对象

    最近在折腾微信小程序,遇到这么一个情况:后端返回一个key-value的对象数据,需要遍历对象的key-value,然后渲染到视图中.就像下面这样: { '2018-1-9':{ address: ' ...