页面加载中
博客快捷键
按住 Shift 键查看可用快捷键
ShiftK
开启/关闭快捷键功能
ShiftA
打开/关闭中控台
ShiftD
深色/浅色显示模式
ShiftS
站内搜索
ShiftR
随机访问
ShiftH
返回首页
ShiftL
友链页面
ShiftP
关于本站
ShiftI
原版/本站右键菜单
松开 Shift 键或点击外部区域关闭
互动
最近评论
暂无评论
标签
寻找感兴趣的领域
暂无标签
    0
    文章
    0
    标签
    8
    分类
    10
    评论
    128
    功能
    深色模式
    标签
    JavaScript12TypeScript8React15Next.js6Vue10Node.js7CSS5前端20
    互动
    最近评论
    暂无评论
    标签
    寻找感兴趣的领域
    暂无标签
      0
      文章
      0
      标签
      8
      分类
      10
      评论
      128
      功能
      深色模式
      标签
      JavaScript12TypeScript8React15Next.js6Vue10Node.js7CSS5前端20
      随便逛逛
      博客分类
      文章标签
      复制地址
      深色模式
      AnHeYuAnHeYu
      Search⌘K
      博客
        暂无其他文档

        6、数据库设计

        March 20, 20247 分钟 阅读2 次阅读

        一、知识点

        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,联系上带有属性“成绩”。

        转换为关系模式:

        1. 学生表(学号,姓名,班级)—— 学号为主键。

        2. 课程表(课程号,课程名,学分)—— 课程号为主键。

        3. 选修表(学号,课程号,成绩)—— (学号,课程号)为联合主键,学号、课程号分别为外键。

        事例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 分区(分区裁剪),显著提高性能。

        最后更新于 May 7, 2026
        On this page
        暂无目录
        6、数据库设计