MySQL数据库常见面试题之三大范式
写在前面
此文章大部分不会引用最原始的概念,采用`说人话`的方式。
面试题:三大范式是什么?目的是什么?必须遵循吗?
假设有一张表(学号,姓名,课程,老师)
是什么
- 第一范式
- 字段原子性
- 第二范式
- 解决部份依赖。应该非主键列完全依赖主键。比如(学号,姓名)不可以做主键,冗余了
- 又比如在 “学生课程表” 中,有 “学生 ID”“课程 ID”“学生姓名”“课程名称” 等字段,复合主键是 “(学生 ID,课程 ID)”。其中,“学生姓名” 只依赖于 “学生 ID”,“课程名称” 只依赖于 “课程 ID”,它们都依赖于复合主键的一部分,而不是整个复合主键,这就是部分依赖。
- 第三范式
- 解决传递依赖。比如A->B->C,应该是A,B一起,C能推导了不要放进去
目的
- 三大范式目的
- 让设计模式的职责更加的单一,方便后续扩展
- 肯定优先考虑,像模型和领域的划分都是通过表来进行的
必须遵循吗?反范式?目的?
- 反范式
- 遵循范式的基础上,增加冗余字段,空间换时间 先遵守规则,在进行调整
- 目的
- 优化性能
- 1.分库分表,优化联合查询join,分页查询(分库分表之后分页不了,冗余字段来优化)
- 2.快照字段解决问题---分页查询
当然,不是一上来就反范式、冗余字段。任何系统的设计起点都是三大范式为基础,否则说明是一家外包公司(表已经给好了)。