网站制作与网站建设技术,如何快速提升网站关键词排名,音乐网站设计外国,挪威网站后缀前言 在日常业务研发过程中#xff0c;我们常常需要与数据库表打交道。设计范式是数据表设计的基本原则#xff0c;对于数据表的设计范式#xff0c;我们特别容易忽略它的存在。很多时候#xff0c;当数据库运行了一段时间之后#xff0c;我们才发现数据表设计上有问题。然… 前言 在日常业务研发过程中我们常常需要与数据库表打交道。设计范式是数据表设计的基本原则对于数据表的设计范式我们特别容易忽略它的存在。很多时候当数据库运行了一段时间之后我们才发现数据表设计上有问题。然后重新调整数据表的结构需要做数据迁移还有可能影响程序处理的业务逻辑甚至系统的正常服务运行。 其实在数据库表结构设计的初期时候我们就需要重视数据表的设计。 什么是设计范式
关系型数据库模型的时候需要对关系内部各个属性之间联系的合理化程度进行定义这就有了不同等级的规范要求这些规范要求被称为范式NF。 范式简单理解即为一张数据表的设计结构需要满足的某种设计标准的级别。
目前关系型数据库一共有 6 种范式按照范式级别从低到高分别是1NF第一范式、2NF第二范式、3NF第三范式、BCNF巴斯 - 科德范式、4NF第四范式和 5NF第五范式又叫做完美范式。
数据库的范式设计越高阶冗余度就越低同时高阶的范式一定符合低阶范式的要求比如满足 2NF 的一定满足 1NF满足 3NF 的一定满足 2NF依次类推。
这么多的范式级别那是不是都要符合呢
一般来说只要符合前 3 个范式就足够了但也不绝对有时候为了提高某些查询性能我们还需要破坏范式规则也就是反规范化。
第一范式
数据库表中的所有字段都是原子性的不可再分。
案例一用户表中的联系方式 上面的联系方式是一个复合属性这是在数据库中无法创建出来的。可以进行拆分。 这样拆分后每一列都无法再分了满足了第一范式的要求。通常来讲第一范式的表都是标准的【二维表】。 下面我们讲讲第二范式它是在第一范式的基础上定义的。
第二范式
第二范式表中必须存在业务主键并且非主键的所有列 全部依赖于 业务主键。 理解第二范式可以从以下两个关键点入手 业务主键每个表必须有一个业务主键它是用来唯一标识表中的每一行数据的。通过业务主键我们可以定位到唯一的一行数据。例如在一个学生表中学生的学号可以作为业务主键。 非主键依赖除了业务主键之外的所有列都必须完全依赖于业务主键。这意味着表中的每个非主键列的值都必须由业务主键来决定而不能只依赖于其他非主键列。这样可以确保数据的一致性和完整性。例如在学生表中学生的姓名、年龄、性别等信息都应该完全依赖于学生的学号。
如果表中使用的是复合主键即由多个列组成的主键那么除了这些列之外的所有列都必须完全依赖于这些复合主键的所有列。这样可以确保表中的数据不会出现冗余和不一致的情况。
订单表为例来详细说明
让我们以一个订单表为例来详细说明第二范式的要求。
假设我们有一个订单表其中包含以下列订单号OrderID、产品IDProductID、产品名称ProductName、客户IDCustomerID、客户姓名CustomerName、订单日期OrderDate、订单金额OrderAmount。
在这个例子中我们可以将订单号和产品ID作为复合主键因为一个订单可以包含多个产品而每个产品在同一个订单中的位置是唯一的。
根据第二范式的要求除了订单号和产品ID之外的所有列都必须完全依赖于这两个复合主键的所有列。
在这个例子中订单号和产品ID决定了订单中的每个产品的唯一性。因此订单表中的其他列如产品名称、客户ID、客户姓名、订单日期和订单金额都必须完全依赖于订单号和产品ID。
换句话说如果我们知道订单号和产品ID我们就能确定产品名称、客户ID、客户姓名、订单日期和订单金额。但是如果我们只知道其中一部分信息比如只知道订单号那么我们无法确定产品名称或其他列的值。
这样设计的好处是避免了数据冗余和不一致性。如果某个非主键列只依赖于复合主键的一部分那么在更新数据时可能会导致数据不一致。而且如果数据冗余会增加数据存储的开销和维护的复杂性。
因此根据第二范式的要求我们应该将订单表拆分为两个表一个是订单表包含订单号和产品ID作为复合主键另一个是产品表包含产品ID和其他与产品相关的信息。这样可以确保数据的一致性和完整性并提高数据库的性能和可维护性。
第三范式
什么是第三范式
表中的非主键列之间不能相互依赖
课程案例 理解第三范式可以从以下几个关键点入手 主键每个表必须有一个主键它是用来唯一标识表中的每一行数据的。主键可以由一个或多个列组成。在上述例子中【主标题】可以作为主键。 非主键列之间的依赖根据第三范式的要求非主键列之间不能相互依赖。这意味着表中的每个非主键列的值都应该独立于其他非主键列的值。在上述例子中【讲师职位】依赖于【讲师名称】,毕竟先有讲师才能给讲师对应的职位他们之间有了相互依赖。这违反了第三范式的要求。
解决方案
要解决这个问题就是将有冲突的列独立出去比如这里独立为一个( 讲师表 )