持续学习&持续更新中…

学习态度:守破离


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

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

为什么需要数据库设计

范式

范式简介

范式都包括哪些

键和相关属性的概念

第一范式

第二范式

第三范式

小结

反范式化

概述

应用举例

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次:考虑1NF

迭代2次:考虑2NF


迭代3次:考虑3NF

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

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

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

ER模型

ER模型包括哪些要素

关系的类型

建模分析

ER模型的细化

ER模型转化为数据表

值得注意的是:

还有:

数据表的设计原则

数据库对象编写建议

关于库

关于表、列

关于索引

SQL编写

参考

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


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


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

  1. 【宋红康 MySQL数据库 】【高级篇】【17】MySQL事务日志:redo、undo

    持续学习&持续更新中- 学习态度:守破离 [宋红康 MySQL数据库 ][高级篇][17]MySQL事务日志 概述 redo日志 为什么需要redo日志 redo日志的好处.特点 redo的组 ...

  2. 【宋红康 MySQL数据库 】【高级篇】【07】MySQL的存储引擎

    持续学习&持续更新中- 学习态度:守破离 [宋红康 MySQL数据库 ][高级篇][07]MySQL的存储引擎 存储引擎 查看存储引擎 设置系统默认的存储引擎 设置表的存储引擎 引擎介绍 In ...

  3. 【宋红康 MySQL数据库 】【高级篇】【06】MySQL的逻辑架构

    持续学习&持续更新中- 学习态度:守破离 [宋红康 MySQL数据库 ][高级篇][06]MySQL的逻辑架构 逻辑架构剖析 服务器处理客户端请求 Connectors 第一层 连接层 第二层 ...

  4. 【宋红康 MySQL数据库 】【高级篇】【12】性能分析工具的使用

    持续学习&持续更新中- 学习态度:守破离 [宋红康 MySQL数据库 ][高级篇][12]性能分析工具的使用 数据库服务器的优化步骤 查看系统性能参数 统计SQL的查询成本:last_quer ...

  5. 【宋红康 MySQL数据库 】【高级篇】【03】MySQL的数据目录

    持续学习&持续更新中- 学习态度:守破离 [宋红康 MySQL数据库 ][高级篇][03]MySQL的数据目录 MySQL8的主要目录 数据文件的存放目录 命令存放目录 配置文件目录 数据库和 ...

  6. 【宋红康 MySQL数据库 】【高级篇】【16】事务基础知识

    持续学习&持续更新中- 学习态度:守破离 [宋红康 MySQL数据库 ][高级篇][16]事务基础知识 数据库事务概述 存储引擎支持情况 基本概念 事务的ACID特性 事务的状态 如何使用事务 ...

  7. 【宋红康 MySQL数据库 】【高级篇】【15】数据库其它调优策略

    持续学习&持续更新中- 学习态度:守破离 [宋红康 MySQL数据库 ][高级篇][15]数据库其它调优策略 数据库调优的措施 调优的目标 如何定位调优问题 调优的维度和步骤 优化MySQL服 ...

  8. 【宋红康 MySQL数据库 】【高级篇】【02】MySQL字符集、比较规则、大小写规范、sql_mode

    持续学习&持续更新中- 学习态度:守破离 [宋红康 MySQL数据库 ][高级篇][02]MySQL字符集.比较规则.大小写规范.sql_mode 默认字符集 MySQL8 MySQL5 修改 ...

  9. 【宋红康 MySQL数据库】【14】视图

    持续学习&持续更新中- 学习态度:守破离 [宋红康 MySQL数据库][14]视图 视图概述 为什么使用视图 视图的理解 创建视图 如何创建视图 创建单表视图 创建多表联合视图 利用视图对数据 ...

  10. 尚硅谷-宋红康-MySQL高级性能篇

    尚硅谷-宋红康-MySQL高级性能篇 第1章 Linux下MySQL的安装与使用 1. 安装前说明 1.1 Linux系统及工具准备 二级目录 三级目录 第1章 Linux下MySQL的安装与使用 1 ...

最新文章

  1. textarea 中获取用户的空格和回车
  2. centos7 iptables 端口转发 保存_iptables 防火墙
  3. JAVA瑞波币_关于Shader着色器的使用(这个是GL通用的,用什么开发设置都一样) | Java与Ripple怎么玩?...
  4. Python操作SQLServer示例
  5. python去除\ufeff、\xa0、\u3000
  6. CAM350 使用,典型做钢网
  7. 家长进课堂 计算机ppt,小学生家长进课堂ppt
  8. 文献阅读-深度学习跨模态图文检索研究综述
  9. 禅道管理员忘记密码找回密码
  10. 视频教程-HTML+CSS+JavaScript基础-HTML5/CSS
  11. 我为什么鼓励工程师写博客
  12. 如果你突然打了个喷嚏,那
  13. Qt5.12案例 翻金币小游戏
  14. 5G LAN — 技术实现原理
  15. Linux下的C语言——第九节 指针
  16. EMV技术学习和研究(七)持卡人验证
  17. 程序员面试时应该知道的福利待遇
  18. 阿德莱德大学计算机博士项目,澳大利亚阿德莱德大学计算学院招收博士生,全额奖学金,学费全免...
  19. 【CSS】CSS的三大特性
  20. vs2003一查找就卡死了

热门文章

  1. java毕业设计宿舍管理系统mybatis+源码+调试部署+系统+数据库+lw
  2. Radasm 配置goasm
  3. Js封装组件 + Slots插槽
  4. 直流电机PID控制源码c语言,51单片机PID+PWM直流电机转速闭环控制源码(12864液晶显示)...
  5. 一文读懂电子材料行业最新发展趋势
  6. 【记录】数控程序的指令代码---标准G代码与标准M代码
  7. 12000字解读BabyCare:母婴用品品牌的终局是走向全品类吗?
  8. python图像风格迁移教程_【人工智能】python图像风格迁移,来欣赏梵高风格的石原里美吧!...
  9. c语言erf函数,c/c++开发分享精确计算缩放互补误差函数,erfcx()
  10. 数据分析——RFM模型