前几天有粉丝私信说面试被问到了数据库三范式(面试问这种的不去也好),今天我们就来聊聊。在数据库设计的过程中,为了确保数据的准确性和完整性,我们通常遵循一定的规则和标准,其中最为人所熟知的便是“数据库三范式”。
数据库范式(Database Normalization)是数据库设计的一系列最佳实践,主要目标就是减少数据冗余、提升数据一致性,并使得数据库结构更加清晰、易于维护。数据库范式有多个级别,其中最基本且最重要的是前三个范式,即第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。
第一范式(1NF)
第一范式是最基本的范式,它要求数据库表的每一列都是不可分割的原子项。换句话说,表中不能有重复的列,也不能有复合数据类型(如数组、记录等)。
示例:
假设我们有一个存储学生信息的表,其中包含“姓名”、“学号”和“联系方式”等字段。如果我们将“联系方式”这一列拆分为“电话”和“邮箱”两个字段,那么这个表就满足了第一范式。
第二范式(2NF)
第二范式建立在第一范式的基础上,它要求数据库表中的非主键列必须完全依赖于整个主键,而不能只依赖于主键的一部分。
示例:
考虑一个订单表,其中包含“订单号”、“产品ID”和“产品数量”等字段。其中,“订单号”和“产品ID”共同组成复合主键。如果“产品数量”只与“产品ID”有关,而与“订单号”无关,那么这个表就不满足第二范式。为了使其满足第二范式,我们可以将“产品数量”字段移到一个新的表中,该表以“产品ID”为主键,并通过外键与订单表关联。
第三范式(3NF)
第三范式是对第二范式的进一步约束,它要求一个数据库表中不包含已在其他表中已包含的非主键信息,并且非主键列之间不存在传递依赖关系。
示例:
继续以上面的订单表为例,假设我们还有一个字段“产品价格”,这个字段与“产品ID”有关,而与“订单号”无关。如果我们把“产品价格”放在订单表中,那么订单表就包含了关于产品的冗余信息,因为产品价格应该只与产品本身有关,而与订单无关。为了满足第三范式,我们应该将“产品价格”字段移到一个专门的产品表中,并通过外键与订单表关联。
总结
数据库三范式是数据库设计中的重要原则,它们有助于我们构建结构清晰、数据冗余少的数据库系统。然而,在实际应用中,我们也需要根据具体需求和性能考虑进行权衡,有时候为了查询性能或业务逻辑的需要,可能会适当地放宽范式的约束。
欢迎关注我的公众号“程序员洋哥”,原创技术文章第一时间推送。