MySQL 7:数据库设计

1.范式

1.1 第一范式(1NF)

(1)定义

• 数据库表的每一列 都是不可分割的原子数据项,而不是集合、数组、对象等非原子数据。

【 使用数据库 提供的基本数据类型 (如INT, VARCHAR, DATE)来表示每一列**】**

• 在关系型数据库 的设计中,满足第一范式是对关系模式的基本要求;不满足 第一范式的数据库就不能被称为关系数据库。


需求:定义 一个学生表 ,需要记录学生 信息和学校信息。

(2)反例

学校 是一个对象,可以继续进行拆分 ,所以不满足第一范式。

(3)正例

学校 信息包含在一行中,每一列 都不能再进行拆分 ,此时已满足第一范式。


1.2 第二范式(2NF)

(1)定义

• 在满足1NF的基础 上,进一步要求所有非关键字段 必须完全依赖 于整个候选键 ,而不能部分依赖( 只依赖于候选键的一部分)。

• 第二范式主要针对复合主键 (即由多个列 组成的主键)的情况;如果表只有一个单列主键 ,则自动满足2NF (因为**不存在"部分依赖"**问题)。

【 关键字段:主关键字段(主键)、 候选关键字段(候选键)】

【 候选键:表中能够唯一标识****每一行的一个或多个列的组合】

【 主键:从候选键 中选出的一个 / 多个**,**用于作为表的唯一标识符】


需求 :学生可以选修课程 ,课程有对应的学分 ,学生考试后每门课程 会产生相应的成绩。

(2)反例

用一张学生课程成绩表 记录所有信息

(3)正例

针对需求应该设计三张表 ,学生 表、课程 表和成绩表。

(4)不满足第二范式时可能出现的问题


1.3 第三范式

(1)定义

在满足2NF的基础 上,进一步要求所有非关键字段必须直接依赖 于任意候选键 ,而不能传递依赖。


需求:要求学生表 中记录 学生所属的学院,在满足2NF的基础上对学生表做出修改。

(2)反例

(3)正例

把学院信息拆分 出来定义学院表 ,学生表与学院表做关联。

2.设计过程


3.实体-关系图 (E-R图)

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

画E-R图可以用在线网站https://app.diagrams.net/ https://www.processon.com/ 或下载软件https://www.drawio.com/


3.1 一对一关系(1:1)


3.2 一对多关系(1:N)


3.3 多对多关系(M:N)


4.练习:设计表

根据以上E-R图完成表的创建,并添加主键列

4.1 用户与账户的一对一关系

实体间一对一关系只需要在其中一个实体中添加对另一个实体的关联字段即可

sql 复制代码
# 在⽤⼾实体中添加对账⼾实体的关联
drop table if exists users;
create table users (
 id bigint primary key auto_increment,
 name varchar(20) not null, 
 nickname varchar(20),
 phone_num varchar(11), 
 email varchar(50),
 gender tinyint(1),
 account_id bigint
);

drop table if exists account;
create table account (
 id bigint primary key auto_increment,
 username varchar(20) not null,
 password varchar(32) not null
);


# 在账⼾实体中添加对⽤⼾实体的关联
drop table if exists users;
create table users (
 id bigint primary key auto_increment,
 name varchar(20) not null, 
 nickname varchar(20),
 phone_num varchar(11), 
 email varchar(50),
 gender tinyint(1)
);

drop table if exists account;
create table account (
 id bigint primary key auto_increment,
 username varchar(20) not null,
 password varchar(32) not null,
 users_id bigint
);

4.2 学生与班级的一对多关系

分别创建学生表和班级表,在学生表中添加一列 与班级表建立关联关系。

sql 复制代码
# 班级表
drop table if exists class;
create table class (
 id bigint primary key auto_increment,
 name varchar(20)
);


# 学⽣表
drop table if exists student;
create table student (
 id bigint primary key auto_increment,
 name varchar(20) not null, 
 sno varchar(10) not null,
 age int default 18,
 gender tinyint(1), 
 enroll_date date,
 class_id bigint
);

4.3 学生、课程与成绩的多对多关系

学生可以选修多门课程 ,每门课程考试 后会产生一个成绩 ,两个表之间没有办法直接建立关系,所以要用到一个记录成绩的中间表。

sql 复制代码
# 学⽣表
drop table if exists student;
create table student (
 id bigint primary key auto_increment,
 name varchar(20) not null, 
 sno varchar(10) not null,
 age int default 18,
 gender tinyint(1), 
 enroll_date date,
 class_id bigint,
 foreign key (class_id) references class(id)
);

# 课程表
drop table if exists course;
create table course (
 id bigint primary key auto_increment,
 name varchar(20)
);


# 分数表
drop table if exists score;
create table score (
 id bigint primary key auto_increment,
 score float,
 student_id bigint,
 course_id bigint,
 foreign key (student_id) references student(id),
 foreign key (course_id) references course(id)
);
相关推荐
Lethehong7 小时前
Oracle 加个字段,目标库就报错?KFS 用“先拆后组“打通异构 DDL
数据库·oracle
Web极客码7 小时前
锁定真正的磁盘卡顿:我用 OpenCode 配合 eBPF 诊断 NVMe 队列深度延迟与 I/O 写放大
数据库·oracle
cspttty8 小时前
2027用户研究求职准备:应用统计学如何补齐研究设计与业务表达
大数据·数据库
roman_日积跬步-终至千里9 小时前
【数据Agent论文·查询与语义|05】Spider:为什么换一个数据库,模型就不会查了?
数据库·数据分析
猫咪很可爱9 小时前
Oracle RAC 启动失败排查:私网通信与内核参数优化实战
运维·数据库·oracle
XLYcmy9 小时前
《数字经济赋能城市低碳治理的路径研究检索报告》审阅与修改指导意见——基于完整检索报告体例的完整性诊断、学术规范核查与方法论纠偏 上
数据库·ai·chatgpt·文心一言·检索·知网·豆包
泡海椒10 小时前
JQuick-SQL 快速开始:注册内存表并执行查询
数据库·windows·sql
ss27310 小时前
PG实战笔记 | 09 PostgreSQL psql客户端基本操作
数据库·笔记·postgresql
电商API_1800790524710 小时前
反向海淘多币种结算:汇率该在哪个时点被冻结
java·开发语言·数据库·跨境电商·1688 api
搞AI的金鱼10 小时前
skill agent workflow的区别
数据库