数据库的范式
数据库范式(Normal Forms)是设计数据库时,为了减少数据冗余、增强数据一致性和提高数据存储效率而遵循的一系列规则。
第一范式(1NF)
- 定义:数据库表的每一列都是不可分割的原子数据项。也就是说,不能有表中某个列还可以再分成多个子列的情况。
- 示例:假设有一个学生信息表,其中有一个“学生联系方式”列,里面同时包含了电话号码和电子邮箱地址,这就不符合1NF。正确的做法是将“学生联系方式”列拆分为“电话号码”列和“电子邮箱地址”列,这样每一列都是不可再分的原子数据项。
第二范式(2NF)
- 定义:在满足1NF的基础上,非主属性完全依赖于主键。主键是用于唯一标识表中每一行数据的一个或一组列。
- 示例:考虑一个订单明细表,主键是(订单ID,商品ID)。表中有“商品名称”“商品单价”“订单金额”等列。“商品名称”和“商品单价”只依赖于商品ID,而“订单金额”依赖于(订单ID,商品ID)。如果“商品名称”只依赖于商品ID,而不完全依赖于主键(订单ID,商品ID),就不符合2NF。解决办法是可以将商品相关的信息(如商品名称、商品单价)单独放在一个商品表中,通过商品ID与订单明细表建立关联。
第三范式(3NF)
- 定义:在满足2NF的基础上,任何非主属性不传递依赖于主键。传递依赖是指如果存在A -> B,B -> C,那么A -> C就是传递依赖。
- 示例:假设有一个员工信息表,其中有“员工ID”(主键)、“部门ID”、“部门名称”。“部门名称”依赖于“部门ID”,“部门ID”又与“员工ID”关联,这样“部门名称”就传递依赖于“员工ID”,不符合3NF。应该将部门信息单独建立一个表,包括“部门ID”和“部门名称”,通过“部门ID”在员工信息表和部门表之间建立关联。
第四范式(4NF)
消除多值依赖,即表中不应该存在多个实例具有相同的主键但不同的列值组合。
第五范式(5NF)
消除连接依赖,即表中不应该存在多个实例通过连接操作产生新的信息。
范式的级别越高,数据库设计的结构就越合理,但有时候为了提高查询效率等实际需求,可能不会严格按照最高范式来设计数据库,会在数据冗余和查询性能之间进行权衡。