数据库范式,其实还是不懂为什么叫范式这么拗口

234 阅读3分钟
  • 参考 数据库设计三大范式(简单易懂)
  • 为了减少冗余,建立结构合理的表格,设计数据库时要遵循一定的规则,然后这些规则就是所谓的范式
  • 范式的话,有一下几个,但一般用到的是123
    • 第一范式,保证每一列的原子性

      • 也就是说,数据库表里的字段要细拆分到最小,不要将两个以上含义的内容放到一列里,比如说 广东广州,应该分为 广东 广州 两列
      • 燃鹅,在我实际的游戏开发中,很多时候遇到的都是不遵循这个规则的,比如在一个字段里塞入一个数组,或者是将整个数据放入一个类型为 blob 的字段。这样做在开发时的确很爽,因为不需要去做太多的数据库操作,但是不好的地方不少,比如
        • 写入时整段写入,就算你只改变了一个变量的值
        • 查询时需要做解析,而且无法用数据库的逻辑来筛选数据
        • 合服时,需要专门写代码来处理这些字段
      • 所以说,设计时还是尽量去满足第一范式
    • 第二范式,保证其他列与主键列有关

      • 首先要满足第一范式
      • 确保每一列和主键相关,而不是只和主键的一部分相关。主键不一定就只有一列,可以是多列组成的一个主键。比如说一个订单表,如下
      订单id书本id书本名称价格数量购买人电话
      2019091811书本1100112345678
      2019091812书本2200212345678
      2019091821书本1100212345679
      • 可以看到,记录里的购买人的信息只与订单相关,书本信息至于书本id相关,如果杂糅在一起,就会导致数据冗余,所以可以将其拆分下面的表

      订单id书本id数量购买人电话
      2019091811112345678
      2019091812212345678
      2019091821212345679
      书本id书本名称价格
      1书本1100
      2书本2200
    • 第三范式,保证其他列与主键列直接相关

      • 首先要满足第二范式
      • 然后保证每一列和主键是直接关系,不能存在间接关系。比如说上面的表格,购买的人的电话只跟玩家相关,然后玩家和订单id相关,这样的话是不符合第三范式的,所以需要改为
      订单id书本id数量购买人id
      201909181111
      201909181221
      201909182122
      书本id书本名称价格
      1书本1100
      2书本2200
      购买人id购买人名称电话
      112345678
      212345679