MySQL数据库常见面试题之三大范式

写在前面

此文章大部分不会引用最原始的概念,采用`说人话`的方式。

面试题:三大范式是什么?目的是什么?必须遵循吗?

假设有一张表(学号,姓名,课程,老师)

是什么

  • 第一范式
    • 字段原子性
  • 第二范式
    • 解决部份依赖。应该非主键列完全依赖主键。比如(学号,姓名)不可以做主键,冗余了
    • 又比如在 “学生课程表” 中,有 “学生 ID”“课程 ID”“学生姓名”“课程名称” 等字段,复合主键是 “(学生 ID,课程 ID)”。其中,“学生姓名” 只依赖于 “学生 ID”,“课程名称” 只依赖于 “课程 ID”,它们都依赖于复合主键的一部分,而不是整个复合主键,这就是部分依赖。
  • 第三范式
    • 解决传递依赖。比如A->B->C,应该是A,B一起,C能推导了不要放进去

目的

  • 三大范式目的
    • 让设计模式的职责更加的单一,方便后续扩展
    • 肯定优先考虑,像模型和领域的划分都是通过表来进行的

必须遵循吗?反范式?目的?

  • 反范式
    • 遵循范式的基础上,增加冗余字段,空间换时间 先遵守规则,在进行调整
    • 目的
      • 优化性能
      • 1.分库分表,优化联合查询join,分页查询(分库分表之后分页不了,冗余字段来优化)
      • 2.快照字段解决问题---分页查询

当然,不是一上来就反范式、冗余字段。任何系统的设计起点都是三大范式为基础,否则说明是一家外包公司(表已经给好了)。

你可能感兴趣的:(数据库,mysql)