从0开始学习mysql 第十四课:数据库设计与三范式

第十四课:数据库设计与三范式

学习目标

在本课中,你将学习关系数据库设计的三个基本范式,它们是用来规范数据库结构,减少数据冗余和改善数据完整性的准则。你将学习:

  • 第一范式(1NF)的概念和实现
  • 第二范式(2NF)的概念和实现
  • 第三范式(3NF)的概念和实现
  • 范式化对数据库性能的潜在影响
  • 通过实例理解如何将这些范式应用到数据库设计中
学习内容
1. 第一范式(1NF)

知识点: 1NF 要求数据库表的每一列都是不可分割的基本数据项,同时每一行都是唯一的。

代码示例:

-- 不符合1NF的表结构
CREATE TABLE Orders (
  OrderID int,
  ProductIDs varchar(255)
);

-- 符合1NF的表结构
CREATE TABLE Orders (
  OrderID int,
  ProductID int
);

预计输出效果:
在符合1NF的设计中,我们需要为每个产品创建新的行,而不是用逗号分隔的字符串来存储多个产品ID。

2. 第二范式(2NF)

知识点: 2NF 在1NF的基础上,要求非主键列必须完全依赖于主键。

代码示例:

-- 不符合2NF的表结构
CREATE TABLE OrderDetails (
  OrderID int,
  ProductID int,
  ProductName varchar(255),
  OrderDate datetime
);

-- 符合2NF的表结构
CREATE TABLE Orders (
  OrderID int,
  OrderDate datetime
);

CREATE TABLE Products (
  ProductID int,
  ProductName varchar(255)
);

预计输出效果:
进行2NF范式化之后,我们将订单数据和产品数据分离到两个表中,每个表都有其自己的主键。

3. 第三范式(3NF)

知识点: 3NF要求数据表中的每一列都只依赖于主键,不能存在传递依赖。

代码示例:

-- 不符合3NF的表结构
CREATE TABLE Orders (
  OrderID int,
  CustomerID int,
  CustomerName varchar(255),
  CustomerAddress varchar(255)
);

-- 符合3NF的表结构
CREATE TABLE Orders (
  OrderID int,
  CustomerID int
);

CREATE TABLE Customers (
  CustomerID int,
  CustomerName varchar(255),
  CustomerAddress varchar(255)
);

预计输出效果:
在3NF的设计中,订单和客户信息被分离。每个订单引用一个客户ID,而客户的具体信息存储在另一个表中。

范式化对数据库性能的潜在影响

知识点: 范式化可以减少数据冗余和提高数据一致性,但有时也会导致查询性能下降,因为可能需要多个表的JOIN操作。

课后练习
  1. 识别和改正非1NF表:给定一个包含重复行和列的表,将其转换为1NF。
  2. 从1NF到2NF的转换:给定一个1NF表,识别并消除部分依赖,将表升级到2NF。
  3. 从2NF到3NF的转换:给定一个2NF表,识别并消除传递依赖,将表升级到3NF。
  4. 范式化与性能分析:对一个已经范式化的数据库进行性能分析,比较JOIN操作前后的查询效率。

解析:

  1. 识别和改正非1NF表
    原始表可能包含类似以下结构的数据:
CREATE TABLE Sports (
  PlayerID int,
  PlayedSports varchar(255)
);

要将此表转换为1NF,需要确保PlayedSports列不包含多个值:

CREATE TABLE Sports (
  PlayerID int,
  PlayedSport varchar(255)
);
  1. 从1NF到2NF的转换
    在1NF表中,如果存在一个复合主键,并且某些列只依赖于复合主键的一部分,就需要将这些列移动到新表中:
-- 原始1NF表
CREATE TABLE ClassAssignments (
  TeacherID int,
  ClassID int,
  AssignmentDate date,
  AssignmentName varchar(255)
);

-- 转换为2NF
CREATE TABLE Teachers (
  TeacherID int,
  AssignmentName varchar(255)
);

CREATE TABLE Classes (
  ClassID int,
  TeacherID int,
  AssignmentDate date
);
  1. 从2NF到3NF的转换
    在2NF表中,如果存在非主键列之间的依赖,需要创建新表来消除这种依赖:
-- 原始2NF表
CREATE TABLE Employees (
  EmployeeID int,
  ManagerID int,
  ManagerName varchar(255)
);

-- 转换为3NF
CREATE TABLE Employees (
  EmployeeID int,
  ManagerID int
);

CREATE TABLE Managers (
  ManagerID int,
  ManagerName varchar(255)
);
  1. 范式化与性能分析
    分析可能涉及执行SQL查询并使用EXPLAIN语句来查看查询计划,比较不同设计下的查询复杂性和响应时间。

通过这些练习,你将能够实际操作和理解范式化在数据库设计中的应用及其对性能的影响。

第十五课:数据库事务

你可能感兴趣的:(从0开始学mysql,数据库,学习,mysql)