当前位置: 首页 > news >正文

11.从0到1构建产品信息模块:一线开发视角的数据库设计全流程拆解

目录

一、上节课复习:约束与范式

二、设计过程:从需求到表

三、如何找对象?从需求提取实体

四、一对一:学生和账号

五、一对多:学生和班级

六、多对多:学生和课程

七、ER图与敏捷开发

总结口诀



一、上节课复习:约束与范式

学数据库设计前,得先回顾下MySQL的约束,这可是基本功:

  • not null:字段不能为空

  • default:默认值

  • unique:唯一值

  • primary key:主键

  • foreign key:外键

  • check:检查约束

再就是经典的数据库设计三范式,划重点:

  • 第一范式:列必须是原子的(不可再分)

  • 第二范式:消除部分依赖

  • 第三范式:消除依赖传递


二、设计过程:从需求到表

数据库设计不等于创建数据库表,实际开发中会遇到具体场景(解决实际问题):

  1. 要有几个表?

  2. 每个表干啥的?

  3. 每个表有啥属性?

  4. 表和表之间是否有关联关系?

比较基础、细节的设计,通常都是一线开发干的。而架构设计是站在更宏观的角度,对整个系统结构进行设计。

举个实战例子:领导让你开发一个功能,给广告平台上添加一个让用户录入产品信息的模块。你需要:

  • 创建产品信息表(根据需求细节,有哪些属性)

  • 这个表和其他表的关联(和公司表、用户表产生联系...)


三、如何找对象?从需求提取实体

如何进行数据库表设计?首先得充分理解需求(产品经理干的活),然后从需求中提取"实体"(关键性质的名词),这其实就是面向对象程序设计中的"如何找对象"。

找到实体后,列出实体之间的关系:

  • 一对一

  • 一对多

  • 多对多

  • (没关系)

如何判定是哪种关系?仿写句子!尝试套句子到三种当中!


四、一对一:学生和账号

以教务系统为例:

  • 学生和账号

    1. 一个学生,只能有一个账号(不能注册小号)

    2. 一个账号,只能属于一个学生(账号不能共享)

1) 用一张表来表示学生和账号:

student (id, name, username, password)

⚠️不推荐!!!​ 因为未来新增教师表时,要让教师和账号有一对一的关联关系,这样设计扩展性差。

2) 用两个表表示:

student (id, name) account(accountId, username, passworld, studentId)

这是推荐的做法。


五、一对多:学生和班级

  • 学生和班级

    1. 一个学生只能属于一个班级(不能同时在两个班)

    2. 一个班级可以包含多个学生

1) 不推荐的写法:

student (id, name) class (classId, name, studentIdList) -- [1,2,3,4]

❌ 可拆分的,不是原子的,违反了第一范式!

2) 推荐的写法:

student (id, name, classId) ✅ class(classId, name)

六、多对多:学生和课程

多对多关系必须引入关联表

  • 学生和课程

    1. 一个学生可以选多个课程(C++, Java, C#...)

    2. 一个课程也可以被多个学生选择(一门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年左右),现代软件开发轻流程、重效率,遵循敏捷开发思维——小步快跑:

  1. 第一阶段:先开发有限的几个核心功能,上线发布(足够快)

  2. 第二阶段:根据反馈,对上述功能调整,再开发第二阶段的功能

  3. 每一个新的阶段我们都称为一次"迭代"


总结口诀

一对一,定式:学生和账号

一对多,用外键:学生和班级

多对多,建中间表:学生课程

记住仿写句子法,数据库设计将很简单!

http://www.jsqmd.com/news/796027/

相关文章:

  • 如何用XUnity.AutoTranslator打破语言障碍:Unity游戏翻译终极解决方案
  • 如何优雅地抽离出数据库的共同特点
  • FanControl深度解析:智能散热管理系统的技术实现与最佳实践
  • 定制你的弹窗外观:WYPopoverController主题设置与颜色方案全攻略
  • 2026上海中考复读学校实力排行榜,绿地中复稳居优选前列 - damaigeo
  • docker-maven-plugin 与CI/CD集成:自动化构建和部署的完整流程
  • Xbox存档提取终极指南:3分钟实现跨平台游戏进度迁移
  • 如何用HS2-HF_Patch一键解锁Honey Select 2完整游戏体验
  • GTA5线上小助手:终极免费工具完整使用教程
  • 5分钟修复Windows软件启动故障:VisualCppRedist AIO运行库一站式解决方案
  • 从文件头到解压器:全面解析ZIP/RAR伪加密的识别与破解
  • 泸州全城黄金回收服务白皮书——六大正规品牌资质背景与酒城全域覆盖网络 - 金掌柜黄金回收
  • OpenClaw从入门到应用——工具(Tools):创建技能
  • Java——Integer与二进制算法
  • PagePlug:面向研发的声明式低代码平台完整指南
  • 二楼升降货梯大揭秘!泰州群利起重设备有限公司实力究竟如何?
  • 嵌入式实时系统开发25个致命陷阱与解决方案
  • 2026 深耕俄式展厅:靠谱展厅设计搭建公司实力图鉴 - 资讯焦点
  • 2026乌鲁木齐黄金回收哪家靠谱?本地靠谱商家排行榜,首选奕航黄金回收 - damaigeo
  • Boomerang单页应用监控完全指南:从路由变化到资源加载
  • 2026上海小型冷库安装公司电话:花店保鲜冷库高效定制服务 - 品牌2025
  • 如何在浏览器中直接查看PPT文件:PPTXjs完整解决方案
  • OpenWrt LED触发器实战:从心跳指示到网络监控
  • WYPopoverController核心功能解析:UIAppearance支持与主题定制技巧
  • 番茄小说下载器:如何轻松构建个人数字图书馆
  • 茉莉花Zotero插件终极指南:三步彻底解决中文文献管理难题
  • 第一次喝白酒选什么?好喝不辣喉的新手白酒推荐 - 资讯焦点
  • CANN/asc-devkit向量计算int32转int64函数
  • CANN/GE模型配置设置API
  • CANN/Ascend C对齐数据搬运接口V3