一、知识点
1. E-R图(实体-联系图)
E-R图是数据库概念设计阶段的主要工具,用于描述现实世界中的实体、属性和实体之间的联系。
元素 | 图形表示 | 说明 |
实体 | 矩形框 | 表示一个独立的对象(如:学生、课程) |
属性 | 椭圆框 | 描述实体的特征(如:姓名、年龄);主键属性加下划线 |
联系 | 菱形框 | 表示实体之间的联系(如:选修、属于) |
联系类型 | 1:1, 1:N, M:N | 标注在连线两端 |
联系类型的转换到关系模式:
1:1联系:可在任一方实体表中增加对方的主键作为外键。
1:N联系:在N方实体表中增加1方的主键作为外键。
M:N联系:必须创建一个新的关系表,包含双方的主键作为联合主键,并分别作为外键。
2. 反规范化(Denormalization)
反规范化是主动引入冗余以提高查询性能的设计技术,通常是在规范化之后,针对性能瓶颈进行的调整。
方法 | 说明 | 举例 |
增加冗余列 | 将某表的一个列复制到另一表中,减少连接 | 订单表中增加客户姓名,避免每次查客户表 |
增加派生列 | 存储计算值 | 订单表中存储订单总价(由单价×数量计算) |
表合并 | 将两个经常一起查询的表合并为一个 | 将学生表和班级表合并为一个大表 |
表分割(水平/垂直) | 将一个大表拆分为多个小表 | 按月分割订单表;将大表按列拆分 |
反规范化的代价:
数据冗余 → 更新异常(需同步维护)
增加存储空间
可能降低插入/更新/删除的性能
一致性保证手段:
应用程序同步更新
数据库触发器
物化视图(自动刷新)
3. 物理分区(Partitioning)
物理分区是将一张表的数据按某种规则拆分到多个物理文件中,但逻辑上仍视为一张表。
分区类型 | 说明 | 适用场景 |
范围分区 | 按列值的范围划分(如日期、数值区间) | 历史数据、按时间分区 |
列表分区 | 按列值的离散列表划分(如地区、类型) | 枚举值较稳定 |
哈希分区 | 对列值进行哈希运算后均匀分布 | 数据分布均匀,无明确业务分区依据 |
组合分区 | 先按某方式分区,再按另一种方式子分区 | 复杂需求(如范围+哈希) |
分区的好处:
提高查询性能(分区裁剪)
便于数据管理(如快速删除旧数据)
提高可用性(单个分区故障不影响全表)
二、具体事例
事例1:E-R图与关系模式转换
某学校数据库包含:
学生(学号,姓名,班级)
课程(课程号,课程名,学分)
选修联系:M:N(一个学生可选多门课,一门课被多人选),属性“成绩”
E-R图:学生和课程通过菱形“选修”相连,标注 M:N,联系上带有属性“成绩”。
转换为关系模式:
学生表(学号,姓名,班级)—— 学号为主键。
课程表(课程号,课程名,学分)—— 课程号为主键。
选修表(学号,课程号,成绩)—— (学号,课程号)为联合主键,学号、课程号分别为外键。
事例2:反规范化(增加冗余列)
规范化设计:
订单表(OrderID, CustomerID, OrderDate)
客户表(CustomerID, CustomerName, Address)
每次查询订单时需要连接客户表获取客户姓名。为减少连接,在订单表中增加冗余列CustomerName。
原查询:
sql
SELECT OrderID, CustomerName FROM Orders O JOIN Customers C ON O.CustomerID=C.CustomerID;
反规范化后:
sql
SELECT OrderID, CustomerName FROM Orders;
代价:若客户姓名变更,需同时更新订单表中的冗余列,可通过触发器或应用程序保证一致性。
事例3:物理分区(范围分区)
订单表 Orders(OrderID, OrderDate, CustomerID, Amount),数据量巨大。按年份范围分区:
sql
CREATE TABLE Orders ( OrderID INT, OrderDate DATE, CustomerID INT, Amount DECIMAL(10,2)) PARTITION BY RANGE (YEAR(OrderDate)) ( PARTITION p2022 VALUES LESS THAN (2023), PARTITION p2023 VALUES LESS THAN (2024), PARTITION p2024 VALUES LESS THAN (2025));
查询 WHERE OrderDate BETWEEN '2024-01-01' AND '2024-12-31' 时,只扫描 p2024 分区(分区裁剪),显著提高性能。