oltp系统中的数据库的设计严格遵守第三范式,具体怎么理解呢
1. 什么是第三范式(3NF)?
第三范式建立在第一范式(1NF)和第二范式(2NF)的基础上,要求满足:
1.满足1NF(所有属性都是原子性的,不可再分)
2.满足2NF(非主键属性完全依赖于整个主键,不存在部分依赖)
3.不存在传递依赖:任何非主键属性不依赖于其他非主键属性
2. 3NF在OLTP系统中的具体表现
1.消除冗余数据:每个数据项只存储在一个地方,通过外键关系引用而不是重复存储
2.高度规范化:将数据分解为多个关联表,例如:订单系统中客户信息、产品信息、订单信息分别在三个表中存储
3.确保数据一致性:通过外键约束维护关系完整性,避免更新异常(修改一处即可,不需要多处修改)
3. 实际设计示例
不符合3NF的设计(存在传递依赖):
订单表(订单ID, 客户ID, 客户名称, 客户地址, 产品ID, 数量, 单价)
问题:客户名称和地址依赖于客户ID,而不是直接依赖于订单ID
符合3NF的设计:
订单表(订单ID, 客户ID, 产品ID, 数量, 单价)
客户表(客户ID, 客户名称, 客户地址)
产品表(产品ID, 产品名称, 产品描述)
4. 为什么OLTP系统需要严格遵守3NF
高频率的写操作:减少更新时需要修改的地方
数据一致性要求高:避免数据不一致
查询模式:OLTP通常是简单、精确的查询(如通过主键查询)
5. 注意事项
虽然3NF在OLTP中很重要,但有时会根据实际情况做适当调整(如适度冗余以提高性能),这需要在规范化和性能之间取得平衡。
6. 下面是从网络上面下载的严格遵守第三范式的建模例子
上面有些维表如:Date表、Month表、Year表 这三张表过于严格遵守第三范式了,应该将这三张表去掉,将 OrderHeader表 中的 OrderDate字段 的内容直接改成 年-月-日 即可,不必要将 OrderDate字段 设计成外键和 Date表 中的 DateId字段 相关联,不然这样想得到具体的日期还得关联 Date表、Month表、Year表,这样效率太低了,应该适度冗余用以提高性能。同理 SalesRep表 和 Gender表 里面只有一个字段信息,这两个表也可以去掉,直接将 SalesRep表 中的 SalesRepName字段 写进 OrderHeader表 中、将 Gender表 中的 GenderName字段 写进 Customer表中。
7.下面的链接是 zuoanlove 大佬写的,很详细,可以重点看一下
OLTP数据库建模中的三个范式化解析