live-forum/server/admin/需求/数据库扩展设计.md
2026-03-24 11:27:37 +08:00

669 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Live Forum 后台管理数据库扩展设计
## 数据库扩展概述
为了支持后台管理功能,需要在现有数据库基础上添加管理相关的表和字段。
---
## 新增表结构
### 1. 管理操作记录表 (AdminOperations)
**用途**: 记录所有后台管理操作,用于审计和追踪
```sql
CREATE TABLE dbo.AdminOperations
(
OperationId BIGINT PRIMARY KEY IDENTITY(1,1),
AdminId BIGINT NOT NULL, -- 管理员ID
AdminName NVARCHAR(50) NOT NULL, -- 管理员名称
OperationType NVARCHAR(50) NOT NULL, -- 操作类型CREATE, UPDATE, DELETE, APPROVE, REJECT
TargetType NVARCHAR(50) NOT NULL, -- 目标类型POST, COMMENT, USER, BANNER, CATEGORY
TargetId BIGINT NOT NULL, -- 目标ID
OperationData NVARCHAR(MAX) NULL, -- 操作数据JSON格式
OperationResult NVARCHAR(500) NULL, -- 操作结果
Reason NVARCHAR(500) NULL, -- 操作原因
IpAddress NVARCHAR(50) NULL, -- 操作IP地址
UserAgent NVARCHAR(500) NULL, -- 用户代理
CreatedAt DATETIME2(7) NOT NULL DEFAULT GETDATE()
);
-- 创建索引
CREATE INDEX IX_AdminOperations_AdminId ON AdminOperations(AdminId);
CREATE INDEX IX_AdminOperations_TargetType_TargetId ON AdminOperations(TargetType, TargetId);
CREATE INDEX IX_AdminOperations_CreatedAt ON AdminOperations(CreatedAt);
CREATE INDEX IX_AdminOperations_OperationType ON AdminOperations(OperationType);
```
### 2. 系统配置表 (SystemConfigs)
**用途**: 存储系统配置参数
```sql
CREATE TABLE dbo.SystemConfigs
(
ConfigId INT PRIMARY KEY IDENTITY(1,1),
ConfigKey NVARCHAR(100) NOT NULL UNIQUE, -- 配置键
ConfigValue NVARCHAR(MAX) NOT NULL, -- 配置值
ConfigType NVARCHAR(50) NOT NULL, -- 配置类型STRING, NUMBER, BOOLEAN, JSON
Description NVARCHAR(500) NULL, -- 配置描述
Category NVARCHAR(50) NOT NULL, -- 配置分类SYSTEM, CONTENT, USER, SECURITY
IsActive BIT NOT NULL DEFAULT 1, -- 是否启用
IsReadOnly BIT NOT NULL DEFAULT 0, -- 是否只读
CreatedAt DATETIME2(7) NOT NULL DEFAULT GETDATE(),
UpdatedAt DATETIME2(7) NOT NULL DEFAULT GETDATE()
);
-- 创建索引
CREATE INDEX IX_SystemConfigs_Category ON SystemConfigs(Category);
CREATE INDEX IX_SystemConfigs_IsActive ON SystemConfigs(IsActive);
```
### 3. 管理任务表 (AdminTasks)
**用途**: 记录后台管理任务,支持异步处理
```sql
CREATE TABLE dbo.AdminTasks
(
TaskId BIGINT PRIMARY KEY IDENTITY(1,1),
TaskName NVARCHAR(100) NOT NULL, -- 任务名称
TaskType NVARCHAR(50) NOT NULL, -- 任务类型BATCH_DELETE, BATCH_UPDATE, EXPORT_DATA
TaskData NVARCHAR(MAX) NOT NULL, -- 任务数据JSON格式
Status TINYINT NOT NULL DEFAULT 0, -- 任务状态0-待处理1-处理中2-已完成3-失败
Progress INT NOT NULL DEFAULT 0, -- 进度百分比
TotalCount INT NOT NULL DEFAULT 0, -- 总数量
ProcessedCount INT NOT NULL DEFAULT 0, -- 已处理数量
SuccessCount INT NOT NULL DEFAULT 0, -- 成功数量
FailedCount INT NOT NULL DEFAULT 0, -- 失败数量
ErrorMessage NVARCHAR(MAX) NULL, -- 错误信息
CreatedBy BIGINT NOT NULL, -- 创建者ID
CreatedAt DATETIME2(7) NOT NULL DEFAULT GETDATE(),
StartedAt DATETIME2(7) NULL, -- 开始时间
CompletedAt DATETIME2(7) NULL -- 完成时间
);
-- 创建索引
CREATE INDEX IX_AdminTasks_Status ON AdminTasks(Status);
CREATE INDEX IX_AdminTasks_CreatedBy ON AdminTasks(CreatedBy);
CREATE INDEX IX_AdminTasks_CreatedAt ON AdminTasks(CreatedAt);
```
### 4. 数据统计缓存表 (StatisticsCache)
**用途**: 缓存统计数据,提高查询性能
```sql
CREATE TABLE dbo.StatisticsCache
(
CacheId BIGINT PRIMARY KEY IDENTITY(1,1),
CacheKey NVARCHAR(100) NOT NULL UNIQUE, -- 缓存键
CacheData NVARCHAR(MAX) NOT NULL, -- 缓存数据JSON格式
CacheType NVARCHAR(50) NOT NULL, -- 缓存类型DAILY, WEEKLY, MONTHLY
StatDate DATE NOT NULL, -- 统计日期
ExpireAt DATETIME2(7) NOT NULL, -- 过期时间
CreatedAt DATETIME2(7) NOT NULL DEFAULT GETDATE(),
UpdatedAt DATETIME2(7) NOT NULL DEFAULT GETDATE()
);
-- 创建索引
CREATE INDEX IX_StatisticsCache_CacheType ON StatisticsCache(CacheType);
CREATE INDEX IX_StatisticsCache_StatDate ON StatisticsCache(StatDate);
CREATE INDEX IX_StatisticsCache_ExpireAt ON StatisticsCache(ExpireAt);
```
---
## 现有表字段扩展
### 1. Posts表扩展
**添加管理相关字段**:
```sql
-- 添加管理相关字段
ALTER TABLE dbo.Posts ADD
AdminNotes NVARCHAR(500) NULL, -- 管理员备注
LastAdminOperation DATETIME2(7) NULL, -- 最后管理操作时间
AdminOperationCount INT NOT NULL DEFAULT 0; -- 管理操作次数
-- 创建索引
CREATE INDEX IX_Posts_LastAdminOperation ON Posts(LastAdminOperation);
CREATE INDEX IX_Posts_AdminOperationCount ON Posts(AdminOperationCount);
```
### 2. Users表扩展
**添加管理相关字段**:
```sql
-- 添加管理相关字段
ALTER TABLE dbo.Users ADD
AdminNotes NVARCHAR(500) NULL, -- 管理员备注
LastAdminOperation DATETIME2(7) NULL, -- 最后管理操作时间
AdminOperationCount INT NOT NULL DEFAULT 0, -- 管理操作次数
StatusChangeReason NVARCHAR(500) NULL, -- 状态变更原因
StatusChangeAt DATETIME2(7) NULL, -- 状态变更时间
StatusChangeBy BIGINT NULL; -- 状态变更操作者
-- 创建索引
CREATE INDEX IX_Users_LastAdminOperation ON Users(LastAdminOperation);
CREATE INDEX IX_Users_StatusChangeAt ON Users(StatusChangeAt);
```
### 3. Comments表扩展
**添加管理相关字段**:
```sql
-- 添加管理相关字段
ALTER TABLE dbo.Comments ADD
AdminNotes NVARCHAR(500) NULL, -- 管理员备注
LastAdminOperation DATETIME2(7) NULL, -- 最后管理操作时间
AdminOperationCount INT NOT NULL DEFAULT 0; -- 管理操作次数
-- 创建索引
CREATE INDEX IX_Comments_LastAdminOperation ON Comments(LastAdminOperation);
```
### 4. Reports表扩展
**添加管理相关字段**:
```sql
-- 添加管理相关字段
ALTER TABLE dbo.Reports ADD
AdminNotes NVARCHAR(500) NULL, -- 管理员备注
ProcessedAt DATETIME2(7) NULL, -- 处理时间
ProcessedBy BIGINT NULL, -- 处理者ID
ProcessResult NVARCHAR(500) NULL; -- 处理结果
-- 创建索引
CREATE INDEX IX_Reports_ProcessedAt ON Reports(ProcessedAt);
CREATE INDEX IX_Reports_ProcessedBy ON Reports(ProcessedBy);
```
---
## 视图创建
### 1. 管理操作统计视图
```sql
CREATE VIEW dbo.vw_AdminOperationStatistics
AS
SELECT
AdminId,
AdminName,
COUNT(*) as TotalOperations,
COUNT(CASE WHEN OperationType = 'CREATE' THEN 1 END) as CreateCount,
COUNT(CASE WHEN OperationType = 'UPDATE' THEN 1 END) as UpdateCount,
COUNT(CASE WHEN OperationType = 'DELETE' THEN 1 END) as DeleteCount,
COUNT(CASE WHEN OperationType = 'APPROVE' THEN 1 END) as ApproveCount,
COUNT(CASE WHEN OperationType = 'REJECT' THEN 1 END) as RejectCount,
COUNT(CASE WHEN TargetType = 'POST' THEN 1 END) as PostOperations,
COUNT(CASE WHEN TargetType = 'USER' THEN 1 END) as UserOperations,
COUNT(CASE WHEN TargetType = 'COMMENT' THEN 1 END) as CommentOperations,
MAX(CreatedAt) as LastOperationAt
FROM dbo.AdminOperations
GROUP BY AdminId, AdminName;
```
### 2. 内容管理统计视图
```sql
CREATE VIEW dbo.vw_ContentManagementStatistics
AS
SELECT
'Posts' as ContentType,
COUNT(*) as TotalCount,
COUNT(CASE WHEN Status = 0 THEN 1 END) as DraftCount,
COUNT(CASE WHEN Status = 1 THEN 1 END) as PublishedCount,
COUNT(CASE WHEN Status = 2 THEN 1 END) as PendingCount,
COUNT(CASE WHEN Status = 3 THEN 1 END) as SuspendedCount,
COUNT(CASE WHEN IsTop = 1 THEN 1 END) as TopCount,
COUNT(CASE WHEN IsHot = 1 THEN 1 END) as HotCount,
COUNT(CASE WHEN IsEssence = 1 THEN 1 END) as EssenceCount,
COUNT(CASE WHEN AdminOperationCount > 0 THEN 1 END) as ManagedCount
FROM dbo.Posts
WHERE IsDeleted = 0
UNION ALL
SELECT
'Comments' as ContentType,
COUNT(*) as TotalCount,
0 as DraftCount,
COUNT(CASE WHEN IsDeleted = 0 THEN 1 END) as PublishedCount,
0 as PendingCount,
COUNT(CASE WHEN IsDeleted = 1 THEN 1 END) as SuspendedCount,
0 as TopCount,
0 as HotCount,
0 as EssenceCount,
COUNT(CASE WHEN AdminOperationCount > 0 THEN 1 END) as ManagedCount
FROM dbo.Comments;
```
### 3. 用户管理统计视图
```sql
CREATE VIEW dbo.vw_UserManagementStatistics
AS
SELECT
COUNT(*) as TotalUsers,
COUNT(CASE WHEN Status = 0 THEN 1 END) as ActiveUsers,
COUNT(CASE WHEN Status = 1 THEN 1 END) as DisabledUsers,
COUNT(CASE WHEN Status = 2 THEN 1 END) as FrozenUsers,
COUNT(CASE WHEN IsVip = 1 THEN 1 END) as VipUsers,
COUNT(CASE WHEN IsCertified = 1 THEN 1 END) as CertifiedUsers,
COUNT(CASE WHEN AdminOperationCount > 0 THEN 1 END) as ManagedUsers,
COUNT(CASE WHEN CreatedAt >= DATEADD(DAY, -30, GETDATE()) THEN 1 END) as NewUsers30Days,
COUNT(CASE WHEN LastLoginAt >= DATEADD(DAY, -7, GETDATE()) THEN 1 END) as ActiveUsers7Days
FROM dbo.Users
WHERE IsDeleted = 0;
```
---
## 存储过程创建
### 1. 记录管理操作存储过程
```sql
CREATE PROCEDURE dbo.sp_RecordAdminOperation
@AdminId BIGINT,
@AdminName NVARCHAR(50),
@OperationType NVARCHAR(50),
@TargetType NVARCHAR(50),
@TargetId BIGINT,
@OperationData NVARCHAR(MAX) = NULL,
@OperationResult NVARCHAR(500) = NULL,
@Reason NVARCHAR(500) = NULL,
@IpAddress NVARCHAR(50) = NULL,
@UserAgent NVARCHAR(500) = NULL
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
-- 插入操作记录
INSERT INTO dbo.AdminOperations (
AdminId, AdminName, OperationType, TargetType, TargetId,
OperationData, OperationResult, Reason, IpAddress, UserAgent
)
VALUES (
@AdminId, @AdminName, @OperationType, @TargetType, @TargetId,
@OperationData, @OperationResult, @Reason, @IpAddress, @UserAgent
);
-- 更新目标表的最后管理操作时间
IF @TargetType = 'POST'
BEGIN
UPDATE dbo.Posts
SET LastAdminOperation = GETDATE(),
AdminOperationCount = AdminOperationCount + 1
WHERE PostId = @TargetId;
END
ELSE IF @TargetType = 'USER'
BEGIN
UPDATE dbo.Users
SET LastAdminOperation = GETDATE(),
AdminOperationCount = AdminOperationCount + 1
WHERE UserId = @TargetId;
END
ELSE IF @TargetType = 'COMMENT'
BEGIN
UPDATE dbo.Comments
SET LastAdminOperation = GETDATE(),
AdminOperationCount = AdminOperationCount + 1
WHERE CommentId = @TargetId;
END
SELECT 'SUCCESS' as Result, '操作记录已保存' as Message;
END TRY
BEGIN CATCH
SELECT 'ERROR' as Result, ERROR_MESSAGE() as Message;
END CATCH
END;
```
### 2. 更新统计数据存储过程
```sql
CREATE PROCEDURE dbo.sp_UpdateStatisticsCache
@CacheType NVARCHAR(50),
@StatDate DATE,
@CacheData NVARCHAR(MAX)
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
DECLARE @CacheKey NVARCHAR(100) = @CacheType + '_' + CONVERT(NVARCHAR(10), @StatDate, 120);
DECLARE @ExpireAt DATETIME2(7) = DATEADD(DAY, 1, GETDATE());
-- 更新或插入缓存数据
IF EXISTS (SELECT 1 FROM dbo.StatisticsCache WHERE CacheKey = @CacheKey)
BEGIN
UPDATE dbo.StatisticsCache
SET CacheData = @CacheData,
UpdatedAt = GETDATE(),
ExpireAt = @ExpireAt
WHERE CacheKey = @CacheKey;
END
ELSE
BEGIN
INSERT INTO dbo.StatisticsCache (CacheKey, CacheData, CacheType, StatDate, ExpireAt)
VALUES (@CacheKey, @CacheData, @CacheType, @StatDate, @ExpireAt);
END
SELECT 'SUCCESS' as Result, '统计数据已更新' as Message;
END TRY
BEGIN CATCH
SELECT 'ERROR' as Result, ERROR_MESSAGE() as Message;
END CATCH
END;
```
### 3. 清理过期缓存存储过程
```sql
CREATE PROCEDURE dbo.sp_CleanExpiredCache
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
-- 删除过期的缓存数据
DELETE FROM dbo.StatisticsCache
WHERE ExpireAt < GETDATE();
-- 删除30天前的操作记录
DELETE FROM dbo.AdminOperations
WHERE CreatedAt < DATEADD(DAY, -30, GETDATE());
-- 删除已完成的任务记录保留7天
DELETE FROM dbo.AdminTasks
WHERE Status IN (2, 3)
AND CompletedAt < DATEADD(DAY, -7, GETDATE());
SELECT 'SUCCESS' as Result, '过期数据已清理' as Message;
END TRY
BEGIN CATCH
SELECT 'ERROR' as Result, ERROR_MESSAGE() as Message;
END CATCH
END;
```
---
## 初始化数据
### 1. 系统配置初始化
```sql
-- 插入基础系统配置
INSERT INTO dbo.SystemConfigs (ConfigKey, ConfigValue, ConfigType, Description, Category)
VALUES
('MAX_POSTS_PER_DAY', '10', 'NUMBER', '用户每日最大发帖数', 'CONTENT'),
('MAX_COMMENTS_PER_DAY', '50', 'NUMBER', '用户每日最大评论数', 'CONTENT'),
('MAX_IMAGES_PER_POST', '9', 'NUMBER', '每帖最大图片数', 'CONTENT'),
('POST_AUTO_APPROVE', 'true', 'BOOLEAN', '帖子是否自动审核通过', 'CONTENT'),
('COMMENT_AUTO_APPROVE', 'true', 'BOOLEAN', '评论是否自动审核通过', 'CONTENT'),
('MAX_FILE_SIZE', '10485760', 'NUMBER', '最大文件大小(字节)', 'SYSTEM'),
('ALLOWED_FILE_TYPES', 'jpg,jpeg,png,gif,mp4', 'STRING', '允许的文件类型', 'SYSTEM'),
('CACHE_EXPIRE_HOURS', '24', 'NUMBER', '缓存过期时间(小时)', 'SYSTEM'),
('ADMIN_OPERATION_LOG_DAYS', '30', 'NUMBER', '管理操作日志保留天数', 'SECURITY'),
('BATCH_OPERATION_LIMIT', '100', 'NUMBER', '批量操作最大数量', 'SECURITY');
```
### 2. 创建定时任务
```sql
-- 创建定时清理任务需要SQL Server Agent支持
-- 每天凌晨2点执行清理过期数据
EXEC msdb.dbo.sp_add_job
@job_name = 'CleanExpiredAdminData',
@description = '清理过期的管理数据和缓存';
EXEC msdb.dbo.sp_add_jobstep
@job_name = 'CleanExpiredAdminData',
@step_name = 'CleanExpiredData',
@command = 'EXEC LiveForumDB.dbo.sp_CleanExpiredCache';
EXEC msdb.dbo.sp_add_schedule
@schedule_name = 'DailyCleanup',
@freq_type = 4,
@freq_interval = 1,
@active_start_time = 020000;
EXEC msdb.dbo.sp_attach_schedule
@job_name = 'CleanExpiredAdminData',
@schedule_name = 'DailyCleanup';
```
---
## 性能优化建议
### 1. 索引优化
```sql
-- 为常用查询字段创建复合索引
CREATE INDEX IX_Posts_Status_CreatedAt ON Posts(Status, CreatedAt);
CREATE INDEX IX_Users_Status_LevelId ON Users(Status, LevelId);
CREATE INDEX IX_Comments_PostId_CreatedAt ON Comments(PostId, CreatedAt);
CREATE INDEX IX_Reports_Status_CreatedAt ON Reports(Status, CreatedAt);
-- 为管理操作表创建覆盖索引
CREATE INDEX IX_AdminOperations_Coverage ON AdminOperations(AdminId, CreatedAt)
INCLUDE (OperationType, TargetType, TargetId);
```
### 2. 分区表设计
```sql
-- 为大数据量表创建分区(可选)
-- 按创建时间分区管理操作表
CREATE PARTITION FUNCTION PF_AdminOperations_Date (DATETIME2(7))
AS RANGE RIGHT FOR VALUES (
'2024-01-01', '2024-02-01', '2024-03-01', '2024-04-01',
'2024-05-01', '2024-06-01', '2024-07-01', '2024-08-01',
'2024-09-01', '2024-10-01', '2024-11-01', '2024-12-01'
);
CREATE PARTITION SCHEME PS_AdminOperations_Date
AS PARTITION PF_AdminOperations_Date
TO (FG_2024_01, FG_2024_02, FG_2024_03, FG_2024_04,
FG_2024_05, FG_2024_06, FG_2024_07, FG_2024_08,
FG_2024_09, FG_2024_10, FG_2024_11, FG_2024_12);
```
### 3. 查询优化
```sql
-- 创建统计信息更新存储过程
CREATE PROCEDURE dbo.sp_UpdateStatistics
AS
BEGIN
-- 更新表统计信息
UPDATE STATISTICS dbo.Posts;
UPDATE STATISTICS dbo.Users;
UPDATE STATISTICS dbo.Comments;
UPDATE STATISTICS dbo.AdminOperations;
-- 重建索引碎片
ALTER INDEX ALL ON dbo.Posts REBUILD;
ALTER INDEX ALL ON dbo.Users REBUILD;
ALTER INDEX ALL ON dbo.Comments REBUILD;
END;
```
---
## 安全考虑
### 1. 数据脱敏
```sql
-- 创建用户信息脱敏视图
CREATE VIEW dbo.vw_Users_Desensitized
AS
SELECT
UserId,
UserName,
NickName,
CASE
WHEN LEN(PhoneNumber) > 4
THEN LEFT(PhoneNumber, 3) + '****' + RIGHT(PhoneNumber, 4)
ELSE PhoneNumber
END as PhoneNumber,
CASE
WHEN CHARINDEX('@', Email) > 0
THEN LEFT(Email, 2) + '****' + SUBSTRING(Email, CHARINDEX('@', Email), LEN(Email))
ELSE Email
END as Email,
Avatar,
Gender,
Birthday,
Signature,
Status,
IsVip,
IsCertified,
LevelId,
Experience,
CreatedAt,
LastLoginAt
FROM dbo.Users
WHERE IsDeleted = 0;
```
### 2. 权限控制
```sql
-- 创建管理操作权限检查函数
CREATE FUNCTION dbo.fn_CheckAdminPermission(
@AdminId BIGINT,
@OperationType NVARCHAR(50),
@TargetType NVARCHAR(50)
)
RETURNS BIT
AS
BEGIN
DECLARE @HasPermission BIT = 0;
-- 这里应该根据实际的权限系统来实现
-- 示例:检查管理员是否有相应操作权限
IF EXISTS (
SELECT 1 FROM dbo.AdminPermissions
WHERE AdminId = @AdminId
AND OperationType = @OperationType
AND TargetType = @TargetType
AND IsActive = 1
)
BEGIN
SET @HasPermission = 1;
END
RETURN @HasPermission;
END;
```
---
## 监控和维护
### 1. 性能监控
```sql
-- 创建性能监控视图
CREATE VIEW dbo.vw_PerformanceMonitoring
AS
SELECT
'AdminOperations' as TableName,
COUNT(*) as RecordCount,
MAX(CreatedAt) as LastRecord,
AVG(DATEDIFF(MILLISECOND, CreatedAt, GETDATE())) as AvgAge
FROM dbo.AdminOperations
UNION ALL
SELECT
'StatisticsCache' as TableName,
COUNT(*) as RecordCount,
MAX(CreatedAt) as LastRecord,
AVG(DATEDIFF(MILLISECOND, CreatedAt, GETDATE())) as AvgAge
FROM dbo.StatisticsCache
UNION ALL
SELECT
'AdminTasks' as TableName,
COUNT(*) as RecordCount,
MAX(CreatedAt) as LastRecord,
AVG(DATEDIFF(MILLISECOND, CreatedAt, GETDATE())) as AvgAge
FROM dbo.AdminTasks;
```
### 2. 数据完整性检查
```sql
-- 创建数据完整性检查存储过程
CREATE PROCEDURE dbo.sp_CheckDataIntegrity
AS
BEGIN
SET NOCOUNT ON;
-- 检查孤立的管理操作记录
SELECT 'Orphaned AdminOperations' as Issue, COUNT(*) as Count
FROM dbo.AdminOperations ao
LEFT JOIN dbo.Posts p ON ao.TargetType = 'POST' AND ao.TargetId = p.PostId
LEFT JOIN dbo.Users u ON ao.TargetType = 'USER' AND ao.TargetId = u.UserId
LEFT JOIN dbo.Comments c ON ao.TargetType = 'COMMENT' AND ao.TargetId = c.CommentId
WHERE p.PostId IS NULL AND u.UserId IS NULL AND c.CommentId IS NULL;
-- 检查过期的缓存数据
SELECT 'Expired Cache' as Issue, COUNT(*) as Count
FROM dbo.StatisticsCache
WHERE ExpireAt < GETDATE();
-- 检查长时间运行的任务
SELECT 'Long Running Tasks' as Issue, COUNT(*) as Count
FROM dbo.AdminTasks
WHERE Status = 1 AND StartedAt < DATEADD(HOUR, -2, GETDATE());
END;
```
---
## 总结
本数据库扩展设计为Live Forum后台管理功能提供了完整的数据支持包括
### 新增功能
-**4张新表** - 管理操作记录、系统配置、管理任务、统计缓存
-**字段扩展** - 为现有表添加管理相关字段
-**3个视图** - 管理统计、内容统计、用户统计
-**3个存储过程** - 操作记录、缓存更新、数据清理
### 性能优化
-**索引优化** - 为常用查询创建复合索引
-**分区设计** - 支持大数据量分区存储
-**缓存机制** - 统计数据缓存提高查询性能
### 安全特性
-**数据脱敏** - 敏感信息脱敏视图
-**权限控制** - 操作权限检查函数
-**审计追踪** - 完整的管理操作记录
### 维护功能
-**性能监控** - 实时性能监控视图
-**数据完整性** - 数据完整性检查
-**自动清理** - 定时清理过期数据
该设计能够满足后台管理功能的所有数据需求,同时保证性能、安全和可维护性。