数据库设计 (范式)

一、数据库范式:

数据库范式(Database Normalization)是数据库设计的一种方法,它主要目的是减少数据冗余,增加数据完整性,以及简化数据修改操作。通过范式设计,数据库结构更加清晰,易于管理和维护。数据库范式主要包括以下几个级别:

数据库设计 共计6范式。
第一范式(1NF):确保数据库表的每一列都是不可分割的基本数据项,且每一列的数据类型相同。简而言之,第一范式要求数据库表的每一列都是原子性的。
第二范式(2NF):在满足第一范式的基础上,要求数据库表中的每个实例或行必须可以被唯一地识别,主要通过设置主键来实现。此外,第二范式还要求表中的非主属性完全依赖于主键。
第三范式(3NF):在满足第二范式的基础上,确保数据库表中的每一列都直接依赖于主键,而不是依赖于其他非主键列。这样可以进一步减少数据冗余,提高数据的一致性。
巴斯-科得范式(BCNF):比第三范式更严格的范式,它要求数据库表中的所有属性都完全依赖于主键,而不仅仅是非主属性。
第四范式(4NF):主要处理多值依赖问题,确保一个表中的多值事实不会造成其他事实的不必要重复。
第五范式(5NF):又称为投影-连接范式,主要关注于将表分解成更小的、更容易管理的部分,同时保持数据的一致性和完整性。

注意: 用到第三种范式就行了,范式不是越严格越好,实际情况,为了查询效率,适当的冗余数据是必要的。

第一范式:

1、属性不可再分:

错误做法如下

idname_age
1张三_18

正确做法:

idnameage
1张三18

2、第二范式:

在1NF的基础上,非主属性必须完全依赖于主键。
例如:一个订单表格中,每个订单只能对应一个客户,客户信息不应该存储在订单表格中,而应该单独建立一个客户表格。

错误做法如下:本表是订单表,订单id必须是唯一的,但由于商品详情信息,导致了订单id成了非主索引
order表

order_idpro_iduser_idcountcreate_timeprice
111102021-12-1215.00
12132021-12-1218.00

正确做法:使用中间表关联
订单表:

iduser_idcreate_time
112021-12-12

订单详情表

order_idpro_idcountname
1110丸子
123牛肉

3、第三范式:
在2NF的基础上,任何非主属性不依赖于其他非主属性
一个订单表格中,商品名、商品价格和商品数量应该分别存储在一个商品表格中,而不是存储在订单表格中。
例子如下:
订单详情表

order_idpro_idcount
1110
123

商品表

idnameprice
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分。

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值