数据库范式

数据库范式是为了规范数据库表结构设计,使结构更合理,消除存储异常,使数据冗余尽量小。便于插入、删除和更新。

第一范式:列不可再拆分

列指的字段或者叫属性,所有的字段都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。
例如:

商品编码 商品款码 售价
#001 A001 100
#002 A001 200

每个字段的含义是明确的,但事实上在某些情况会违反这一原则,称之为反模式,例如加一个扩展字段,该字段内容是个json,可以动态添加一些非常用的字段,比如{"产地":"XX","生产批次":"XXXX"},好处是当不是每一条记录都必然会出现的字段需要存储时,不用额外增加字段,可以随意插入,坏处就是万一用到扩展字段作为搜索查询条件,将无法满足查询的需求。

第二范式:非主属性完全依赖于主键

数据库里的每个字段都应该和主键相关联,并完全依赖于主键,

商品编码 商品款码 商品名称 售价 销售属性
#001 A001 大码女款上衣 100 红色;XL
#002 A001 大码女款上衣 100 红色;XXL

通过商品编码可以找到商品款码
通过商品编码可以找到商品名称
通过商品编码可以找到商品售价
通过商品编码可以找到商品销售属性

第三范式:消除传递依赖(任何非主属性不依赖于其它非主属性)

商品编码 商品款码 商品名称 售价 销售属性
#001 A001 大码女款上衣 100 红色;XL
#002 A001 大码女款上衣 100 红色;XXL

在这张表里 商品名称其实可以依赖于商品款码,可以将商品的款作为单独的表,将上述表拆成两部分。
SKU表

商品编码 商品款码 售价 销售属性
#001 A001 100 红色;XL
#002 A001 100 红色;XXL

Item表

商品款码 商品名称
A001 大码女款上衣

如果严格按照范式设计数据库,更新数据时影响的范围会比较小,比如更新商品款式的名称时只需要更新Item表的一条记录就行了,不需要更新所有SKU表记录内容,但是查询的时候就需要联表查询,如果数据表的数据量很大就会造成查询性能下降,有时候需要适当的冗余数据列来提高查询性能。

posted @ 2022-07-22 00:47  sands  阅读(35)  评论(0编辑  收藏  举报