关系数据库——关系操作和关系完整性

2023-11-15

一、关系操作

1.基本的关系操作

常用的关系操作
查询(Query)操作和插入(Insert)、删除(Delete)、修改(Update)操作两大部分。

关系的查询表达能力很强,是关系操作中最主要的部分。

查询操作又可以分为:
选择(Select)、投影(Project)、连接(Join)、除(Divide)、并(Union)、差(Except)、交(Intersection)、笛卡尔积等。
其中选择、投影、并、差、笛卡尔积是5种基本操作。
其他操作是可以用基本操作来定义和导出的。就像乘法可以用加法来定义和导出一样。

关系操作的特点是集合操作方式,即操作的对象和结果都是集合。这种操作方式也称为一次一集合(set-at-a-time)的方式。相应地,非关系数据模型的数据操作方式则为一次一记录(record-at-a-time)的方式。

2.关系数据语言的分类

关系代数语言

用对关系的运算来表达查询要求
代表:ISBL

关系演算语言

谓词来表达查询要求。

  1. 元组关系演算语言:谓词变元的基本对象是元组变量
    代表:APLHA,QUEL
  2. 域关系演算语言:谓词变元的基本对象是域变量
    代表:QBE

具有关系代数和关系演算双重特点的语言

代表:SQL (Structured Query Language)


二、关系的完整性

关系模型中有三种完整性:实体完整性、参照完整性和用户定义的完整性。
其中,实体完整性和参照完整性是关系模型中必须满足的完整性约束条件,被称作是关系的两个不变性

名词解释

  1. 候选码:属性组(单个属性也可做一组),该属性组的值能唯一地标识一个元组,而其子集不能。
  2. 主属性:候选码里的诸属性。
  3. 非码属性:不在任何候选码中的属性。
  4. 主码:若有多个候选码,选定其中一个为主码(即主码是候选码中的一个)。
  5. 外码:一个或一组属性。不是本关系的码,且是另一个关系的主码。本关系为参照关系,另一个关系为被参照关系。

1.实体完整性(Entity Integrity)

实体完整性规则

若属性A是基本关系R的主属性,则A不能取空值
若主码由若干属性组成,则所有这些主属性都不能取空值。

空值
“不知道”、“不存在”、“无意义”……不是0

说明

  1. 实体完整性的规则是针对基本关系而言的。一个基本表通常对应显示世界的一个实体集
  2. 现实世界中的实体是可区分的,即它们有某种唯一性标识
  3. 相应的,关系模型中以主码作为唯一标识
  4. 主码中的属性即主属性不能取空值

2.参照完整性(Referential Integrity)

参照完整性规则

若属性或属性组F是基本关系R的外键,它与基本关系S的主键Ks相对应(基本关系R和S不一定是不同的关系),则对于R中的每个元组在F上的值必须为:
(1)空值,F的每个属性值均为空值。
(2)S中某个元组中的主键值(主码值)。
参照的关系中的属性值必须能够在被参照关系找到或者取空值,否则不符合数据库的语义。
在实际操作时如更新、删除、插入一个表中的数据,通过参照引用相互关联的另一个表中的数据,来检查对表的数据操作是否正确,不正确则拒绝操作。

在这里插入图片描述
参照关系—→被参照关系(目标关系)

显然,目标关系S的主码Ks和参照关系R的外码F必须定义在同一个(或同一组)域上。

引用关系

同一关系
在参照完整性规则中,R和S可以是同一个关系。
在学生(学号,姓名,性别,年龄,专业号,班长)关系中,“学号”属性是主键,“班长”属性表示该学生所在班级的班长的学号,因此它应用的本关系“学号”属性。按照参照完整性规则,“班长”属性可以取以下两类值:
(1)空值,表示该学生所在班级尚未选出班长。
(2)非空值,该值必须是本关系中某个元组的学号值,即某个当选班长的学生的学号值。

两个关系间
如学生实体和专业实体可以用下列关系模式来表示,其中学号是学生的主键,专业号是专业的主键:
学生(学号,姓名,性别,专业号,年龄)
专业(专业号,专业名)
这两个关系之间存在着属性的引用(含有相同的属性“专业号”),学生关系引用了专业关系的主键“专业号”,专业号则是学生关系的外键。而且按照参照完整性规则,学生关系(并非专业关系)中的每个元组的“专业号”属性只能取两种值:
(1)空值,表示尚未给学生分配专业。
(2)非空值,这时该值必须是专业关系中某个元组的“专业号”值,表示该学生不可能分配到一个不存在的专业中去。就是说学生关系中的某个属性的取值需要参照专业关系的属性取值。

两个以上的关系
两个以上的关系也可以存在引用关系,学生、课程、选课(学生与课程)之间的联系可以用下列三个关系来表示:
学生(学号,姓名,性别,专业号,年龄)
专业(专业号,专业名)
选课(学号,课程号,成绩)
这里的“学号”和“课程号”属性都是选课关系的外键,但只有“学号”和“课程号”联合起来才能确定选课的关系,所以这里存在一个复合主键关系,(学号,课程号)是选课关系的主键。虽然按照参照完整性可以取两类值,但是由于实体完整性,复合主键中的每个属性均不能取空值。所以选课关系中的”学号“和”课程号”属性实际上只能取被参照关系(学生关系和专业关系)中已经存在的主键值。即选课关系中的“学号”值必须是确实存在的学生的学号,学生关系中有该学生的记录;选课关系中的“课程号”值也必须是确定存在的课程的课程号,即课程关系中有该课程的记录。

3.用户定义的完整性(User-defined Integrity)

用户自定义完整性指针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求

某个属性必须取唯一值、某个非主属性也不能取空值的
用户定义完整性可以涵盖实体完整性、域完整性、参照完整性等完整性类型。

例如某个属性必须取唯一值,某个非主属性也不能取空值,某个属性的取值范围在0-100之间等

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关系数据库——关系操作和关系完整性 的相关文章

随机推荐

  • 前端购物车,创建订单和支付流程

    前端购物车流程 用户在页面上将商品添加到购物车中 用户可以通过购物车页面查看添加的商品列表及其数量 并对其进行修改和删除 用户确认购物车中的商品无误后 点击 结算 按钮 用户填写收货地址 付款方式等相关信息 确认订单信息 系统生成订单并显示
  • flutter_blue + MethodChannel.invokeMethod + java.lang.NullPointerException

    友盟崩溃日志报了这样一个问题 说是扫描蓝牙设备回调时 MethodChannel 为空 java lang NullPointerException Attempt to invoke virtual method void io flut
  • Logrotate日志切分

    logrotate 程序是一个日志文件管理工具 用来把旧的日志文件更名或删除 并创建新的日志文件 我们把它叫做 转储 是个使日志轮替的程序 有了它就不用看着自己的日志体积一天天的变大 而可以根据你自己的需求来设定日志转储 这个工具对于像ng
  • discuz设置伪静态

    discuz设置伪静态 环境为 centos Apache mysql php 操作后台 点击提交 点击右上角的查看规则 复制一段到新建文件 htaccess中 注 WIN主机就另存为httpd ini Linux主机就另存为 htacce
  • python遍历文件夹下的所有子文件夹,并将指定的文件复制到指定目录

    python遍历文件夹下的所有子文件夹 并将指定的文件复制到指定目录 需求 复制单个文件夹 遍历所有子文件夹中的文件 并复制 代码封装 需求 在1文件夹中有1 2两个文件夹 将这两个文件夹中的文件复制到 after copy中 复制单个文件
  • Deathnote

    Deathnote 1 主机发现 arp scan l 2 扫描端口 nmap Pn sV P A 192 168 80 132 开放了80 22端口 3 访问80端口 修改host文件访问80端口时进行了跳转到deathnote vuln
  • Allegro 17.4设置中文界面

    一 Allegro 17 4 中文界面效果 二 Allegro 17 4 中文界面设置方法 2 1 需要打上此时 20210820 最新的S019的升级补丁 2 2 设置环境变量 变量名 intl enabled 变量值 1 要去除中文显示
  • LeetCode刷题-1

    数组 1 两数之和 题目描述 题目样例 Java方法 暴力枚举 思路及算法 代码 执行结果 复杂度 Java方法 哈希表 思路及算法 代码 执行结果 复杂度 题目描述 给定一个整数数组 nums 和一个整数目标值 target 请你在该数组
  • StarCraft开发:用肮脏的技巧解决难题

    http www csdn net article 2013 02 28 2814299 the starcraft path finding hack 摘要 在之前的文章中 Warcraft之父讲述了自己是如何以及为何重启StarCraf
  • Linux中的fork()函数

    Linux中的fork 函数 在Linux中 fork 函数是创建进程的基础 它是一个系统调用 用于创建一个新的进程作为当前进程的副本 新进程将拥有与原进程相同的代码 数据和堆栈 但是拥有不同的进程ID PID 并且它是原进程的子进程 函数
  • 【debug】(0, slice(None, None, None))‘ is an invalid key

    简单介绍 我获取了一个dataframe里的符合条件的多个index 想通过index对dataframe进行筛选 在筛选的时候反馈错误 原始代码为 input index df select df select item input in
  • 【word】如何设置交叉引用标注参考文献

    文章目录 1 定义参考文献编号格式 2 设置交叉引用 插入正文位置 3 修改连续多个参考文献的格式 4 更新正文标注 1 定义参考文献编号格式 开始 gt 编号 gt 定义新编号格式 2 设置交叉引用 插入正文位置 设置好固定的参考文献格式
  • 【vscode,python】pip成功的包却不能导入(import)问题

    第一次遇到这个问题 在网上找了些资料 网上的教程大致上都是需要去修改settings json这个文件 我问了我朋友 然后轻松地解决了这个问题 方法一 关掉编译软件重新打开即可解决问题 方法二 我认为造成这个问题的原因是在另一个新的路径上新
  • 真实GPS转腾讯/高德地图坐标系,百度地图与腾讯/高德地图坐标系转换

    1 获取真实坐标GPS wgs84转为gcj编码方式 positiontransform array manual 定义常量 var GPS PI 3 14159265358979324 x pi 3 14159265358979324 3
  • 对称矩阵的压缩存储、基于压缩矩阵的矩阵乘法

    def disp A 输出方阵A n len A for i in range n for j in range n print d A i j end print def compression A a 压缩矩阵A到a中 A是一个对称矩阵
  • 面试总结(五):搜索引擎

    问题导读 1 搜索引擎有哪些特点 优势 2 搜索引擎使用到哪些场景中 3 如何将原文档传给分次组件 4 如何将得到的词 Term 传给索引组件 Indexer 搜索引擎概述全文搜索就是对文本数据的一种搜索方式 文本数据的都多 可以分为顺序搜
  • 基于verilog语言的SPI协议实现

    前言 关于SPI协议的基础知识这里就不在叙述了 感兴趣的小伙伴可以自行百度 本文基于verilog语言 实现SPI的四种通信模式 封装成通用模块 更新时间 2023年7月11日 更新原因 之前的版本存在bug 通用性不够 模块端口如下 sp
  • java设计模式--[创建模式]--简单工厂[simple factory]

    一 簡單工廠 其實它不是一個設計模式 反而比較像是一種編程習慣 由于經常被使用 有些人把這個習慣誤認為是 工廠模式 在談論工廠模式前 先將簡單工廠熟悉一下 二 簡單工廠的UML類圖如下 三 在此用一個事例說明簡單工廠的用法 在一個酒店里可以
  • 爬虫使用Selenium生成Cookie

    在爬虫的世界中 有时候我们需要模拟登录来获取特定网站的数据 而使用Selenium登录并生成Cookie是一种常见且有效的方法 本文将为你介绍如何使用Selenium进行登录 并生成Cookie以便后续的爬取操作 让我们一起探索吧 一 Se
  • 关系数据库——关系操作和关系完整性

    文章目录 一 关系操作 1 基本的关系操作 2 关系数据语言的分类 关系代数语言 关系演算语言 具有关系代数和关系演算双重特点的语言 二 关系的完整性 1 实体完整性 Entity Integrity 实体完整性规则 2 参照完整性 Ref