数据库三大范式

时间:2022-12-07 12:01:57


        讲真!【三大范式】我一直不太想了解,因为学的时候只记得很绕口,导致脑子根本跟不上,现在也就只是知道有这个东西,有没有用过不太知道【三大范式:感觉有被冒犯到】好了!不抹黑自己了。

        同志们【三大范式】还是很重要的,不要提到三大范式就只想到第一范式、第二范式、第三范式,不然我可是会提问:什么是第一范式、第二范式、第三范式?记不起来了?那就不要拒绝我,继续往下看吧!

第一范式:数据表中的每一列(也就是每个字段)都不可以再拆分。

这句话其实是个问句:什么叫不可再拆分?

举个例子:

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

大概就是这样:把每个字段拆分到极简,让每张表只描述一件事情,减少数据冗余,节省空间,避免增删改异常【上面的表就简单举个例子,有些粗糙的,大家不要学】当然,这样的设计表还是有点问题的,我们查询时就会增加复杂度,查询性能也会降低。所以实际上,一般互联网公司的设计都是反范式的,通过冗余一些数据,避免跨表跨库,利用空间换时间,提高性能【感觉讲了个寂寞~】