讲真!【三大范式】我一直不太想了解,因为学的时候只记得很绕口,导致脑子根本跟不上,现在也就只是知道有这个东西,有没有用过不太知道【三大范式:感觉有被冒犯到】好了!不抹黑自己了。
同志们【三大范式】还是很重要的,不要提到三大范式就只想到第一范式、第二范式、第三范式,不然我可是会提问:什么是第一范式、第二范式、第三范式?记不起来了?那就不要拒绝我,继续往下看吧!
第一范式:数据表中的每一列(也就是每个字段)都不可以再拆分。
这句话其实是个问句:什么叫不可再拆分?
举个例子:
id |
address |
1 |
中国广东 |
2 |
中国广西 |
上面有一个用户表,表中address【一般我们会存 中国广东 这样子】但是,按照第一范式我们还可以拆分成国家、省份,所以原本的一个字段要拆成两个字段
id |
country |
province |
1 |
中国 |
广东 |
2 |
中国 |
广西 |
不要吐槽麻烦(我们还年轻,我们不怕麻烦)其实这样也有好处,比如说刚刚的用户地址,当你只是单纯的展示地址,那么一个字段就非常nice啦!但是,如果后期有国家省份筛选统计怎么办?所以遵循第一范式,规范的设计表结构很有必要!
第二范式:在满足第一范式的基础上,非主键列完全依赖于主键,而不能只依赖于主键的一部分。
第三范式:在满足第二范式的基础上,非主键只依赖于主键,而不依赖于其他非主键。
说实话,这个是我可以看懂的吗?个人建议小盆友尽量不要记这些绕口的话术
下面建个订单表来举个例子:
id |
commodity_name |
commodity_price |
address |
create_time |
1 |
衣服 |
9.9 |
中国广东 |
2022-08-23 |
2 |
衣服 |
9.9 |
中国广西 |
2022-08-23 |
这个表就不满足范式规则(大家不要学哈!)遵循三大范式,我们需要设计联合主键:
商品表
id |
commodity_name |
commodity_price |
1 |
衣服 |
9.9 |
2 |
裤子 |
19.9 |
用户表
id |
address |
1 |
中国广东 |
2 |
中国广西 |
订单表
id |
commodity_id |
user_id |
create_time |
1 |
1 |
1 |
2022-08-23 |
2 |
1 |
2 |
2022-08-23 |
大概就是这样:把每个字段拆分到极简,让每张表只描述一件事情,减少数据冗余,节省空间,避免增删改异常【上面的表就简单举个例子,有些粗糙的,大家不要学】当然,这样的设计表还是有点问题的,我们查询时就会增加复杂度,查询性能也会降低。所以实际上,一般互联网公司的设计都是反范式的,通过冗余一些数据,避免跨表跨库,利用空间换时间,提高性能【感觉讲了个寂寞~】