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


持续学习&持续更新中…

学习态度:守破离


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

  • 为什么需要数据库设计
  • 范式
    • 范式简介
    • 范式都包括哪些
    • 键和相关属性的概念
    • 第一范式
    • 第二范式
    • 第三范式
    • 小结
  • 反范式化
    • 概述
    • 应用举例
    • 反范式的新问题
    • 反范式的适用场景
  • 巴斯范式
  • 第四范式
  • 第五范式、域键范式
  • 实战案例
    • 迭代1次:考虑1NF
    • 迭代2次:考虑2NF
    • 迭代3次:考虑3NF
    • 反范式化:业务优先的原则
  • ER模型
    • ER模型包括哪些要素
    • 关系的类型
    • 建模分析
    • ER模型的细化
    • ER模型转化为数据表
  • 数据表的设计原则
  • 数据库对象编写建议
    • 关于库
    • 关于表、列
    • 关于索引
    • SQL编写
  • 参考

为什么需要数据库设计

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第1张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第2张图片

范式

范式简介

在这里插入图片描述

范式都包括哪些

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第3张图片

键和相关属性的概念

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第4张图片

在这里插入图片描述

第一范式

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第5张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第6张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第7张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第8张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第9张图片

第二范式

在这里插入图片描述

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第10张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第11张图片

在这里插入图片描述

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第12张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第13张图片

在这里插入图片描述

第三范式

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第14张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第15张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第16张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第17张图片

在这里插入图片描述

在这里插入图片描述

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第18张图片

在这里插入图片描述

小结

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第19张图片

反范式化

概述

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第20张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第21张图片

应用举例

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第22张图片

在这里插入图片描述

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第23张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第24张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第25张图片

在这里插入图片描述

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;

在这里插入图片描述

反范式的新问题

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第26张图片

反范式的适用场景

在这里插入图片描述

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第27张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第28张图片

巴斯范式

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第29张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第30张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第31张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第32张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第33张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第34张图片

在这里插入图片描述

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第35张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第36张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第37张图片

第四范式

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第38张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第39张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第40张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第41张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第42张图片

第五范式、域键范式

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第43张图片

实战案例

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第44张图片

迭代1次:考虑1NF

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第45张图片

迭代2次:考虑2NF

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第46张图片
【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第47张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第48张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第49张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第50张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第51张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第52张图片

在这里插入图片描述

迭代3次:考虑3NF

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

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第53张图片

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

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第54张图片

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

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第55张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第56张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第57张图片

ER模型

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第58张图片

ER模型包括哪些要素

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第59张图片

关系的类型

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第60张图片

建模分析

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第61张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第62张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第63张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第64张图片

ER模型的细化

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第65张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第66张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第67张图片

ER模型转化为数据表

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第68张图片

值得注意的是:

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第69张图片

还有:

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第70张图片

数据表的设计原则

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第71张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第72张图片

数据库对象编写建议

在这里插入图片描述

关于库

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第73张图片

关于表、列

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第74张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第75张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第76张图片

关于索引

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第77张图片

SQL编写

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第78张图片

【宋红康 MySQL数据库 】【高级篇】【14】数据库的设计规范_第79张图片

参考

尚硅谷宋红康: MySQL数据库(入门到高级,菜鸟到大牛).


本文完,感谢您的关注支持!


你可能感兴趣的:(数据库,mysql,数据库)