数据库关系模型的三类完整性约束[通俗易懂]
大家好,又见面了,我是你们的朋友全栈君。
关系模型中有三类完整性约束,分别是:实体完整性,参照完整性,用户定义完整性
实体完整性
定义:实体完整性是用于保证关系数据库中每个元组都是可区分的,唯一的。
它的意思就是说数据表中每一行都应该有办法将其唯一区分开来,这自然指的就是主键了,而且主键必须不能为空或部分为空。
那么它大可以直接叫一些诸如“要有主键”等通俗的名字,但是为何要叫实体完整性呢? 首先第一点,“实体完整性”这个名字听起来就很高大上,嘿嘿; 好了不开玩笑了,说认真的。
- 一个基本表实际上是对应了现实生活中的一个实体集的,比如学生关系就对应了学生的集合,因此我们所谓的表,其实就相当于现实生活中的某一种实体的集合。
- 而现实生活中的实体都是可以唯一区分的,他们本身就都具有了某种唯一性标识,比如学生的学号,人的身份证等等。
- 所以既然我们的表是相对于实体集的,那么表中必然需要一个主键来作为这个实体在被抽象后的唯一标识
- 而主键不能为空就更好理解了,主键要是为空了那还拿什么来唯一标识这个实体呢?即这样就会存在不可区分的实体了,那就和我们上面讲的矛盾了。
- 因此,这个规则就叫做实体完整性,私下里(不正式啊,只是辅助理解与记忆)可以理解为主键完整性。
参照完整性
参照完整性中的参照,说白了就是数据表里的外键。 举个例子,下面有三个关系:
学生(学号,姓名)
课程(课程号,课程名)
选修(学号,课程号,成绩)
显然,在选修关系中的学号,必须是学生表里真正存在的学号,且选修表里的课程号,也必须是课程表里真正存在的课程号。这就是参照完整性的一个典型表现了。
在上面的例子中,选修表中的学号就称为选修表的一个外码,它对应的是学生表中的学号。并且称选修关系为参照关系,而学生关系为被参照关系。
但是仅仅这么说还有很多细节没有讲到,下面我们理一理外码的定义。 首先要知道,外码不能是这个关系(参照关系)的主码,但是是它参照的关系(被参照关系)的主码。 什么意思呢,就是说学号这个属性在学生表中是主码,而在选修表中不是,这就称学号是选修表中的一个外键(课程号同理)。
而且参照关系和被参照关系可以是同一个关系,比如:
学生(学号,姓名,班级,班长)
在上面的关系中,班长属性保存的是班长的学号,那么这就是自己参照自己了。 即“班长”是外码,而学号是主码。
而参照完整性,就是指如果属性(或属性组)F是关系R的外码,且对应了关系S的主码K(R和S可以是同一个关系),那么对于R中的每个元组中的F上的值,必须满足: (1) 要么F取空值 (2) 要么等于S中某个元组的主码的值
比如上面那个学生的例子,或许那个班级还没有选出班长,则班长属性为空。而如果选出了班长,那么班长必然是某一个学生,则他的学号一定是在所有的学号中的某一个。
用户定义的完整性
任何关系型数据库,都一定要支持实体完整性和参照完整性。 但同时往往在不同的情况下,我们还需要一些特殊的约束条件,比如性别只能是男或女,年龄不能超过150岁等等。 这种针对某一具体关系数据库的约束条件称为用户定义的完整性,它反映某一具体应用所涉及的数据必须满足的语意要求。
Additionally
另外,还有一种说法,说关系模型有四种完整性约束,而另外那种完整性约束即为—— 域完整性
域完整性:(Domain Integrity)是指数据库表中的列必须满足某种特定的数据类型或约束。其中约束又包括取值范围、精度等规定
不过我觉得,域完整性其实就是所谓的用户定义的完整性…
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/160200.html原文链接:https://javaforall.cn
相关文章
- SQL Server——数据库创建及修改[通俗易懂]
- linux下连接mysql数据库命令,linux连接mysql命令[通俗易懂]
- 数据库基础(常用SQL语句)[通俗易懂]
- 医院管理数据库课程设计[通俗易懂]
- 在哪下载Mysql数据库的JDBC驱动jar包[通俗易懂]
- 从零到上亿用户,我是如何一步步优化MySQL数据库的?(建议收藏)[通俗易懂]
- 数据库表设计 基本思路[通俗易懂]
- Springboot连接mysql数据库中文乱码[通俗易懂]
- 关系型数据库的发展历史[通俗易懂]
- MySQL数据库入门学习(多图预警+新手向~)[通俗易懂]
- MySQL 数据库基础知识(系统化一篇入门)[通俗易懂]
- MySQL数据库免安装版配置教程及常见问题[通俗易懂]
- 行存储(关系型数据库)与列存储(hbase,es聚合的doc_value)[通俗易懂]
- Visual Studio 连接SQL Server数据库[通俗易懂]
- JDBC_4数据库连接池[通俗易懂]
- mysql 数据库表结构设计与规范[通俗易懂]
- oracle rac数据库srvctl命令格式参考[通俗易懂]
- oracle数据库索引增加和删除[通俗易懂]
- 大白话之数据库事务
- 数据库删除语句[通俗易懂]
- oracle截取字符添加数据库,oracle截取字符串前几位的方法_数据库[通俗易懂]
- 数据库表的约束条件[通俗易懂]
- SQL 碎碎念,你可能用不到但不能不知道的数据库技巧(1)
- sql server 2008 如何压缩备份大的数据库操作方法
- 操作快速又简单:PHP进行MySQL数据库操作(php写mysql数据库)
- 快速初始化mysql数据库(初始化mysql数据库)
- Oracle数据库:高效且可靠的数据库解决方案(oracle数据库的优点)
- MySQL数据库中的时间类型详解(mysql时间的类型)
- 建立MySQL数据库的复制构建表(mysql复制建表)
- MySQL数据库存在哪些缺点,你必须知道(mysql数据库缺点)
- 虚拟机搭建分享Oracle数据库(虚拟机共享oracle)
- 快速掌握如何删除MySQL数据库(如何删除mysql数据库)
- MySQL轻松下载,快速开启数据库之旅(mysql下载简单)
- 解析Oracle数据库事务数统计指标(oracle事务数统计)
- Oracle数据库的概述及其基本特点(oracle(一))
- mysql仿asp的数据库操作类
- 如何备份MySQL数据库