10.规范化数据库设计

本文最后更新于:2021年10月1日 晚上

规范化数据库设计

为什们需要设计?

当数据库比较复杂的时候,我们对数据库进行设计

  • 糟糕的数据库设计
    • 数据冗余,浪费空间
    • (自带外键)数据库插入和删除麻烦
    • 程序的性能差
  • 良好的数据库设计
    • 节省内存空间
    • 保证数据库的完整性
    • 方便我们开发系统

数据库设计步骤

  • 分析需求:分析业务和需要处理的数据库的需求
    • 分析要用的表,以及表中需要保存的信息
    • 提取和表相关的实体类,讲需求落实到表的每一个字段
  • 概要设计:设计关系图E-R图
    • 标识实体之间的关系

三大范式

第一范式(1NF)

原子性:要求数据库表的每一列都是不可分割的原子数据项

第二范式(2NF)

前提:满足第一范式

要求表中的每一列都和主键相关库,而不能只与主键的某一部分相关(主要针对联合主键而言)

示例:联合主键(A,B),但表中C、D和A、B相关,E和B相关,那么对于表(A,B,C,D,E)来说,就不满足第二范式。

​ 因为表的非主键列和主键不是完全相关,即不是:所有非主键列都是和(A,B)相关。

​ 那么就需要拆分表为(A,C,D),(B,E)两个表

第三范式(3NF)

前提:满足第二范式

确保表中的每一列数据都和主键直接相关,而不能间接相关(在2NF的基础上消除传递依赖)

示例:假设表中所有非主键列都完全依赖于主键(满足2NF),但是,有一列C实际上直接相关的是B(也就是说 主键->B->C,传递依赖也满足2NF)

​ 所以我们要把(B,C)单独成表,删除原表中的C(因为原表通过B就可以找到C的信息)

规范型 和 性能的问题

阿里:关联查询的表不超过3个

  • 考虑商业化的需求和目标,数据库的性能更重要
  • 故意给表增加一些冗余的字段(从多表查询变为单表查询)
  • 故意增加一些计算列(从大数据量降低为小数据量)

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!