学习mysql的最后一座大山---表设计

1,373 阅读2分钟

「本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!

mysql学了很多,听了很多,最后一到业务,还是不知道从哪里下手,这也是从学习到入行的最后一道关卡。

设计表的时候,首先知道3范式:

  • 第一范式:要求有主键,并且要求每一个字段原子性不可再分
  • 第二范式:要求所有非主键字段完全依赖主键,不能产生部分依赖
  • 第三范式:所有非主键字段和主键字段之间不能产生传递依赖

反正我看了等于没看,不知道在说啥。所以,忘记吧。

第一次设计

举个例子,最经典的学生、课程表。

有人这样设计:

学生Id  姓名  性别 身份证号  学号  课程1  课程2 课程3 老师1 老师2 老师3

这样每个学生学了哪些课程,一条语句就查到了。

问题是什么?

如果加课程要改表结构,表字段可能非常多,课程改名了要全表update。

第二次设计

老师表 
老师ID 名字 性别 身份证号  课程ID1 课程ID2 课程ID3

课程表
课程ID 名字

学生表
学生Id  姓名  性别 身份证号  学号  课程ID1 课程ID2 课程ID3

这样改名字了不用全表update,字段也少了,但是加课程还是不方便。

老师表 
老师ID 名字 性别 身份证号  

课程表
课程ID 名字

学生表
学生Id  姓名  性别 身份证号  学号  

授课表
主键id  老师Id 课程Id

报课表
主键id  学生Id 课程Id

这样设计,就是范式设计,别问,就悟

第三次设计

如果我们要查学生的的课程、老师是哪几个,需要这样:

select 课程表.名字  老师表.名字
报课表 join  授课表  join 老师表  join 课程表

如果这个查询非常常用,我们可以优化一下

课程表
课程ID 课程名字 授课老师名字

查询

select 课程表.课程名字  课程表.授课老师名字
报课表 join 课程表

这样连两张表就好了,虽然授课老师改了要update全部课程表,但是这种情况业务中比较少,觉得可以接受,就叫反范式。

总结

当然,表设计还有很多细节,后面会逐步涉及,不要想一天吃成胖子,先入行把。

结语

  • 如果有不对的地方欢迎指正。
  • 如果有不理解的地方欢迎指出我来加栗子。
  • 如果感觉OK可以点赞让更多人看到它。

相关阅读: