11.从0到1构建产品信息模块:一线开发视角的数据库设计全流程拆解
目录
一、上节课复习:约束与范式
二、设计过程:从需求到表
三、如何找对象?从需求提取实体
四、一对一:学生和账号
五、一对多:学生和班级
六、多对多:学生和课程
七、ER图与敏捷开发
总结口诀
一、上节课复习:约束与范式
学数据库设计前,得先回顾下MySQL的约束,这可是基本功:
not null:字段不能为空
default:默认值
unique:唯一值
primary key:主键
foreign key:外键
check:检查约束
再就是经典的数据库设计三范式,划重点:
第一范式:列必须是原子的(不可再分)
第二范式:消除部分依赖
第三范式:消除依赖传递
二、设计过程:从需求到表
数据库设计不等于创建数据库表,实际开发中会遇到具体场景(解决实际问题):
要有几个表?
每个表干啥的?
每个表有啥属性?
表和表之间是否有关联关系?
比较基础、细节的设计,通常都是一线开发干的。而架构设计是站在更宏观的角度,对整个系统结构进行设计。
举个实战例子:领导让你开发一个功能,给广告平台上添加一个让用户录入产品信息的模块。你需要:
创建产品信息表(根据需求细节,有哪些属性)
这个表和其他表的关联(和公司表、用户表产生联系...)
三、如何找对象?从需求提取实体
如何进行数据库表设计?首先得充分理解需求(产品经理干的活),然后从需求中提取"实体"(关键性质的名词),这其实就是面向对象程序设计中的"如何找对象"。
找到实体后,列出实体之间的关系:
一对一
一对多
多对多
(没关系)
如何判定是哪种关系?仿写句子!尝试套句子到三种当中!
四、一对一:学生和账号
以教务系统为例:
学生和账号
一个学生,只能有一个账号(不能注册小号)
一个账号,只能属于一个学生(账号不能共享)
1) 用一张表来表示学生和账号:
student (id, name, username, password)⚠️不推荐!!! 因为未来新增教师表时,要让教师和账号有一对一的关联关系,这样设计扩展性差。
2) 用两个表表示:
student (id, name) account(accountId, username, passworld, studentId)这是推荐的做法。
五、一对多:学生和班级
学生和班级
一个学生只能属于一个班级(不能同时在两个班)
一个班级可以包含多个学生
1) 不推荐的写法:
student (id, name) class (classId, name, studentIdList) -- [1,2,3,4]❌ 可拆分的,不是原子的,违反了第一范式!
2) 推荐的写法:
student (id, name, classId) ✅ class(classId, name)六、多对多:学生和课程
多对多关系必须引入关联表!
学生和课程
一个学生可以选多个课程(C++, Java, C#...)
一个课程也可以被多个学生选择(一门Java课可以被张三、李四、王五多个学生选择)
表结构设计:
student(studentId, name....) 1 张三 2 李四 course(courseId, name....) 100 语文 101 数学 student-course (studentId, courseId...) 1 100 张三选择了语文课 1 101 张三选择了数学课 2 100 李四选择了语文课 2 101 李四选择了数学课七、ER图与敏捷开发
ER图(实体关系图)是把上述的实体和关系画出来。不过上古时期软件开发非常重视流程和文档(2000年左右),现代软件开发轻流程、重效率,遵循敏捷开发思维——小步快跑:
第一阶段:先开发有限的几个核心功能,上线发布(足够快)
第二阶段:根据反馈,对上述功能调整,再开发第二阶段的功能
每一个新的阶段我们都称为一次"迭代"
总结口诀
一对一,定式:学生和账号
一对多,用外键:学生和班级
多对多,建中间表:学生课程
记住仿写句子法,数据库设计将很简单!
