达永编程网

程序员技术分享与交流平台

sql三大范式练习_数据库三大范式最简单的解释

SQL的三大范式指的是数据库设计中的三个规范化级别,这些级别是为了避免数据冗余和数据不一致性而创建的。这些范式依次为:

  1. 第一范式(1NF):确保每个列都是原子的,即每个列都只包含单个值。这可以避免数据重复和数据不一致性。例如,如果一个表有一个包含多个值的列,比如“电话号码”列包含多个电话号码,那么就需要将该列拆分成多个单独的列。( 原子性,不可再分割)
  2. 第二范式(2NF):确保每个非主键列都完全依赖于主键,即非主键列只能依赖于主键而不能依赖于主键的部分。这可以避免数据冗余和数据不一致性。例如,如果一个表有一个包含“订单号”和“产品ID”的组合主键,并且“订单数量”列依赖于“产品ID”,那么就需要将“订单数量”列从该表中移除,创建一个新的表来保存订单数量和产品ID的关系。(独立性,只干一件事)
  3. 第三范式(3NF):确保每个非主键列都不依赖于其他非主键列,即非主键列只能依赖于主键。这可以避免数据冗余和数据不一致性。例如,如果一个表有一个包含“客户ID”、“产品ID”和“产品价格”的组合主键,并且“客户地址”列依赖于“客户ID”,那么就需要将“客户地址”列从该表中移除,创建一个新的表来保存客户地址和客户ID的关系。(权威性,直接管理)



假设有一个订单表,包含以下列:

  • 订单号(OrderID)
  • 客户姓名(CustomerName)
  • 产品名称(ProductName)
  • 产品数量(ProductQuantity)
  • 单价(Price)
  • 订单日期(OrderDate)

这个表没有规范化,因为存在以下问题:

  • 在每个订单中,客户姓名和产品名称重复出现,可能导致数据冗余和数据不一致性。
  • 产品数量和单价的值可能在不同的订单中重复出现,也可能导致数据冗余和数据不一致性。

为了符合第一范式,我们可以将表拆分成两个表:

  1. Order 表
  • 订单号(OrderID)
  • 客户ID(CustomerID)
  • 订单日期(OrderDate)
  1. OrderItem 表
  • 订单号(OrderID)
  • 产品ID(ProductID)
  • 产品数量(ProductQuantity)
  • 单价(Price)

为了符合第二范式,我们需要将 OrderItem 表中的非主键列完全依赖于主键,也就是 OrderID 和 ProductID。因此,我们需要将 OrderItem 表再次拆分成两个表:

  1. OrderItem 表
  • 订单号(OrderID)
  • 产品ID(ProductID)
  • 产品数量(ProductQuantity)
  1. Product 表
  • 产品ID(ProductID)
  • 产品名称(ProductName)
  • 单价(Price)

现在,每个表都符合第三范式,因为每个非主键列都只依赖于主键。这个例子展示了如何将一个未规范化的表拆分成多个表,并确保每个表符合 SQL 的三大范式。



以下是一个示例列表,其中包含了一些家庭成员的信息:

姓名

年龄

性别

关系

张三

35

父亲

李四

33

母亲

王五

10

儿子

王小红

8

女儿

爷爷

70

爷爷/外公

奶奶

68

奶奶/外婆

叔叔

40

叔叔

阿姨

38

阿姨

这个列表没有规范化,因为存在以下问题:

  • 在每个家庭成员中,姓名、年龄、性别和关系都重复出现,可能导致数据冗余和数据不一致性。
  • 爷爷、奶奶、叔叔和阿姨的信息重复出现,也可能导致数据冗余和数据不一致性。

为了符合第一范式,我们可以将表拆分成两个表:

  1. 家庭成员表
  • 姓名(Name)
  • 年龄(Age)
  • 性别(Gender)
  1. 关系表
  • 姓名(Name)
  • 关系(Relationship)

为了符合第二范式,我们需要将关系表中的非主键列完全依赖于主键,也就是 Name。因此,我们需要将关系表再次拆分成两个表:

  1. 家庭成员表
  • 姓名(Name)
  • 年龄(Age)
  • 性别(Gender)
  1. 关系表
  • 姓名(Name)
  • 关系ID(RelationshipID)
  1. 关系类型表
  • 关系ID(RelationshipID)
  • 关系(Relationship)

现在,每个表都符合第三范式,因为每个非主键列都只依赖于主键。这个例子展示了如何将一个未规范化的列表拆分成多个表,并确保每个表符合 SQL 的三大范式。



以下是一个示例列表,其中包含了一些公司员工的信息:

员工编号

员工姓名

所在部门

部门负责人

工资

1001

张三

财务部

王五

5000元

1002

李四

销售部

赵六

6000元

1003

王五

财务部

王五

7000元

1004

赵六

销售部

赵六

8000元

这个列表没有规范化,因为存在以下问题:

  • 在每个员工中,所在部门和部门负责人重复出现,可能导致数据冗余和数据不一致性。
  • 部门负责人的姓名可能出现拼写错误或多种不同的变体,也可能导致数据不一致性。

为了符合第一范式,我们可以将表拆分成三个表:

  1. 员工表
  • 员工编号(EmployeeID)
  • 员工姓名(EmployeeName)
  • 所在部门编号(DepartmentID)
  • 工资(Salary)
  1. 部门表
  • 部门编号(DepartmentID)
  • 部门名称(DepartmentName)
  • 部门负责人编号(ManagerID)
  1. 部门负责人表
  • 部门负责人编号(ManagerID)
  • 部门负责人姓名(ManagerName)

为了符合第二范式,我们需要将部门表中的非主键列完全依赖于主键,也就是 DepartmentID。因此,我们需要将部门表再次拆分成两个表:

  1. 部门表
  • 部门编号(DepartmentID)
  • 部门名称(DepartmentName)
  • 部门负责人编号(ManagerID)
  1. 员工表
  • 员工编号(EmployeeID)
  • 员工姓名(EmployeeName)
  • 所在部门编号(DepartmentID)
  • 工资(Salary)

现在,每个表都符合第三范式,因为每个非主键列都只依赖于主键。这个例子展示了如何将一个未规范化的列表拆分成多个表,并确保每个表符合 SQL 的三大范式。

示例

下面是一个使用第一范式、第二范式和第三范式的数据库设计示例:

假设我们有一个在线商店,需要设计一个订单管理系统。每个订单可能包含多个产品,每个产品可能有多个属性(例如颜色、尺寸等),并且每个订单需要记录相关的客户和运输信息。

根据第一范式,我们可以将每个订单拆分为多个表,每个表都只包含一种类型的数据。例如,我们可以将客户信息存储在一个单独的表中,产品信息存储在另一个表中,订单信息存储在另一个表中,运输信息存储在另一个表中。

根据第二范式,我们需要确保每个表都有一个主键,并且每个字段都与主键相关。例如,在订单表中,我们可以使用订单号作为主键,并将每个产品与订单号关联。在产品表中,我们可以使用产品编号作为主键,并将每个属性与产品编号关联。

根据第三范式,我们需要确保每个非主键字段都只依赖于主键,而不依赖于其他非主键字段。例如,在订单表中,我们可以将客户信息和运输信息存储在单独的表中,并使用订单号将其与订单表关联,而不是将客户信息和运输信息存储在订单表中。

下面是一个简化的数据库设计示例:

客户表:

  • 客户编号(主键)
  • 客户名称
  • 客户地址
  • 客户电话

产品表:

  • 产品编号(主键)
  • 产品名称
  • 产品描述
  • 产品价格

订单表:

  • 订单号(主键)
  • 客户编号(外键)
  • 运输编号(外键)
  • 订单日期

订单产品表:

  • 订单号(外键)
  • 产品编号(外键)
  • 产品颜色
  • 产品尺寸

运输表:

  • 运输编号(主键)
  • 运输方式
  • 运输地址



在规范化数据时,有时候我们需要权衡多个范式之间的关系和优先级。有些情况下,完全符合第三范式可能会导致多次关联操作,从而影响性能。因此,应该根据实际情况进行权衡和决策。

下面是一些需要权衡的情况:

  1. 数据库设计中的性能需求

在高性能的系统中,我们可能需要使用冗余数据或其他优化技术来减少关联操作的次数,以提高查询速度。在这种情况下,我们可能会选择不完全符合第三范式,而是使用冗余数据或其他技术来提高性能。

  1. 数据库设计中的数据完整性需求

在某些情况下,我们需要使用完全符合第三范式来确保数据完整性,因为数据不一致可能会导致严重的后果。例如,在银行系统中,必须确保每个账户只有一个所有者,否则可能会发生欺诈和其他问题。在这种情况下,我们应该优先考虑第三范式,而不是性能。

  1. 数据库设计中的可维护性需求

在一些情况下,我们需要使用符合第一和第二范式的设计来提高数据的可维护性。例如,在一个大型的企业系统中,员工和部门信息可能会频繁变动,如果使用完全符合第三范式的设计,可能需要对多个表进行更新操作。在这种情况下,我们可以使用第一和第二范式的设计来减少更新操作的次数,从而提高维护效率。

总之,应该根据实际情况权衡和决策,选择最适合当前业务需求的数据库设计。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言