理解数据库中的参照完整性

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 Tair(兼容Redis),内存型 2GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 【6月更文挑战第13天】数据库设计旨在创建和维护企业的数据管理系统,确保数据完整性和消除冲突。好的数据库设计应减少冗余,保证信息准确完整,并满足处理和报告需求。设计工具包括E-R图和UML等。

1 简介:设计数据

数据库设计是帮助创建、实施和维护企业数据管理系统的一系列步骤。

设计数据库的主要目的是为拟议的数据库系统生成设计的物理和逻辑模型,并在设计时保证数据完整性和消除冲突。
treeoflife6.png

实体完整性要求主键唯一非空,
参照完整性通过主键外键关联保证表间数据同步,
用户定义完整性则依据具体应用设置约束。

参照完整性中,主键外键关系影响数据的关联和更新,如博客文章分类和银行账户示例所示。
删除或更新主键可能导致数据丢失,需通过级联、设NULL等方式处理。

2 保证数据完整性

数据库完整性保证包括: 实体完整性,参照完整性,用户定义完整性。

实体完整性 Entity Integrity

实体完整性规则要求每个数据表都必须有主键,而作为主键的所有字段,其属性必须是唯一且非空值。

    参照(引用)完整性 Referential Integrity

实体及实体间的联系是用关系来描述的,关系与关系间的引用。一般此表主键,在另一表有关联字段的外键可用于确保通过主键和外键将表链接在一起的值是有效且正确同步的。

    用户定义完整性 User Defined Integrity

是针对某一具体的关系数据库的约束条件,反映某一具体应用所涉及的数据必须满足的语义要求,由应用的环境决定,例如 银行账户 必须大于 100000,小于 9999999,密码必须是六位等。

3 参照完整性关系。

因为数据库中的每个表都必须有一个主键,所以这个主键 键可以出现在其他表中,因为它与数据的关系 在这些表中。当一个表中的主键出现在 另一个表,称为外键。

定义主键和外键以及两者之间的关系 它们,使用 CREATE TABLE 和 ALTER TABLE 语句。

外键联接表并在表之间建立依赖关系。 表可以形成依赖关系的层次结构,如果 您更改或删除一个表中的行,则破坏了 其他表中的行。

参照完整性简单规则:

实例关系:多篇文章归属于某一类别(Class)

父子关系:一方为父多方为子

主外键关系:父方主键与子方外键关联

原理:父子关系是通过选定的键关联的,如果某一方的这个键变更了,而另一方不作更新,必然造成数据的完整性不正确。

4 参照完整性:博客文章例子

例1:有一个博客系统,文章分类存储,文章实体用Class外键与类别实体的主键ClassId关联(更确切是文章实体聚合了类别实体),当某类别ID被改或者删除了,如果文章实体不作相应的操作,那么文章就不知道是哪个类别的了。

反之,文章的类别被改,那么文章的类别就可能会出错,当然系统允许改文章类别另当别论了。

可用事件:看图,父方只有UPDATE和DELETE事件,而子方只有INSERT和UPDATE事件,是因为,父方插入新记录(新的类别)不影响子方(现存文章)的数据完整性。

反之,删除一篇文章不影响类别的数据完整性。这里要注意,事件的对象是关联双方的键

文章上级主键

None: 当上级的主键被更改时什么都不干;

Restrict(限制):这个报错,不允许更改,当下级有相应的记录关联时;如删除某一类别记录时,文章实体有该类别的文章。

Cascade(级联):使用最多。级联更改下级相关记录。

Set NULL:允许上级更改,下级外键设NULL,在某些场合有用。

Set default:和上类似。

文章下级外键

None:这个不用说了吧,什么都不干,当下级的外键被更改时;

Restrict(限制):这个报错,不允许更改。

5 参照完整性:银行账户例子

删除包含主键的行或对其进行更新时 使用不同的主键,可以破坏任何行的含义 包含该值作为外键。

参照完整性是 外键对主键的逻辑依赖关系。包含外键的行取决于 它引用的行 - 包含匹配的主行键。

客户表的customer_num列是主列 键以及订单和cust_call表中的外键。 客户编号 106,乔治, 在订单表和cust_calls表中引用。 如果从客户表中删除客户 106,则链接 在三个表之间,此特定客户被销毁。

从主数据库中删除行时保持参照完整性 键,使用引用中的“删除级联”选项 创建表和更改表语句的子句。

此选项 允许您从父表及其相应的 具有单个删除命令的匹配子表中的行。

有多个子项会发生什么?

如果父表具有两个子约束, 指定了级联删除的一个子项和另一个未指定级联的子项删除,并且尝试从父表中删除一行 适用于两个子表的DELETE 语句将失败,并且将不会有数据 从父表或子表中删除.

缺省情况下,数据库服务器不允许违反参照完整性,并在尝试删除时显示错误消息。

6 小结

一个好的数据库设计是:

将信息划分为基于主题的表,以减少冗余数据。

提供根据需要将表中的信息联接在一起所需的信息。

帮助支持并确保信息的准确性和完整性。

满足您的数据处理和报告需求

数据库设计:概念设计工具,E-R图工具,比如 UML工具

关系设计时可能需要解决的冲突:域冲突,字段冲突,命名冲突等

目录
相关文章
|
5月前
|
存储 SQL 关系型数据库
数据库事务:确保数据完整性的关键20
【7月更文挑战第20天】事务是数据库操作的基本逻辑单位,确保数据一致性。ACID原则包括:原子性(操作全成或全败),一致性(事务前后数据合法性),隔离性(并发操作互不影响),持久性(提交后更改永久保存)。MySQL的InnoDB引擎支持事务,通过undo log实现回滚,redo log确保数据持久化。开启事务可使用`BEGIN`或`START TRANSACTION`,提交`COMMIT`,回滚`ROLLBACK`。
182 70
|
4月前
|
安全 关系型数据库 数据库
FastAPI数据库操作秘籍:如何通过高效且安全的数据库访问策略,使你的Web应用飞速运转并保持数据完整性?
【8月更文挑战第31天】在构建现代Web应用时,数据库操作至关重要。FastAPI不仅简化了API创建,还提供了高效数据库交互的方法。本文探讨如何在FastAPI中实现快速、安全的数据处理。FastAPI支持多种数据库,如SQLite、PostgreSQL和MySQL;选择合适的数据库可显著提升性能。通过安装相应驱动并配置连接参数,结合ORM库(如Tortoise-ORM或SQLAlchemy),可以简化数据库操作。使用索引、批量操作及异步处理等最佳实践可进一步提高效率。同时,确保使用参数化查询防止SQL注入,并从环境变量中读取敏感信息以增强安全性。
217 1
|
4月前
|
存储 数据管理 数据库
约束:数据库完整性的守护者
【8月更文挑战第31天】
24 0
|
5月前
|
存储 关系型数据库 MySQL
关系型数据库mysql验证数据完整性
【7月更文挑战第2天】
193 1
|
6月前
|
存储 数据采集 NoSQL
DTS在迁移大数据量的MongoDB数据库时如何保证数据的准确性和完整性?
【6月更文挑战第4天】DTS在迁移大数据量的MongoDB数据库时如何保证数据的准确性和完整性?
150 1
|
7月前
|
数据库 数据库管理
理解数据库的ACID原则:确保数据完整性与一致性的基石
【5月更文挑战第20天】ACID原则是数据库事务处理的核心,包括原子性、一致性、隔离性和持久性。原子性保证事务操作全完成或全不完成,保持数据完整;一致性确保事务前后数据库保持一致性状态,不破坏完整性约束;隔离性防止并发事务相互影响,通过锁等技术实现;持久性则保证事务提交后的修改永久保存,即使系统故障也能恢复。这些原则确保了数据的可靠性和安全性。
|
7月前
|
存储 关系型数据库 数据库
关系型数据库的数据完整性约束
【5月更文挑战第12天】关系型数据库的数据完整性约束
105 2
|
6月前
|
SQL 数据库
数据库||数据库的完整性
数据库||数据库的完整性
|
6月前
|
SQL 数据库 数据库管理
数据库关系运算理论:关系数据操作与关系完整性概念解析
数据库关系运算理论:关系数据操作与关系完整性概念解析
112 0
|
11天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
79 15