# 数据库物理结构设计方案
——实验报告续篇
**课程名称**:数据库系统原理与设计
**实验项目**:数据库物理结构设计(基于SSMS 21)
**提交人**:XXX
**学号**:XXXXXXXXXX
**日期**:2025年4月5日
---
## 一、设计背景
在完成数据库逻辑结构设计的基础上,需进一步制定**物理结构设计方案**,以确保系统具备高性能、高可用性和可扩展性。本方案基于 **SQL Server Management Studio (SSMS) 21** 环境进行规划,涵盖存储布局与存取方法选择两大核心部分。
---
## 二、数据库平台选择说明
选用 **Microsoft SQL Server(通过 SSMS 21 管理)** 作为目标数据库管理系统,主要原因如下:
| 优势 | 说明 |
|------|------|
| 企业级稳定性 | 支持大规模数据处理、事务完整性与高并发访问 |
| 图形化管理工具 | SSMS 提供直观的表设计、索引优化、执行计划分析功能 |
| T-SQL 强大支持 | 完整的触发器、存储过程、视图和约束机制 |
| 安全与权限控制 | 支持细粒度用户角色管理和数据加密 |
| 兼容性良好 | 可与 .NET、Java、Python 等主流开发框架无缝集成 |
> ✅ 所有物理设计均遵循 SQL Server 2019/2022 标准语法与架构规范。
---
## 三、存储布局设计
存储布局是指如何组织数据库文件在磁盘上的分布,直接影响I/O性能与备份恢复效率。
### (一)数据库文件组规划
为提升性能并便于管理,建议采用**多文件组策略**:
| 文件组 | 包含对象 | 存储位置 | 目的 |
|--------|----------|-----------|------|
| PRIMARY | 系统表、主文件 | D:\MSSQL\Data\Primary.mdf | 默认主文件组 |
| USER_DATA_FG | user, admin, brand_owner | E:\MSSQL\Data\UserData.ndf | 用户类表独立存放 |
| CONTENT_FG | content, content_tag_mapping, tag | F:\MSSQL\Data\ContentData.ndf | 内容及其标签相关表 |
| INTERACTION_FG | interaction_record, content_review | G:\MSSQL\Data\InteractionData.ndf | 高频写入表分离 |
| BUSINESS_FG | ad_order, order_fulfillment, earnings_detail, creator_application | H:\MSSQL\Data\BusinessData.ndf | 商业流程数据集中管理 |
📌 **创建语句示例(T-SQL)**:
```sql
USE master;
GO
CREATE DATABASE ContentPlatform
ON PRIMARY (
NAME = 'CP_Primary',
FILENAME = 'D:\MSSQL\Data\CP_Primary.mdf',
SIZE = 100MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 10%
),
FILEGROUP USER_DATA_FG (
NAME = 'CP_UserData',
FILENAME = 'E:\MSSQL\Data\CP_UserData.ndf',
SIZE = 50MB,
FILEGROWTH = 50MB
),
FILEGROUP CONTENT_FG (
NAME = 'CP_ContentData',
FILENAME = 'F:\MSSQL\Data\CP_ContentData.ndf',
SIZE = 50MB,
FILEGROWTH = 50MB
),
FILEGROUP INTERACTION_FG (
NAME = 'CP_InteractionData',
FILENAME = 'G:\MSSQL\Data\CP_InteractionData.ndf',
SIZE = 50MB,
FILEGROWTH = 50MB
),
FILEGROUP BUSINESS_FG (
NAME = 'CP_BusinessData',
FILENAME = 'H:\MSSQL\Data\CP_BusinessData.ndf',
SIZE = 50MB,
FILEGROWTH = 50MB
)
LOG ON (
NAME = 'CP_Log',
FILENAME = 'L:\MSSQL\Log\CP_Log.ldf',
SIZE = 100MB,
FILEGROWTH = 100MB
);
```
> 💡 日志文件单独放在高速磁盘(如L:)上,避免I/O争用。
---
### (二)对象分配至对应文件组
使用 `ON [filegroup]` 显式指定各表所属文件组:
```sql
-- 示例:将 user 表放在 USER_DATA_FG
CREATE TABLE user (
user_id INT IDENTITY(1,1) PRIMARY KEY,
username VARCHAR(50) NOT NULL,
password VARCHAR(255) NOT NULL,
phone_number VARCHAR(15) NULL,
gender CHAR(1) NULL,
real_name_status TINYINT NOT NULL DEFAULT 0,
account_status VARCHAR(20) NOT NULL DEFAULT '正常',
role VARCHAR(20) NOT NULL DEFAULT '普通用户',
registration_time DATETIME NOT NULL DEFAULT GETDATE(),
permission_level INT NOT NULL DEFAULT 1
) ON USER_DATA_FG;
-- 将 content 放在 CONTENT_FG
CREATE TABLE content (
content_id INT IDENTITY(1,1) PRIMARY KEY,
title VARCHAR(200) NOT NULL,
content_type VARCHAR(50) NOT NULL,
publish_time DATETIME NOT NULL,
word_count INT NULL DEFAULT 0,
copyright_status VARCHAR(20) NOT NULL DEFAULT '原创',
user_id INT NOT NULL,
FOREIGN KEY (user_id) REFERENCES user(user_id)
) ON CONTENT_FG;
```
其余表依此类推,按业务模块划分存储。
---
## 四、存取方法选择
存取方法指如何高效访问数据,主要包括**索引设计、聚集键选择、视图与分区策略**等。
### (一)索引设计策略
#### 1. 聚集索引(Clustered Index)
每个表应有一个聚集索引,通常建立在主键或频繁查询的递增字段上。
| 表名 | 聚集索引字段 | 类型 | 说明 |
|------|----------------|--------|------|
| user | user_id | ASC | 主键自增,适合范围扫描 |
| content | content_id | ASC | 内容发布按时间顺序增长 |
| interaction_record | interaction_id | ASC | 高频插入,顺序写入最优 |
| ad_order | order_id | ASC | 订单流水号连续 |
| earnings_detail | detail_id | ASC | 收益明细线性增长 |
> ⚠️ 不建议对 `VARCHAR` 主键建聚集索引(易产生页分裂),当前均为 `INT IDENTITY`,符合最佳实践。
#### 2. 非聚集索引(Non-Clustered Index)
为高频查询字段创建非聚集索引,提升检索效率:
| 表名 | 字段 | 是否唯一 | 说明 |
|------|--------|------------|------|
| user | username | 是 | 登录认证使用 |
| user | phone_number | 否 | 手机号登录或找回密码 |
| tag | tag_name | 是 | 防止重复标签,加速搜索 |
| content | user_id | 否 | 查询某用户发布的所有内容 |
| interaction_record | content_id | 否 | 统计内容互动量 |
| interaction_record | (user_id, content_id, interaction_type) | 是 | 联合唯一索引,防重复互动 |
| content_tag_mapping | content_id | 否 | 快速获取某内容的标签 |
| content_tag_mapping | tag_id | 否 | 获取某标签下的所有内容 |
| ad_order | brand_owner_id | 否 | 查询品牌方历史订单 |
| earnings_detail | (user_id, cycle) | 否 | 按用户+周期统计收益 |
| creator_application | user_id | 是 | 每位用户仅允许一次申请?根据业务决定 |
📌 **创建示例(T-SQL)**:
```sql
-- 创建联合唯一索引防止重复互动
CREATE UNIQUE NONCLUSTERED INDEX IX_interaction_unique
ON interaction_record (user_id, content_id, interaction_type)
ON INTERACTION_FG;
-- 创建内容按作者查询的索引
CREATE NONCLUSTERED INDEX IX_content_by_user
ON content (user_id)
INCLUDE (title, publish_time)
ON CONTENT_FG;
```
> ✅ 使用 `INCLUDE` 包含常用字段,实现覆盖索引,减少回表操作。
---
### (二)视图设计(辅助存取)
为简化复杂查询,提供安全访问接口,建议创建以下视图:
| 视图名 | 功能 | 使用场景 |
|--------|------|-----------|
| `public_content` | 仅展示已通过审核的内容 | 前端内容列表展示 |
| `creator_applications_with_user` | 展示申请人信息与审核状态 | 管理员审核界面 |
| `earnings_summary` | 按用户汇总收益 | 财务报表生成 |
```sql
-- 示例:公开内容视图
CREATE VIEW public_content
AS
SELECT
c.content_id,
c.title,
c.publish_time,
c.content_type,
u.username AS author_name,
c.word_count
FROM content c
JOIN user u ON c.user_id = u.user_id
WHERE EXISTS (
SELECT 1 FROM content_review cr
WHERE cr.content_id = c.content_id AND cr.review_status = '通过'
)
AND u.account_status = '正常';
```
---
### (三)分区策略建议(面向未来扩展)
对于数据量快速增长的表(如 `interaction_record`, `earnings_detail`),建议在未来启用**按时间分区(Partitioning)**。
#### 分区依据:`DATETIME` 字段 + 按月分割
| 表 | 分区字段 | 策略 |
|----|-----------|--------|
| interaction_record | interaction_time | 按月分区 |
| earnings_detail | creation_time 或 cycle 解析为日期 | 按收益周期分区 |
> 当前阶段可暂不实施,待数据量超过千万级后启动。
---
## 五、物理结构设计总结
| 设计维度 | 实施要点 |
|----------|-----------|
| **DB平台** | Microsoft SQL Server(SSMS 21) |
| **文件组划分** | 按业务模块分5个文件组,提升I/O并行能力 |
| **文件放置** | 数据与日志分离,不同表组分布在不同磁盘 |
| **聚集索引** | 所有主键使用 `INT IDENTITY` 并建立聚集索引 |
| **非聚集索引** | 关键外键、联合查询、唯一约束建立非聚集索引 |
| **视图封装** | 敏感或复杂逻辑通过视图暴露,保障一致性 |
| **可扩展性** | 预留分区路径,支持未来大数据量演进 |
---
## 六、知识点总结
**1. 文件组与存储布局设计**
通过多文件组分离热数据,提高I/O并发能力和维护灵活性。
**2. 聚集与非聚集索引机制**
聚集索引决定数据物理排序,非聚集索引加速查询,合理设计可显著提升性能。
**3. 业务驱动的存取路径优化**
根据访问模式创建索引和视图,实现高效且安全的数据读取。
---
*(完)*
> 注:本报告可直接复制粘贴至 Microsoft Word 文档中使用,表格与代码格式清晰兼容,适用于课程作业或项目文档提交。