数据库设计三范式

2021-08-10

数据库设计三范式


有下划线的代表是主键

1. 确保列的原子性

所有字段都是不可分解的原子值

用户表:

不存在多个收货地址的需求...懒得搞了

用户ID用户名称联系电话会员级别收货地址积分
888张三17612341234V1上海市崇明县新村乡新卫村XXX号666

假设收货地址这个列, 我们经常需要用到地址中城市的数据, 这种时候应该把城市提取出新的列,或者干脆把地址拆成 省, 市, 区, 详细地址 四个列


(修改成如下)

用户ID用户名称联系电话会员级别详细地址积分
888张三17612341234V1上海市上海市崇明县新村乡新卫村XXX号666

2. 确保列与主键相关

就是要有主键,并且每列都和主键相关,而不是部分主键相关(复合主键中的某一个)

举例如下:

用户表为范式一的用户表

订单表:

订单ID商品ID商品名称商品价格数量用户ID用户名称联系电话收货地址
12奥特曼1001888张三17612341234XXXXXXXX
13怪兽2001888张三17612341234XXXXXXXX

(订单ID和商品ID 是复合主键)

上面这张表也能完成订单的效果, 但是他违背了第二范式 商品名称, 商品价格 只和 商品ID 相关 不和 订单ID 相关

(订单表拆成如下:)


订单表:

订单ID总价格用户ID用户名称联系电话
1300888张三17612341234

商品表:

商品ID商品名称商品价格
2奥特曼100
3怪兽200

订单商品表:

ID订单ID商品ID
112
213

3. 确保每列的值都和主键直接相关, 而不是间接相关

简单来说就是减少冗余字段

前面范式二 最后的订单用户名称, 联系电话 ,收获地址=在用户表中已经存在了, 不应该冗余, 只要有下单的用户ID就行了


反范式:

由于目前流行微服务架构 比如订单服务, 商品服务,用户服务完全是3个服务,数据库是独立的, 所以不一定需要根据数据库三范式设计数据库,

还有一个原因是因为现在的互联网公司数据量庞大, 导致会分库分表, 所以不适合连表查询, 最后反而会搞很多冗余数据, 来减少连表查询, 当然 最重要的原因其实是因为(硬盘不值钱,便宜)


标题:数据库设计三范式
作者:小可大魔王
地址:http://xiaokedamowang.cn/articles/2021/08/10/1628591302049.html