在本课中,你将学习关系数据库设计的三个基本范式,它们是用来规范数据库结构,减少数据冗余和改善数据完整性的准则。你将学习:
知识点: 1NF 要求数据库表的每一列都是不可分割的基本数据项,同时每一行都是唯一的。
代码示例:
-- 不符合1NF的表结构
CREATE TABLE Orders (
OrderID int,
ProductIDs varchar(255)
);
-- 符合1NF的表结构
CREATE TABLE Orders (
OrderID int,
ProductID int
);
预计输出效果:
在符合1NF的设计中,我们需要为每个产品创建新的行,而不是用逗号分隔的字符串来存储多个产品ID。
知识点: 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范式化之后,我们将订单数据和产品数据分离到两个表中,每个表都有其自己的主键。
知识点: 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操作。
解析:
CREATE TABLE Sports (
PlayerID int,
PlayedSports varchar(255)
);
要将此表转换为1NF,需要确保PlayedSports列不包含多个值:
CREATE TABLE Sports (
PlayerID int,
PlayedSport varchar(255)
);
-- 原始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
);
-- 原始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)
);
EXPLAIN
语句来查看查询计划,比较不同设计下的查询复杂性和响应时间。通过这些练习,你将能够实际操作和理解范式化在数据库设计中的应用及其对性能的影响。
第十五课:数据库事务