数据库范式是为了规范数据库表结构设计,使结构更合理,消除存储异常,使数据冗余尽量小。便于插入、删除和更新。
第一范式:列不可再拆分
列指的字段或者叫属性,所有的字段都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。
例如:
商品编码 | 商品款码 | 售价 |
---|---|---|
#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表记录内容,但是查询的时候就需要联表查询,如果数据表的数据量很大就会造成查询性能下降,有时候需要适当的冗余数据列来提高查询性能。
原创文章,作者:306829225,如若转载,请注明出处:https://blog.ytso.com/tech/database/275970.html