数据库设计
数据库设计
1. PlantUML
Idea安装如下插件,以后用它绘制一些设计图
中文手册下载:https://pdf.plantuml.net/PlantUML_Language_Reference_Guide_zh.pdf
2. ER图
ER图(Entity-Relationship Diagram)是一种用于描述实体间关系的图形化表示方法,主要用于数据库设计,可以清晰地展示实体、属性和实体间的联系。
三要素:
- 实体(Entity):表示现实世界中的一个对象、事物或概念,可以具有属性和标识符。
- 属性(Attribute):描述实体的特征或属性。每个实体可以有多个属性,如姓名、年龄、性别等。
- 联系(Relationship):表示实体之间的连接或联系。关系可以是一对一、一对多或多对多的关系。
- 上述符号通常是两个成对使用,其分别表示最小值和最大值。例如上述ER图中的班级和学生之间的连线,班级一侧的符号表示一(最小值和最大值都是一),学生一侧的符号表示多(最小值是一,最大值是多),其表达的含义就是班级和学生之间的关系为一对多,一个学生只对应一个班级,而一个班级会对应多个学生(且至少对应一个学生)。
一对一 一对多 多对多
1-1: 一个人对应一个身份证
1-n:在N表中维护1的唯一字段
n-n:需要中间表
3.1. 概念模型
概念模型是一个粗略的初步设计,其只关注实体和关系,不体现最终建表所需的各种细节信息(例如实体的属性)。下图便是一个典型的简易选课系统数据库的概念模型。
3.2. 逻辑模型
相较于概念模型,逻辑模型会包含更多的细节信息,例如实体的属性、用于关联两个实体的字段等等。需要注意的是,逻辑模型并不关注具体的数据库实现(例如MySQL或者Oracle)。下图是上述选课系统数据库的逻辑模型。
3.3. 物理模型
相较于逻辑模型,物理模型会包含更多的与所选数据库相关的具体信息,例如存储引擎、字段类型、索引等信息。一般而言,物理模型会包含最终建表所需的所有信息,下图是上述选课系统数据库的物理模型。
3.4. 数据库表设计最佳实践
设计规范:
-
明确需求,迭代设计;没有一次性就设计完成的系统
-
统一命名规范;全部使用小写字母,多单词用 _ 连接,避免使用保留字
-
合理选择数据类型、大小、NULL值:
-
- 主键:bigint、无符号型、自增。
-
-
- 数据量 18,446,744,073,709,551,616。一天用 100亿,能用到地球爆炸
-
-
- 状态类字段:用tinyint,无符号型,最大标识256种状态
- 字符串字段:
-
-
- 约束好大小,varchar(100)与varchar(255)在磁盘存储是一样的。但是查询加载到内存中是不一样的。所以依然推荐约束大小,能用小不用大,提升性能
- 参与的检索字段用char的性能高于用varchar
- 超大文本,建议单独表存储。选用text类型
-
-
- 业务上非null字段,数据库也非null约束,节省空间,提升性能
- 日期字段区别:datetime、time、timestamp
-
不做外键:由业务代码保证数据一致性。提升性能
-
合理选择冗余存储:经常联表查询的某几个字段,可以进行冗余存储,避免联表,提高性能
-
最好不要用触发器这些隐藏机制;适当使用存储过程
....
4. RBAC权限模型
认证和授权:
-
认证:你是谁?
-
- 高铁:身份证刷进站;
- 认证通过,你能使用系统的后续功能。
-
授权:你能干什么?
-
- 你只能去二等座哪个座?
认证:
- 登录:账号/密码,刷脸,指纹...
- 系统:权限令牌; jwt、uuid-token、自定义算法....
- 识别:后端能识别这个令牌是合法的还是非法的; 令牌:防伪签名(设备id、算法签名)。
- token: 项目中会讲; sa-token;
授权:
-
张三:管理员,能做很多事。
-
每做一件事,鉴权;有则继续,无则打回。
-
- 删除订单:
- 创建商品:
-
过滤器、拦截器机制;
-
- 去数据库查询张三能做哪些事?当前要做的事是否是在能做的事列表(法有授权才可为)
用户: 账号、密码、邮箱、头像
权限:权限名、权限标识