数据库关系模型的三类完整性约束[通俗易懂]

数据库关系模型的三类完整性约束[通俗易懂]关系模型中有三类完整性约束,分别是:实体完整性,参照完整性,用户定义完整性实体完整性定义:实体完整性是用于保证关系数据库中每个元组都是可区分的,唯一的。它的意思就是说数据表中每一行都应该有办法将其唯一区分开来,这自然指的就是主键了,而且主键必须不能为空或部分为空。那么它大可以直接叫一些诸如“要有主键”等通俗的名字,但是为何要叫实体完整性呢?首先第一点,“实体完整性”这个名字听起来就很高…

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

关系模型中有三类完整性约束,分别是:实体完整性,参照完整性,用户定义完整性


实体完整性

定义:实体完整性是用于保证关系数据库中每个元组都是可区分的,唯一的。

它的意思就是说数据表中每一行都应该有办法将其唯一区分开来,这自然指的就是主键了,而且主键必须不能为空或部分为空。

那么它大可以直接叫一些诸如“要有主键”等通俗的名字,但是为何要叫实体完整性呢?
首先第一点,“实体完整性”这个名字听起来就很高大上,嘿嘿;
好了不开玩笑了,说认真的。

  • 一个基本表实际上是对应了现实生活中的一个实体集的,比如学生关系就对应了学生的集合,因此我们所谓的表,其实就相当于现实生活中的某一种实体的集合。
  • 而现实生活中的实体都是可以唯一区分的,他们本身就都具有了某种唯一性标识,比如学生的学号,人的身份证等等。
  • 所以既然我们的表是相对于实体集的,那么表中必然需要一个主键来作为这个实体在被抽象后的唯一标识
  • 而主键不能为空就更好理解了,主键要是为空了那还拿什么来唯一标识这个实体呢?即这样就会存在不可区分的实体了,那就和我们上面讲的矛盾了。
  • 因此,这个规则就叫做实体完整性,私下里(不正式啊,只是辅助理解与记忆)可以理解为主键完整性。

参照完整性

参照完整性中的参照,说白了就是数据表里的外键。
举个例子,下面有三个关系:

学生(学号,姓名)
课程(课程号,课程名)
选修(学号,课程号,成绩)

显然,在选修关系中的学号,必须是学生表里真正存在的学号,且选修表里的课程号,也必须是课程表里真正存在的课程号。这就是参照完整性的一个典型表现了。

在上面的例子中,选修表中的学号就称为选修表的一个外码,它对应的是学生表中的学号。并且称选修关系为参照关系,而学生关系为被参照关系

但是仅仅这么说还有很多细节没有讲到,下面我们理一理外码的定义。
首先要知道,外码不能是这个关系(参照关系)的主码,但是是它参照的关系(被参照关系)的主码。
什么意思呢,就是说学号这个属性在学生表中是主码,而在选修表中不是,这就称学号是选修表中的一个外键(课程号同理)。

而且参照关系和被参照关系可以是同一个关系,比如:

学生(学号,姓名,班级,班长)

在上面的关系中,班长属性保存的是班长的学号,那么这就是自己参照自己了。
即“班长”是外码,而学号是主码。

而参照完整性,就是指如果属性(或属性组)F是关系R的外码,且对应了关系S的主码K(R和S可以是同一个关系),那么对于R中的每个元组中的F上的值,必须满足:
(1) 要么F取空值
(2) 要么等于S中某个元组的主码的值

比如上面那个学生的例子,或许那个班级还没有选出班长,则班长属性为空。而如果选出了班长,那么班长必然是某一个学生,则他的学号一定是在所有的学号中的某一个。

用户定义的完整性

任何关系型数据库,都一定要支持实体完整性和参照完整性。
但同时往往在不同的情况下,我们还需要一些特殊的约束条件,比如性别只能是男或女,年龄不能超过150岁等等。
这种针对某一具体关系数据库的约束条件称为用户定义的完整性,它反映某一具体应用所涉及的数据必须满足的语意要求。

Additionally

另外,还有一种说法,说关系模型有四种完整性约束,而另外那种完整性约束即为—— 域完整性

域完整性:(Domain Integrity)是指数据库表中的列必须满足某种特定的数据类型或约束。其中约束又包括取值范围、精度等规定

不过我觉得,域完整性其实就是所谓的用户定义的完整性…

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

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

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


相关推荐

  • 数据库设计概念结构设计_数据库设计典型实例

    数据库设计概念结构设计_数据库设计典型实例文章目录数据库设计概念设计结构概念结构设计ER模型的基本元素实体/实体集属性区别实体和属性联系二元联系的关系1:11:nm:n一元联系1:11:nm:n三元联系采用ER模型的概念设计设计局部ER模型例题设计全局ER模型全局ER模型的优化数据库设计数据库设计:构造最优的数据模型,建立数据库及其应用系统的过程数据库设计的好坏非常重要概念设计结构概念设计的目标是产生反映用户需求的数据库概念结构,即概念模型概念模型具有硬件独立、软件独立的特点处于一个桥梁作用概念设计的主要步骤

    2022年10月12日
    4
  • ireport使用教程视频_proe拖动图形

    ireport使用教程视频_proe拖动图形iReport使用教程【原创】iReport与JasperReport简介1.1  简介JasperReport是报表的引擎部分,界面设计是用iReport。为什么选择这两个软件呢?因为这两个软件都是开源的,即免费的(虽然某些文档收费,但是磨灭不了我们使用它的理由)。JasperReport是一个报表制作程序,用户按照它制定的规则编写一个XML文件,然后得到用户需要输出的

    2025年10月23日
    4
  • Python 数组操作_python中数组的表示形式

    Python 数组操作_python中数组的表示形式文章目录前言 一、numpy是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言在python中本身有着列表等数据结构,但是列表只是一种数据的存储容器,不具备任何计算能力。故引入数组的概念。提示:以下是本篇文章正文内容,下面案例可供参考一、numpy是什么?NumPy是一种非常常用的第三方模块,在学习数据分析及挖掘时经常能够用到他。接下来就阐述一些使用numpy进行的基本操作。二、使用步骤1.引入库代码如下(示例):i…

    2022年8月13日
    7
  • SpringBoot集成Redis,并自定义对象序列化

    SpringBoot集成Redis,并自定义对象序列化SpringBoot项目使用redis非常简单,pom里面引入redis的场景启动器,在启动类上加@EnableCaching注解,项目启动会自动匹配上redis,这样项目中就可以愉快地使用了,使用方法:要么使用@Cacheable一类的注解自动缓存,要么使用RedisTemplate手动缓存。(前提是你的本机或者是远程主机要先搭好redis环境)虽然SpringBoot好用,但这里也有好多…

    2022年9月22日
    3
  • Android定时器Timer简单使用「建议收藏」

    Android定时器Timer简单使用「建议收藏」Android定时器Timer简单使用Timer简介Timer使用总结Timer简介Timer(计时器)位于java.util包下,可用于创建定时任务,任务可以安排为一次性执行,也可以定期重复执行。每个计时器对象对应一个后台线程(TimerThread)。简单理解为创建Timer对象,对应TimerThread线程循环开始从TaskQueue队列中执行一个TimerTask任务。Timer使用创建Timer对象vartimer=Timer()添加需要执行的任务//创建计

    2022年7月25日
    11
  • java字符串转换为json对象6_Json对象与Json字符串的转化、JSON字符串与Java对象的转换…

    java字符串转换为json对象6_Json对象与Json字符串的转化、JSON字符串与Java对象的转换…一.Json对象与Json字符串的转化1.jQuery插件支持的转换方式:$.parseJSON(jsonstr);//jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象2.浏览器支持的转换方式(Firefox,chrome,opera,safari,ie9,ie8)等浏览器:JSON.stringify(obj)将JSON转为字符串。JSON.par…

    2022年10月6日
    2

发表回复

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

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