数据库表设计

1.数据库约束

1.1 什么是数据库约束

数据库约束是指对数据库表中的数据 所施加的规则或条件,⽤于确保数据的准确性和可靠性。这些约束可以是基于数据类型、值范围、唯⼀性、⾮空等规则,以确保数据的正确性和相容性

1.2 数据库约束类型

1.2.1 NOT NULL(⾮空约束)

说明 :指定⾮空约束的列不能存储 NULL 值

案例

sql 复制代码
mysql> create table test(
    -> id bigint NOT NULL,
    -> name varchar(20),
    -> sn bigint);

被修饰的字段在表结构中NULL列会标注NO

被NOT NULL修饰的字段如果插入结果为NULL会报错

1.2.2 UNIQUE(唯一约束)

说明 :指定唯⼀约束的列每⾏数据必须有唯⼀的值

案例

sql 复制代码
create table test(
 id bigint UNIQUE,
 name varchar(20) not null,
 sno varchar(10)
);

查看表结构会发现key列会有UNI标注

1.2.3 PRIMARY KEY(主键约束)

说明:NOT NULL 和 UNIQUE的结合,可以指定⼀个列或多个列,有助于防⽌数据重复和提⾼数据的查询性能

案例

sql 复制代码
create table student (
 id bigint PRIMARY KEY auto_increment, # 设置⾃增主键
 name varchar(20) not null,
 age int DEFAULT 18,
 sno varchar(10) UNIQUE
);

查看表结构时会发现 key列会有PRI标注

1.2.4 DEFALUT(DEFALUT 默认约束)

说明:当没有给列赋值时使⽤的默认值

案例

sql 复制代码
create table test(
 id bigint UNIQUE,
 name varchar(20) not null,
 age int DEFAULT 18,
 sno varchar(10)
);

查看表结构会发现被修饰的字段在Default列有对应默认值标注

1.2.5 FOREIGN KEY 外键约束

说明 :外键约束是⼀种关系约束,⽤于定义两个表之间的关联关系,可以确保数据 的完整性和⼀致性

案例

sql 复制代码
create table class (
 id bigint primary key auto_increment,
 name varchar(20) not null
);
create table student(
 id bigint PRIMARY KEY auto_increment, 
 name varchar(20) not null,
 age int DEFAULT 18,
 class_id bigint,
 foreign key (class_id) references class(id) # 创建外键约束
);
foreign key (从表字段) references 主表(主表字段)

表结构中被修饰的字段在key字段会有MUL标注

注意

1.在删除主表时要先删除与从表的关联关系

2. 范式

2.1 什么是范式

数据库的范式是⼀组规则。在设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式。
关系数据库有六种范式:第⼀范式(1NF)、第⼆范式(2NF)、第三范式(3NF)、巴斯-科德
范式(BCNF)、第四范式(4NF)和第五范式(5NF,⼜称完美范式),越⾼的范式数据库冗余越⼩。然⽽,普遍认为范式越⾼虽然对数据关系有更好的约束性,但也可能导致数据库IO更繁忙,因此在实际应⽤中,数据库设计通常只需满⾜第三范式即可

2.2 第一范式

定义
• 数据库表的每⼀列都是不可分割的原⼦数据项,⽽不能是集合,数组,对象等⾮原⼦数据。
• 在关系型数据库的设计中,满⾜第⼀范式是对关系模式的基本要求。不满⾜第⼀范式的数据库就 不能被称为关系数据库
案例:在定义学生表中加上学校字段,因为学校可以继续拆分为学校地址、学院等,这就不满足第一范式。正确的做法是把学校字段单独拆出来。

2.3 第二范式

定义 :在满足第一范式的前提 下,不存在非关键字段对任意候选键的部分函数依赖。

案例:这里学号和课程号为候选键,我们可以通过学号确定他的姓名和班级,而不能确定他的课程名和成绩。我们也可以通过课程号确定他的课程名和成绩但不能确定它的名字和班级。这就是不满足第二范式的例子

解决方法

  1. 把课程号、课程名、成绩字段拆成另一张表,再用外键把两张表联合

  2. 把课程号、课程名、成绩字段拆成另一张表,再建立第三张表,将两张表各自的主键联系起来

不满足可能存在的问题

  1. 数据冗余
    学⽣的姓名、年龄、性别和课程的学分在每⾏记录中重复出现,造成了⼤量的数据冗余

2.插入异常

如果要添加一门课程,由于未考试,学生信息、成绩等数据为导入进来,这是对应的列就会为NULL,没有实际的意义

3.更新异常

如果更新过程中中断了或者发生什么异常导致更新失败,可能会导致一部分数据修改了一部分没有修改。例如如果把课程的学分从1-->2,如果修改中断可能一部分为1,一部分为2,这样就会导致数据不一致等问题

4**.删除异常**
把毕业学⽣的考试数据全都删除,此时课程和学分的信息也会被删除掉,有可能导致⼀段时间
内,数据库⾥没有某⻔课程和学分的信息。

2.4 第三范式

定义 :在满⾜第⼆范式的基础 上,不存在⾮关键字段,对任⼀候选键的传递依赖
案例: 在这个表结构中,可以看出学⽣的姓名、年龄、性别与主键学号强相关;学院电话 与学院强
相关;在⼀个表中出现了两个强相关的关系,⽽且这两个强相关关系⼜存在传递现象,即 通过学⽣
学号可以找到学⽣记录,学⽣记录中包含学院名,每个学院⼜有⾃⼰的电话,这种表就不满足第三范式

正确做法:把学院相关的字段提出来,另起一张表,通过学院字段进行关联

3. 实体-关系图

概念:实体-关系图(Entity-Relationship Diagram)简称E-R图,也称作实体联系模型、实体关系模型,是⼀种⽤于描述数据模型的概念图,主要⽤于数据库设计阶段

3.1 E-R图的基本组成

E-R图包含了以下三种基本成分:
• 实体:即数据对象,⽤矩形框表⽰,⽐如⽤户、学⽣、班级等。
• 属性:实体的特性,⽤椭圆形或圆⻆矩形表示,如学⽣的姓名、年龄等。
• 关系:实体之间的联系,⽤菱形框表示,并标明关系的类型,并⽤直线将相关实体与关系连接起

3.2 关系的类型

3.2.1 一对一关系

案例:学生实体包含了,姓名、学号、电话、性别字段。账号实体包含了,密码、注册时间字段。他们之间存在一对一的关系,一个学生只对应一个账号,一个账号只属于一个学生。

3.2.2 一对多关系

案例:一个学生实体对应一个班级,而一个班级可以对应多个学生,这种关系就是一对多关系

3.2.3 多对多关系

案例:一个学生可以选择多个课程,每个课程也可以被多个学生选择,这就是多对多关系

相关推荐
tudficdew2 小时前
使用Python操作文件和目录(os, pathlib, shutil)
jvm·数据库·python
浒畔居2 小时前
工具、测试与部署
jvm·数据库·python
云和数据.ChenGuang2 小时前
python对接mysql和模型类的故障
数据库·python·mysql·oracle·conda·virtualenv
2301_822382762 小时前
开发一个简单的Python计算器
jvm·数据库·python
2501_920999272 小时前
Django全栈开发入门:构建一个博客系统
jvm·数据库·python
龚礼鹏2 小时前
图像显示框架十一——BufferQueue的工作流程(基于Android 15源码分析)
java·网络·数据库
diediedei2 小时前
用Pygame开发你的第一个小游戏
jvm·数据库·python
程序员后来2 小时前
Redis基本数据类型及其应用:从原理到实战的完整指南
数据库·redis·缓存
2301_790300962 小时前
用Python制作一个文字冒险游戏
jvm·数据库·python