《数据库原理与应用(第3版)》——3.1 关系数据模型的组成

简介:

本节书摘来自华章出版社《数据库原理与应用(第3版)》一 书中的第3章,第3.1节,作者:何玉洁,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.1 关系数据模型的组成

关系数据库使用关系数据模型组织数据。这种思想源于数学,最早提出类似方法的是COD-ASYL(数据系统语言会议)于1962年发表的“信息代数”一文,之后,David Child于1968年在计算机上实现了集合论数据结构。
而真正系统、严格地提出关系数据模型的是IBM的研究员E.F.Codd,他于1970年在美国计算机学会会刊(《Communication of the ACM》)上发表了题为“A Relational Model of Data for Shared Data Banks”的论文,开创了数据库系统的新纪元。此后,他连续发表了多篇论文,奠定了关系数据库的理论基础。
关系数据模型由关系数据结构、关系操作集合和数据完整性约束三部分组成。

3.1.1 关系数据结构

关系数据模型源于数学,它用二维表来组织数据,而这个二维表在关系数据库中就称为关系。关系数据库就是表或者说是关系的集合。
关系系统要求让用户所感觉的数据就是一张张表,如2.3.3节所示的学生表和选课表。在关系系统中,表是逻辑结构而不是物理结构。实际上,系统在物理层可以使用任何有效的存储结构来存储数据,如有序文件、索引、散列表、指针等。因此,表是对物理存储数据的一种抽象表示——对很多存储细节的抽象,如存储记录的位置、记录的顺序、数据值的表示,以及记录的访问结构,如索引等,对用户来说都是不可见的。

3.1.2 关系操作

关系数据模型给出了关系操作的能力。关系数据模型中的操作包括:
传统的关系运算:并(Union)、交(Intersection)、差(Difference)、广义笛卡儿乘积(Extended Cartesian Product)。
专门的关系运算:选择(Select)、投影(Project)、连接(Join)、除(Divide)。
有关的数据操作:查询(Query)、插入(Insert)、删除(Delete)、修改(Update)。
关系模型的操作对象是集合,而不是单个的行,也就是操作的数据以及操作的结果都是完整的表(包括只包含一行数据的表,甚至不包含任何数据的空表)。而非关系型数据库系统中典型的操作是一次一行或一次一个记录。因此,集合处理能力是关系系统区别于其他系统的一个重要特征。
在非关系模型中,各个数据记录之间是通过指针等方式连接的,当要定位到某条记录时,需要用户自己按指针的链接方向逐层查找,我们称这种查找方式为用户“导航”。而在关系数据模型中,由于是按集合进行操作,因此,用户只需要指定数据的定位条件,数据库管理系统就可以自动定位到该数据记录,而不需要用户来导航。这也是关系数据模型在数据操作上与非关系模型的本质区别。
例如,若采用层次数据模型,对第2章图2-6所示的层次结构,若要查找“计算机学院软件工程教研室的张海涛老师的信息”,则首先需要从根节点的“学院”开始,根据“计算机”学院指向的“教研室”节点的指针,找到“教研室”层次,然后在“教研室”层次中逐个查找(这个查找过程也许是通过各节点间的指针实现的),直到找到“软件工程”节点,然后根据“软件工程”节点指向“教师”节点的指针,找到“教师”层次,最后在“教师”层次中逐个查找教师名为“张海涛”的节点,此时该节点包含的信息即所要查找的信息。这个过程的示意图如图3-1所示,其中的虚线表示沿指针的逐层查找过程。

screenshot

而如果是在关系模型中查找信息,比如在表3-1所示的“学生”关系中查找“信息系学号为0521101的学生的详细信息”,则用户只需要提出这个要求即可,其余的工作就交给数据库管理系统来实现了。对用户来说,这显然比在层次模型中查找数据要简单得多。
关系模型的数据操作主要包括四种:查询、插入、删除和更改数据。关系数据库中的信息只有一种表示方式,就是表中的行列位置有明确的值。这种表示是关系系统中唯一可行的方式(当然,这里指的是逻辑层)。特别地,关系数据库中没有连接一个表到另一个表的指针。在表3-1和表3-2中,表3-1所示的学生表的第1行数据与表3-2所示的学生选课表中的第1行(当然也与第2、3、4行)有联系,因为0512101号学生选了课程。但在关系数据库中这种联系不是通过指针来实现的,而是通过学生表中“学号”列的值与学生选课表中“学号”列的值关联的(学号值相等)。但在非关系系统中,这些信息一般由指针来表示,这种指针对用户来说是可见的。因此,在非关系模型中,用户需要知道数据之间的指针链接关系。
screenshot

需要注意的是,当我们说关系数据库中没有指针时,并不是指在物理层没有指针。实际上,在关系数据库的物理层也使用指针,但所有这些物理层的存储细节对用户来说都是不可见的,用户所看到的物理层实际上就是存放数据的数据库文件,他们能够看到的就是这些文件的文件名、存放位置等上层信息,而没有指针这样的底层信息。
关系操作是通过关系语言实现的,关系语言的特点是高度非过程化的。所谓非过程化是指:
用户不必关心数据的存取路径和存取过程,只需要提出数据请求,数据库管理系统就会自动完成用户请求的操作。
用户也没有必要编写程序代码来实现对数据的重复操作。

3.1.3 数据完整性约束

在数据库中,数据的完整性是指保证数据正确性的特征。数据完整性是一种语义概念,它包括两个方面:
1)与现实世界中应用需求的数据的相容性和正确性。
2)数据库内数据之间的相容性和正确性。
例如,学生的学号必须是唯一的,学生的性别只能是“男”和“女”,学生所选的课程必须是已经开设的课程等。因此,数据库是否具有数据完整性特征关系到数据库系统能否真实地反映现实世界的情况。数据完整性是数据库中非常重要的内容。
数据完整性由完整性规则定义,而关系模型的完整性规则是对关系的某种约束条件。在关系数据模型中一般将数据完整性分为三类,即实体完整性、参照完整性和用户定义的完整性。其中实体完整性和参照完整性是关系模型必须满足的完整性约束,是系统级的约束。用户定义的完整性主要是限制属性的取值范围,也称为域的完整性,这属于应用级的约束。数据库管理系统应该提供对这些数据完整性的支持。

相关文章
|
10天前
|
SQL NoSQL Java
彻底革新你的数据库操作体验!Micronaut数据访问技巧让你瞬间爱上代码编写!
【9月更文挑战第10天】Java开发者们一直在寻找简化应用程序与数据库交互的方法。Micronaut作为一个现代框架,提供了多种工具和特性来提升数据访问效率。本文介绍如何使用Micronaut简化数据库操作,并提供具体示例代码。Micronaut支持JPA/Hibernate、SQL及NoSQL(如MongoDB),简化配置并无缝集成。通过定义带有`@Repository`注解的接口,可以实现Spring Data风格的命名查询。
26 6
|
20天前
|
SQL 存储 数据处理
"SQL触发器实战大揭秘:一键解锁数据自动化校验与更新魔法,让数据库管理从此告别繁琐,精准高效不再是梦!"
【8月更文挑战第31天】在数据库管理中,确保数据准确性和一致性至关重要。SQL触发器能自动执行数据校验与更新,显著提升工作效率。本文通过一个员工信息表的例子,详细介绍了如何利用触发器自动设定和校验薪资,确保其符合业务规则。提供的示例代码展示了在插入新记录时如何自动检查并调整薪资,以满足最低标准。这不仅减轻了数据库管理员的负担,还提高了数据处理的准确性和效率。触发器虽强大,但也需谨慎使用,以避免复杂性和性能问题。
28 1
|
20天前
|
安全 关系型数据库 数据库
FastAPI数据库操作秘籍:如何通过高效且安全的数据库访问策略,使你的Web应用飞速运转并保持数据完整性?
【8月更文挑战第31天】在构建现代Web应用时,数据库操作至关重要。FastAPI不仅简化了API创建,还提供了高效数据库交互的方法。本文探讨如何在FastAPI中实现快速、安全的数据处理。FastAPI支持多种数据库,如SQLite、PostgreSQL和MySQL;选择合适的数据库可显著提升性能。通过安装相应驱动并配置连接参数,结合ORM库(如Tortoise-ORM或SQLAlchemy),可以简化数据库操作。使用索引、批量操作及异步处理等最佳实践可进一步提高效率。同时,确保使用参数化查询防止SQL注入,并从环境变量中读取敏感信息以增强安全性。
39 1
|
25天前
|
缓存 运维 监控
打造稳定高效的数据引擎:数据库服务器运维最佳实践全解析
打造稳定高效的数据引擎:数据库服务器运维最佳实践全解析
|
26天前
|
存储 SQL JSON
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
|
6天前
|
SQL 存储 数据库
MSSQL遍历数据库根据列值查询数据
【9月更文挑战第12天】在 SQL Server 中,可以通过游标或临时表遍历数据库并根据列值查询数据。示例展示了如何创建临时表存储数据库名,并通过循环遍历这些名称来执行特定查询。需替换 `YourTableName`、`YourColumnName` 和 `YourValue` 为实际值。此方法要求有足够权限访问各数据库。若无跨库权限,需分别执行查询。
|
12天前
|
前端开发 数据库 开发者
数据模型(数据库表设计)生成代码
BizWorks ToolKit 插件集成 Mybatis-Plus 代码生成工具,支持从数据库表批量生成代码,简化开发流程。本文详细介绍配置方法及项目示例,包括配置文件格式、生成选项及具体操作步骤,帮助开发者快速实现代码同步更新。配置文件 `.mp.yaml` 支持自定义输出目录、生成组件等,适用于多种项目结构。
26 0
|
20天前
|
测试技术 Java
全面保障Struts 2应用质量:掌握单元测试与集成测试的关键策略
【8月更文挑战第31天】Struts 2 的测试策略结合了单元测试与集成测试。单元测试聚焦于单个组件(如 Action 类)的功能验证,常用 Mockito 模拟依赖项;集成测试则关注组件间的交互,利用 Cactus 等框架确保框架拦截器和 Action 映射等按预期工作。通过确保高测试覆盖率并定期更新测试用例,可以提升应用的整体稳定性和质量。
39 0
|
20天前
|
开发者 UED Java
Play Framework惊天秘密:如何让异常处理优雅得像芭蕾舞?
【8月更文挑战第31天】在Web应用开发中,异常处理至关重要,直接影响应用稳定性和用户体验。Play Framework作为轻量级Java Web框架,提供了基于Scala偏函数的灵活异常处理机制。通过实现`HttpErrorHandler`接口可定义全局异常逻辑,而在控制器中使用try-catch块则能捕获特定异常。定义自定义异常类也有助于表示特定错误情况。最佳实践包括保持处理一致性、提供有用错误信息、记录日志及分类处理异常。掌握这些技巧,能使Play应用更健壮可靠。
42 0