Chao's Blog Chao's Blog
首页
  • vue

    • vue路由
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • java
  • spring
  • springboot
  • springcloud
  • git
  • maven
  • nginx
  • tomcat
  • springmvc
  • jvm
  • 图数据库
  • mysql数据库
  • redis数据库
  • windows下docker安装nginx并挂载目录
  • linux命令
  • linux安装软件
  • linux脚本
  • idea
  • vscode
  • 归档
  • 综合项目

    • 若依项目
    • mall项目
  • java
  • mybatis
  • xxl-job
  • mybatis
GitHub (opens new window)

~chao

永远菜鸟,不断努力~
首页
  • vue

    • vue路由
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • java
  • spring
  • springboot
  • springcloud
  • git
  • maven
  • nginx
  • tomcat
  • springmvc
  • jvm
  • 图数据库
  • mysql数据库
  • redis数据库
  • windows下docker安装nginx并挂载目录
  • linux命令
  • linux安装软件
  • linux脚本
  • idea
  • vscode
  • 归档
  • 综合项目

    • 若依项目
    • mall项目
  • java
  • mybatis
  • xxl-job
  • mybatis
GitHub (opens new window)
  • cypher图数据

  • mysql数据库

    • mysql尚硅谷宋红康

      • 第00章_写在前面
      • 第01章_数据库概述
      • 第02章_MySQL环境搭建
      • 第03章_基本的SELECT语句
      • 第04章_运算符
      • 第05章_排序与分页
      • 第06章_多表查询
      • 第07章_单行函数
      • 第08章_聚合函数
      • 第09章_子查询
      • 第10章_创建和管理表
      • 第11章_数据处理之增删改
      • 第12章_MySQL数据类型精讲
      • 第13章_约束
      • 第14章_视图
      • 第15章_存储过程与函数
      • 第16章_变量、流程控制与游标
      • 第17章_触发器
      • 第18章_MySQL8其它新特性
      • 第19章【高级篇】MySQL的数据目录
      • 第20章【高级篇】用户、权限、角色管理
      • 第21章【高级篇】MySQL密码管理、配置文件的使用、系统变量
      • 第22章【高级篇】MySQL的逻辑架构
      • 第23章【高级篇】MySQL的存储引擎
      • 第24章【高级篇】索引的数据结构
      • 第25章【高级篇】InnoDB的数据存储结构
      • 第26章【高级篇】索引的创建与删除
      • 第27章【高级篇】索引的设计原则
      • 第28章【高级篇】性能分析工具的使用
      • 第29章【高级篇】索引优化与查询优化
      • 第30章【高级篇】数据库的设计规范
        • 范式简介
        • 范式都包括哪些
        • 键和相关属性的概念
        • 第一范式
        • 第二范式
        • 第三范式
        • 小结
        • 概述
        • 应用举例
        • 反范式的新问题
        • 反范式的适用场景
        • 迭代1次:考虑1NF
        • 迭代2次:考虑2NF
        • 迭代3次:考虑3NF
        • 反范式化:业务优先的原则
        • ER模型包括哪些要素
        • 关系的类型
        • 建模分析
        • ER模型的细化
        • ER模型转化为数据表
        • 关于库
        • 关于表、列
        • 关于索引
        • SQL编写
      • 第31章【高级篇】数据库其它调优策略
      • 第32章【高级篇】事务基础知识
      • 第33章【高级篇】MySQL事务日志
      • 第34章【高级篇】锁
      • 第35章【高级篇】多版本并发控制MVCC
      • 第36章【高级篇】其他数据库日志
      • 第37章【高级篇】补充:MyCat
      • 第38章【高级篇】主从复制
      • 第39章【高级篇】数据库备份与恢复
      • 第00章_写在最后
    • 总结

    • mysql数据库备份与恢复

    • mysql日志

    • mysql性能优化

  • redis数据库

  • oracle数据库

  • 数据库
  • mysql数据库
  • mysql尚硅谷宋红康
~chao
2022-12-16
目录

第30章【高级篇】数据库的设计规范

# 【宋红康 MySQL数据库 】【高级篇】数据库的设计规范

# 为什么需要数据库设计

在这里插入图片描述

在这里插入图片描述

# 范式

# 范式简介

在这里插入图片描述

# 范式都包括哪些

在这里插入图片描述

# 键和相关属性的概念

在这里插入图片描述

在这里插入图片描述

# 第一范式 (opens new window)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

# 第二范式

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

# 第三范式

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

# 小结

在这里插入图片描述

# 反范式化

# 概述

在这里插入图片描述

在这里插入图片描述

# 应用举例

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

CREATE DATABASE atguigudb3;

USE atguigudb3;

#学生表
CREATE TABLE student(
stu_id INT PRIMARY KEY AUTO_INCREMENT,
stu_name VARCHAR(25),
create_time DATETIME
);

#课程评论表
CREATE TABLE class_comment(
comment_id INT PRIMARY KEY AUTO_INCREMENT,
class_id INT,
comment_text VARCHAR(35),
comment_time DATETIME,
stu_id INT
);

###创建向学生表中添加数据的存储过程
DELIMITER //

CREATE PROCEDURE batch_insert_student(IN START INT(10), IN max_num INT(10))
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE date_start DATETIME DEFAULT ('2017-01-01 00:00:00');
DECLARE date_temp DATETIME;
SET date_temp = date_start;
SET autocommit=0;
REPEAT
SET i=i+1;
SET date_temp = DATE_ADD(date_temp, INTERVAL RAND()*60 SECOND);
INSERT INTO student(stu_id, stu_name, create_time)
VALUES((START+i), CONCAT('stu_',i), date_temp);
UNTIL i = max_num
END REPEAT;
COMMIT;
END //

DELIMITER ;

#调用存储过程,学生id从10001开始,添加1000000数据
CALL batch_insert_student(10000,1000000);

####创建向课程评论表中添加数据的存储过程
DELIMITER //

CREATE PROCEDURE batch_insert_class_comments(IN START INT(10), IN max_num INT(10))
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE date_start DATETIME DEFAULT ('2018-01-01 00:00:00');
DECLARE date_temp DATETIME;
DECLARE comment_text VARCHAR(25);
DECLARE stu_id INT;
SET date_temp = date_start;
SET autocommit=0;
REPEAT
SET i=i+1;
SET date_temp = DATE_ADD(date_temp, INTERVAL RAND()*60 SECOND);
SET comment_text = SUBSTR(MD5(RAND()),1, 20);
SET stu_id = FLOOR(RAND()*1000000);
INSERT INTO class_comment(comment_id, class_id, comment_text, comment_time, stu_id)
VALUES((START+i), 10001, comment_text, date_temp, stu_id);
UNTIL i = max_num
END REPEAT;
COMMIT;
END //

DELIMITER ;

#添加数据的存储过程的调用,一共1000000条记录
CALL batch_insert_class_comments(10000,1000000);

#########
SELECT COUNT(*) FROM student;

SELECT COUNT(*) FROM class_comment;

###需求######
SELECT p.comment_text, p.comment_time, stu.stu_name 
FROM class_comment AS p LEFT JOIN student AS stu 
ON p.stu_id = stu.stu_id 
WHERE p.class_id = 10001 
ORDER BY p.comment_id DESC 
LIMIT 10000;

#####进行反范式化的设计######
#表的复制
CREATE TABLE class_comment1
AS
SELECT * FROM class_comment;

#添加主键,保证class_comment1 与class_comment的结构相同
ALTER TABLE class_comment1
ADD PRIMARY KEY (comment_id);

SHOW INDEX FROM class_comment1;

#向课程评论表中增加stu_name字段
ALTER TABLE class_comment1
ADD stu_name VARCHAR(25);

#给新添加的字段赋值
UPDATE class_comment1 c
SET stu_name = (
SELECT stu_name
FROM student s
WHERE c.stu_id = s.stu_id
);

#查询同样的需求
SELECT comment_text, comment_time, stu_name 
FROM class_comment1 
WHERE class_id = 10001 
ORDER BY comment_id DESC 
LIMIT 10000;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117

在这里插入图片描述

# 反范式的新问题

在这里插入图片描述

# 反范式的适用场景

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

# 巴斯范式

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

# 第四范式

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

# 第五范式、域键范式

在这里插入图片描述

# 实战案例

在这里插入图片描述

# 迭代1次:考虑1NF

在这里插入图片描述

# 迭代2次:考虑2NF

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

# 迭代3次:考虑3NF

我们的进货单头表,还有数据冗余的可能。因为“suppliername”依赖“supplierid”,那么,这个时候,就可以按照第三范式的原则进行拆分了。我们就进一步拆分下进货单头表,把它解析成供货商表和进货单头表。

在这里插入图片描述

# 反范式化:业务优先的原则

在这里插入图片描述

所以最终就被拆分成了下面四张表:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

# ER模型

在这里插入图片描述

# ER模型包括哪些要素

在这里插入图片描述

# 关系的类型

在这里插入图片描述

# 建模分析

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

# ER模型的细化

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

# ER模型转化为数据表

在这里插入图片描述

值得注意的是:

在这里插入图片描述

还有:

在这里插入图片描述

# 数据表的设计原则

在这里插入图片描述

在这里插入图片描述

# 数据库对象编写建议

在这里插入图片描述

# 关于库

在这里插入图片描述

# 关于表、列

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

# 关于索引

在这里插入图片描述

# SQL编写

在这里插入图片描述

在这里插入图片描述

编辑 (opens new window)
上次更新: 2024/01/26, 05:03:22
第29章【高级篇】索引优化与查询优化
第31章【高级篇】数据库其它调优策略

← 第29章【高级篇】索引优化与查询优化 第31章【高级篇】数据库其它调优策略→

最近更新
01
python使用生成器读取大文件-500g
09-24
02
Windows环境下 Docker Desktop 安装 Nginx
04-10
03
使用nginx部署多个前端项目(三种方式)
04-10
更多文章>
Theme by Vdoing | Copyright © 2022-2024 chaos | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式