当前位置: 首页 > news >正文

数据库设计精要:完整性和范式理论

文章目录

  • 数据的完整性
    • 实体的完整性
      • 主键
    • 域完整性
    • 参照完整性
      • 外键
  • 多表设计/多表理论
    • 一对一和一对多
    • 多对多
  • 数据库的设计范式
    • 第一范式:原子性
    • 第二范式:唯一性
    • 第三范式:不冗余性

数据的完整性

实体的完整性

加主键,保证一个表中每一条数据 和其他条目不同。

主键

实体完整性确保表中的每一行都是唯一的,并且具有唯一的标识符(通常是一个主键)。这意味着在表中不能有重复的行,并且主键字段不能包含NULL值。

主键

在SQL中,主键(Primary Key)是一个或多个字段的组合,用于唯一标识数据库表中的每一行记录。其具备以下特点:

  1. 唯一: 主键的值必须是唯一的,不允许有重复的值。
  2. 非空:主键字段不能包含NULL
  3. 主键可以加快查询速度:主键在创建时会自动建立索引,这有助于提高查询速度。

在一个标准,存储数据的时候,逻辑上我们认为一行数据是一个不可拆分的整体,要求(不是语法要求,是约定俗成的数据库使用规范)每一行数据和另一行不要重复,所以我们在上面的创建表的时候,就给了一个id,准备用它来充当“唯一标识”、

主键的定义:SQL语法 primary key

我们可以给表中的某一列设置为主键,

成为主键之后有两个特点:(1)不允许为null,(2)不允许在表中重复

CREATE TABLE `test`(`id` int  primary key,`name` varchar(255),`gender` char(1)
);-- 或者CREATE TABLE `test`(`id` int,`name` varchar(255),`gender` char(1)primary key(id)
);-- 如果一个表表在创建的时候没有主键,增加主键的sql  -- 使用上:没有任何意义,
-- alter table 表名 add primary key(主键列);
alter table user add primary key (id);-- 联合主键:复合主键(不建议)。这意味着id和name的组合在table_primary3表中表示主键。
CREATE TABLE table_primary3(id INT(11),name VERCHAR(25),job VERCHAR(25),salary FLOAT,PRIMARY KEY(id, name)
);
insert into test values(1, 'zl', '男');	-- 如果有id 1,就会插入报错。

如果要解决正确的步骤就是先查表,看哪个id没有使用,然后插入的时候再插入

-- 使用sql语句解决-- 在创建表时
CREATE TABLE `test`(`id` int  primary key AUTO_INCREMENT,`name` varchar(255),`gender` char(1)
);-- 插入
-- 服务器接收sql语句,插入NULL对应id,发现id为主键,然后看是否自增,如果不是自增就会报错,有自增会选取一个自增值
insert into test values(null, 'zl', '男');

域完整性

设计某些列,类型要合适,范围要合适

储存数据的时候,存储的内容要符合列的类型的设置

参照完整性

在关系型数据库中,一个表的数据可能依赖于另一个表的数据而存在,或者说两个表的数据存在关联,所以我们希望这种关联/参照,具有一致性(要修改的是同步进行变化)。

外键只是保证参照完整性的一种方式

外键

强制绑定两个具有参照的表的字段。

也就是将一个表的外键绑定为另一个表的主键

在对一个表中的键进行修改时,可能会另一个关联表中进行全局扫描,因为要查看在另一个表中是否在使用。并且主键的扫描次数会少,性能高一点,但是外键的查找性能会低很多。

(修改主键值时,数据库需要检查所有关联的外键约束。如果外键列没有索引,会导致全表扫描,性能较差;而主键由于自带唯一索引,查找效率较高。因此,在设计数据库时,应避免频繁修改主键,并为外键创建索引以提高查询性能)

外键是 MySQL 中用于建立和加强两个表数据之间链接的一种约束。下面我来介绍它的使用方法:

创建外键

在创建表时,可以通过以下方式定义外键:

CREATE TABLE 表名(字段1 数据类型,字段2 数据类型,...[CONSTRAINT 外键约束名] FOREIGN KEY (外键字段名) REFERENCES 主表名(主键字段名)
);

举个例子:

CREATE TABLE department (id INT PRIMARY KEY,name VARCHAR(50)
);CREATE TABLE employee (id INT PRIMARY KEY,name VARCHAR(50),department_id INT,FOREIGN KEY (department_id) REFERENCES department(id)
);

删除外键

可以使用 ALTER TABLE 语句来删除外键约束:

ALTER TABLE 表名 DROP FOREIGN KEY 外键约束名;

要留意的是,外键约束名可以通过查看表结构获取,也能在创建外键时自行定义。

外键约束选项

在外键定义中,还能够添加 ON UPDATE 和 ON DELETE 子句,以此来定义当主表中的记录被更新或者删除时,从表应该执行的操作。常见的选项如下:

  • ON DELETE CASCADE:主表记录删除时,从表相关记录自动删除。
  • ON UPDATE CASCADE:主表记录更新时,从表相关记录自动更新。
  • ON DELETE SET NULL:主表记录删除时,从表相关字段设为 NULL(要求该字段允许 NULL 值)。
  • ON UPDATE SET NULL:主表记录更新时,从表相关字段设为 NULL。

示例如下:

CREATE TABLE employee (id INT PRIMARY KEY,name VARCHAR(50),department_id INT,FOREIGN KEY (department_id) REFERENCES department(id)ON DELETE CASCADEON UPDATE CASCADE
);

使用外键的注意事项

  1. 主表和从表的字段数据类型要保持一致。
  2. 主表的字段必须是主键或者具有唯一约束。
  3. InnoDB 存储引擎才支持外键,MyISAM 不支持。
  4. 外键会对数据的插入、更新和删除操作产生影响,可能会导致性能下降。
  5. 要避免出现循环外键约束,不然会造成死锁的情况。

多表设计/多表理论

一对一和一对多

一对一的表很少见,因为在理论上可以合并为一张表。

多对多

多对多的两张表一般需要一个中间对照表来连接两个表之间的关系。

依靠中间表,来将多对多的两张表,进行连接,对应下面就是:学生信息与对照表是一对多的关系,剧本表与对照表是一对多的关系,学生信息表与剧本表是多对多的关系。

数据库的设计范式

第一范式:原子性

第二范式:唯一性

不存在部分依赖(不能是组合唯一,就是使用联合主键)必须为某一列作为主键设置唯一。

第三范式:不冗余性

http://www.dtcms.com/a/270080.html

相关文章:

  • 去掉长按遥控器power键后提示关机、飞行模式的弹窗
  • 数据提取之lxml模块与xpath工具
  • 基于Java+SpringBoot 协同过滤算法私人诊所管理系统
  • 系统架构设计师论文分享-论系统安全设计
  • IoTDB:专为物联网场景设计的高性能时序数据库
  • 把word中表格转成excle文件
  • 基于GeoTools的根据Shp文件生成完全包围格网实战
  • Oracle 存储过程、函数与触发器
  • AI标注平台label-studio之二添加机器学习后端模型辅助标注
  • vue3官方文档学习心得
  • SpringCloud系列 - Gateway 网关功能(五)
  • 人体坐姿检测系统开发实战(YOLOv8+PyTorch+可视化)
  • 本地部署 R 语言环境运行软件 RStudio Server 并实现外部访问
  • 玩具语音方案选型决策OTP vs Flash 的成本功耗与灵活性
  • window wsl 环境下编译openharmony,HarmonyOS 三方库 FFmpeg
  • VLLM 调用有哪些超参数; clean_up_tokenization_spaces是什么
  • ubuntu24.04安装NFS网络文件系统/ARM开发板NFS挂载
  • 20250708-03-string结构及命令详解_笔记
  • CI/CD — DevOps概念之实现k8s持续交付持续集成(一)
  • NumPy-统计函数详解
  • UE5内置插件 AnimToTexture 简单入门
  • 一次编码,多端运行:HTML5多终端调用
  • Android 依赖注入框架详解
  • 2025年7月8日学习笔记——模式识别与机器学习绪论
  • bro code Interface
  • 社区云管家 - 智慧生活新方式 ——仙盟创梦IDE
  • 玩转Docker | 使用Docker部署HomeBox家庭库存管理工具
  • NestJS 系列教程(四):中间件、中断器与异常过滤器详解
  • JavaScript基础篇——第一章 JavaScript基础的认识
  • MySQL 【环境安装、基础认识】