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

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

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

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


实体完整性

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

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

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

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

参照完整性

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

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

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

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

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

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

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

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

而参照完整性,就是指如果属性(或属性组)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)
上一篇 2022年7月16日 下午4:16
下一篇 2022年7月16日 下午4:36


相关推荐

  • 网络协议学习:通用网络虚拟化封装GENEVE

    网络协议学习:通用网络虚拟化封装GENEVEGENEVE GenericNetwo 通用网络虚拟化封装 是一种虚拟化隧道通信技术 定义于 RFC8926 相比于之前类似的技术 GENEVE 的一点重大区别在于 协议的元数据本身是可扩展的 GENEVE 提供了可扩展的 GENEVEheader 让业务更加灵活

    2026年3月17日
    2
  • react 创建新页面_如何新建react项目「建议收藏」

    在开发React项目前最关键的当然是项目的创建,现在的前端工程化使得前端项目的创建也变得越来越复杂,今天我们介绍的是浏览器中直接引入的方式搭建react项目。如何新建react项目前文中,我们介绍过了2种react项目的搭建方式,分别是webpack的方式搭建和create-react-app脚手架的方式搭建感兴趣的同学可以点击下方链接,进行学习。webpack的方式搭建项目:怎样搭建rea…

    2022年4月14日
    141
  • Layui treeTable相关

    Layui treeTable相关layui官网是没有treeTable这个功能的,需要下载额外的插件实现,幸运的是有符合layui风格的treeTable插件,此篇围绕树状表格讲述。treeTable官网指路:https://gitee.com/whvse/treetable-lay/wikis/pages下载有Gitee账号官网TreeTable资源下载路径:https://gitee.com/whvse/treetable-lay无Gitee账号导入treeTable的导入方式和layui其他组件一样,都是通过layui

    2022年5月6日
    57
  • 鱼骨图实践

    鱼骨图实践

    2022年1月19日
    64
  • Pycharm中使用pyinstaller给项目打包

    Pycharm中使用pyinstaller给项目打包1 安装 pyinstaller 之前直接用 pycharm 或者 pip 安装的 pyinstaller 打完的包总是缺很多东西 但缺的东西都乱七八糟 和我本身打包没有关系 也运行不了 这个应该是 pyinstaller 版本的问题参考这篇的第四部分 https blog csdn net wardseptembe article details 如果不能访问国外网络 去 https github com pyinstaller pyinstaller 下载 pyinstaller 进入界面

    2026年3月27日
    2
  • 手游服务端架设一条龙_vm服务器

    手游服务端架设一条龙_vm服务器本文作者:smeli(俄罗斯人,于2009年完成该教程)PS:要比国内写的那些教程完整,详细,希望大家喜欢VS运行库安装………………………………………..2SQL数据库安装…………………………………………..3L2Server设置………………………………………………11GM账户创建………………………………………….15运行服务端(1)…

    2025年10月3日
    5

发表回复

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

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