【数据库设计那些事】- imooc
需求分析
数据库设计概述
- 什么是数据库设计?
数据库设计是根据业务系统需要选用DBMS构造最优的数据存储模型。(建立好表的结构和表与表之间关联关系的过程有效的提高表的数据存储和访问)
- 为什么进行数据库设计
优良设计 😁 | 糟糕设计😰 |
---|---|
减少数据冗余 | 存在大量数据冗余 |
避免数据维护异常 | 存储数据插入、更新和删除异常 |
节约存储空间 | 浪费大量存储空间 |
高效访问 | 访问数据低效 |
- 数据库设计步骤
需求分析 ——> 逻辑设计 ——> 物理设计 ——> 维护优化
- 数据库需求的作用点:
- 数据是什么
- 数据存在哪些属性
- 数据和属性各自的特点有哪些
需求分析重要性
- 了解系统中要存储的数据
- 了解数据的存储特点
- 了解数据的生命周期
- 实体与实体键的关系(1:1, 1:n, m:n)
- 实体所包含的属性
- 哪些属性或属性的组合可以唯一标识一个实体
需求分析举例
Eg: 小型电子商务网站
模块: 用户模块、商品模块、订单模块、购物车模块、供应商模块等
- 用户模块
包括属性: 用户名、密码、电话、邮箱、身份证号、地址、姓名、昵称...
可选唯一标识属性:用户名、身份证、电话
存储特点: 随系统上线时间逐渐增加,需要永久存储
- 商品模块
包括属性:商品编码、商品名称、商品描述、商品类型、供应商名称、重量、有效期、价格...
可选唯一标识属性:商品名称、供应商名称、商品编码
- 用户订购商品的信息
包括属性:订单号、用户姓名、用户电话、收货地址、商品编号、商品名称、数量、价格、订单状态、支付状态、订单类型...
可选唯一标识属性:订单号
存储特点:永久存储(分表、分库存储)
- 购物车模块
用于保存用户购物时选购的商品
包括属性:用户名、商品编号、商品名称、商品价格、商品描述、商品分类、加入时间、商品数量...
可选唯一标识属性:用户名、商品编号、加入时间、购物车编号
存储特点:不用永久存储(设置归档、清理规则)
存储特点:对下线商品归档存储
逻辑设计
逻辑设计是做什么的
- 将需求转化为数据库的逻辑模型 - 通过ER图的形式对逻辑模型进行展示 - 逻辑设计独立于DBMS实现层
常用名词
KEYWORDS | DESC |
---|---|
关系 | 一个关系对应一张表 |
元组 | 表中的一行记录即为一个元组 |
属性 | 表中的一列字段即为一个属性;每个属性都有一个名称称为属性名或字段名 |
候选码 | 表中的某个属性组,唯一确定的一个元组 |
主码 | 一个关系有多个候选码,选定其中一个为主码 |
域 | 属性的取值范围 |
分量 | 元组中的一个属性值 |
ER图例
DIAGRAM | DESC |
---|---|
![]() |
矩形:表示实体集,矩形内写实体集的名字 |
![]() |
菱形:表示联系集 |
![]() |
椭圆:表示实体的属性 |
![]() |
线段:将属性连接到实体集,或将实体集连接到联系集 |
数据库操作异常
- 插入异常:如果某实体随着另一个实体的存在而存在即缺少某个实体时无法表示这个实体; - 更新异常:如果更改表所对应的某个实体实例的单独属性时,需要将多行更新; - 删除异常:如果删除表的某一行来反应某实体失效时导致另一个不同实体实例信息丢失;
数据冗余
- 表中存在大量无意义的重复数据。
数据范式
第一范式(1NF)
定义:列不可再分
第二范式(2NF)
定义:属性完全依赖于主键
第三范式(3NF)
定义:属性不依赖于其它非主属性 属性直接依赖于主键(表中所有非关键字段的属性都是直接依赖于关键字段,不存在简介依赖)
BC范式
定义: 如果关键字段由多个字段共同构建,则这些构建字段直接不存在任何依赖。
物理设计
定义数据表、表以及字段的命名规范
-
MySQL常用的存储引擎
-
表以及字段的命名规则
- 可读性原则(大驼峰式)
- 表意性原则
- 长名原则
- 如何选择主键
-
区分业务主键和数据主键
业务主键用于标识业务数据,进行表与表之间的关联,数据库主键为了优化数据存储(Innodb会生成6byte的隐含主键) -
根据数据类型,考虑主键是否要顺序增长
-
主键的字段类型所占空间要尽可能的小
- 避免使用外键约束
- 降低数据导入效率
- 增加维护成本
- 相关联的列上通过建立索引代替外键
- 避免使用触发器
- 降低数据导入效率
- 业务逻辑变复杂
严谨使用预留字段
维护优化
维护和优化要做的内容:
- 维护数据字典
- 维护索引
出现在WHERE从句、GROUP BY从句、ORDER BY从句中的列;可选择性高的列要放到索引的前面;
- 维护表结构
数据表中适合的操作
- 批量操作 VS 逐条操作
- 禁止使用SELECT * 此类查询
- 控制使用用户自定义函数
- 不要使用数据库中的全文索引
在适当的时候对表进行水平拆分或垂直拆分
为了控制表的宽度可以进行表的垂直拆分
使用场景: 1. 经常一起查询的列放在一起 2. text、blob数据
为了控制表的大小可以进行表的水平拆分
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具