java面试题汇总---数据库的三范式是啥,为什么要遵守?

面试题汇总分享原因
一次面试说了自己从零到一的经历过一个完整项目。
然后面试官问我:数据库表字段都是你设计的吗?
我说:是的(很自豪的感觉。。。)
面试官:数据库的三范式是啥,为什么要遵守?
我:。。。。

数据库的三范式是啥
为什么要遵守数据库的三范式

什么是数据库的三范式
数据库的三范式(First Normal Form, Second Normal Form, Third Normal Form,简称1NF、2NF、3NF)是关系型数据库设计中的规范原则,旨在减少数据冗余、提高数据一致性和完整性,以及优化数据查询和更新的效率。
下面是三范式的详细解释:

1. 第一范式(1NF)

定义: 数据库表中的每一列(字段)都必须是不可再分的原子值,即每一个单元格只包含一个值,且这个值是不可分割的最小数据单位。

要点:

  • 消除表中复合数据类型(如数组、多值属性、嵌套结构等),确保每个字段只存储单一类型和单一值的数据。
  • 避免在一个字段中存储多个相关值(例如,将地址作为一个字段存储时,应将其拆分为街道、城市、国家等独立字段)。

2. 第二范式(2NF)

前提: 表已符合第一范式。

定义: 在第一范式的基础上,要求表中的非主键列完全依赖于主键,即非主键列不得部分依赖于主键。也就是说,表中的每个非主键列都必须直接依赖于整个主键,而不能仅依赖于主键的一部分。

要点:

  • 表具有一个唯一标识记录的主键(可以是单字段主键或多字段组合主键)。

  • 如果表中存在非主键列,这些列的值应由主键的全部信息唯一确定,而不是仅依赖于主键的一部分。

  • 若发现存在部分依赖,应通过分解表(创建新的关联表)来消除。例如,若主键为(订单ID,商品ID),而有一个“商品价格”列仅依赖于“商品ID”,则应将这部分数据移到新的关联表中。

3. 第三范式(3NF)

前提: 表已符合第二范式。

定义: 在第二范式的基础上,进一步消除非主键列对主键的传递依赖。即非主键列不仅不能直接依赖于主键的一部分,也不能通过其他非主键列间接依赖于主键。

要点:

  • 非主键列之间应相互独立,不存在依赖关系。如果有非主键列A依赖于非主键列B,而B又依赖于主键,这就构成了传递依赖。
  • 如果发现传递依赖,应通过再次分解表来消除。例如,若有一个表包含(学生ID,课程ID,教师ID,教师姓名),其中“教师姓名”依赖于“教师ID”,而“教师ID”又依赖于(学生ID,课程ID)组成的复合主键,那么应将“教师ID”及其相关信息(如“教师姓名”)移至另一个以“教师ID”为主键的表中。

总结:

  • 1NF 强调数据的原子性,确保每个字段只存储一个不可再分的值。

  • 2NF 强调非主键列与主键之间的完全依赖关系,消除部分依赖,防止数据冗余和更新异常。

  • 3NF 强调非主键列之间的独立性,消除传递依赖,进一步减少冗余和异常,提升数据的一致性和查询效率。

遵循三范式设计数据库,有助于构建结构清晰、冗余较少、易于维护的关系型数据库模型。然而,在实际应用中,根据业务需求和性能权衡,有时可能允许适度违反范式,引入适当的冗余以优化查询性能。这种折衷需要在设计时仔细考虑,并通过恰当的约束和数据同步机制来保证数据的一致性。

为什么要遵守数据库的三范式

遵守数据库的三范式(1NF、2NF、3NF)是关系型数据库设计中的重要原则,其目的是为了确保数据的完整性和一致性,减少数据冗余,简化数据管理,并提高查询和更新操作的效率。以下是遵守三范式的主要原因:

1. 减少数据冗余:

  • 遵循三范式设计的数据库能够最大限度地避免数据的重复存储。数据冗余不仅浪费存储空间,而且当数据发生变化时,需要在多个地方进行更新,否则会导致数据不一致。比如,一个学生的家庭地址如果在多条记录中重复存储,当地址发生变更时,如果不小心遗漏某个副本的更新,就会出现同一学生拥有不同地址的矛盾情况。通过遵守范式,将数据分散到适当的相关表中,每个事实只在一个地方存储,从而降低了数据冗余和数据不一致的风险。

2. 保证数据一致性:

  • 三范式通过规范数据依赖关系,确保每次数据操作(插入、更新、删除)都能在正确的地方进行,避免因数据冗余导致的更新异常。例如,遵循第三范式时,如果某个非主键列依赖于其他非主键列,那么当依赖的列发生变化时,只影响到直接相关的表,不会波及其他无关表。这样可以防止因传递依赖引起的连锁更新错误,确保数据在整个系统中保持一致。

3. 简化数据管理与维护:

  • 符合三范式的数据库结构清晰、逻辑性强,易于理解和维护。由于冗余少,数据更新操作集中在少数几个相关表中,减少了数据维护的工作量。同时,规范化的数据库设计有利于数据完整性约束的设置(如外键约束、唯一性约束等),这些约束能够在数据库级别自动检查和强制执行数据一致性规则,减轻应用程序的负担,降低出错概率。

4. 提高查询性能:

  • 虽然在某些特定场景下,适度违反范式(如引入适当冗余)可能有利于优化特定查询的性能,但通常情况下,遵循三范式设计的数据库更利于进行高效的查询。规范化的设计使得数据分布更为合理,查询时只需访问与查询目标直接相关的表,避免了大量无关数据的扫描。此外,通过合理使用索引、连接操作和查询优化技术,可以在保证数据一致性的前提下,有效提升查询速度。

5. 支持数据完整性:

  • 遵守三范式有助于实现参照完整性和实体完整性。参照完整性是指表间关系的正确性,如外键约束确保了引用的主键值必须存在于主表中。实体完整性则是指表内数据的正确性,如主键约束确保了主键值的唯一性和非空性。这些完整性约束在数据库层自动执行,有助于防止逻辑错误和数据损坏。

6. 促进数据共享与协作:

  • 规范化的数据库设计易于被其他开发者理解,方便团队成员之间协作开发和维护。对于大型项目或跨部门、跨组织的数据共享而言,遵循标准设计原则的数据库更能适应未来的需求变化和系统的扩展,降低数据集成的成本。

综上所述,遵守数据库的三范式是保障数据质量、提升数据管理效率、确保系统稳定性和可维护性的重要手段。虽然在实际应用中可能需要根据具体业务需求和性能考量适度调整设计,但理解并遵循范式原则始终是构建健壮、高效关系型数据库的基础。

  • 20
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值