一、数据库范式:
数据库范式(Database Normalization)是数据库设计的一种方法,它主要目的是减少数据冗余,增加数据完整性,以及简化数据修改操作。通过范式设计,数据库结构更加清晰,易于管理和维护。数据库范式主要包括以下几个级别:
数据库设计 共计6范式。
第一范式(1NF):确保数据库表的每一列都是不可分割的基本数据项,且每一列的数据类型相同。简而言之,第一范式要求数据库表的每一列都是原子性的。
第二范式(2NF):在满足第一范式的基础上,要求数据库表中的每个实例或行必须可以被唯一地识别,主要通过设置主键来实现。此外,第二范式还要求表中的非主属性完全依赖于主键。
第三范式(3NF):在满足第二范式的基础上,确保数据库表中的每一列都直接依赖于主键,而不是依赖于其他非主键列。这样可以进一步减少数据冗余,提高数据的一致性。
巴斯-科得范式(BCNF):比第三范式更严格的范式,它要求数据库表中的所有属性都完全依赖于主键,而不仅仅是非主属性。
第四范式(4NF):主要处理多值依赖问题,确保一个表中的多值事实不会造成其他事实的不必要重复。
第五范式(5NF):又称为投影-连接范式,主要关注于将表分解成更小的、更容易管理的部分,同时保持数据的一致性和完整性。
注意: 用到第三种范式就行了,范式不是越严格越好,实际情况,为了查询效率,适当的冗余数据是必要的。
第一范式:
1、属性不可再分:
错误做法如下
id | name_age |
---|---|
1 | 张三_18 |
正确做法:
id | name | age |
---|---|---|
1 | 张三 | 18 |
2、第二范式:
在1NF的基础上,非主属性必须完全依赖于主键。
例如:一个订单表格中,每个订单只能对应一个客户,客户信息不应该存储在订单表格中,而应该单独建立一个客户表格。
错误做法如下:本表是订单表,订单id必须是唯一的,但由于商品详情信息,导致了订单id成了非主索引
order表
order_id | pro_id | user_id | count | create_time | price |
---|---|---|---|---|---|
1 | 1 | 1 | 10 | 2021-12-12 | 15.00 |
1 | 2 | 1 | 3 | 2021-12-12 | 18.00 |
正确做法:使用中间表关联
订单表:
id | user_id | create_time |
---|---|---|
1 | 1 | 2021-12-12 |
订单详情表
order_id | pro_id | count | name |
---|---|---|---|
1 | 1 | 10 | 丸子 |
1 | 2 | 3 | 牛肉 |
3、第三范式:
在2NF的基础上,任何非主属性不依赖于其他非主属性
一个订单表格中,商品名、商品价格和商品数量应该分别存储在一个商品表格中,而不是存储在订单表格中。
例子如下:
订单详情表
order_id | pro_id | count |
---|---|---|
1 | 1 | 10 |
1 | 2 | 3 |
商品表
id | name | price |
---|---|---|
1 | 丸子 | 15.00 |
2 | 牛肉 | 18.00 |
二、数据库字段类型设计原则:
1、更小的更好: 更小的计算速度更快。
2、简单的好:对比查找速度越快。
3、尽量避免使用null:
- 含义模糊:NULL表示“无值”或“未知”,这种模糊性可能导致数据解读上的困惑。
- 查询复杂:包含NULL值查询更复杂。比如使用IS NULL或IS NOT NULL等操作符,
- 索引问题:大多数数据库系统对NULL值的索引处理并不高效。
- 数据完整性:NULL值可能破坏数据的完整性。
- 应用逻辑复杂:在应用程序中处理NULL值可能需要额外的逻辑判断,这增加了代码的复杂性和维护难度。
- 空间浪费:可能会浪费存储空间,因为数据库系统需要为这些NULL值分配额外的空间来标识它们的状态。
具体类型由 ←越小 ↑越简单。
- 整形 tinyint int bigint
- 浮点: float double decimal
- 字符串: char varchat blob text enum set
- 日期: datetime timestamp
设计小技巧,在存储货币时,如果要求效率又要求精度,可以考虑用 bigint 放大数据存放。例如,1.11元→111分。