669 lines
20 KiB
Markdown
669 lines
20 KiB
Markdown
# 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个存储过程** - 操作记录、缓存更新、数据清理
|
||
|
||
### 性能优化
|
||
- ✅ **索引优化** - 为常用查询创建复合索引
|
||
- ✅ **分区设计** - 支持大数据量分区存储
|
||
- ✅ **缓存机制** - 统计数据缓存提高查询性能
|
||
|
||
### 安全特性
|
||
- ✅ **数据脱敏** - 敏感信息脱敏视图
|
||
- ✅ **权限控制** - 操作权限检查函数
|
||
- ✅ **审计追踪** - 完整的管理操作记录
|
||
|
||
### 维护功能
|
||
- ✅ **性能监控** - 实时性能监控视图
|
||
- ✅ **数据完整性** - 数据完整性检查
|
||
- ✅ **自动清理** - 定时清理过期数据
|
||
|
||
该设计能够满足后台管理功能的所有数据需求,同时保证性能、安全和可维护性。
|