本文引用的文件
本文件面向AI有声书生成平台的数据模型扩展需求,系统化说明如何基于Prisma ORM进行实体关系设计、字段定义与约束变更;解释迁移管理与版本控制策略;提供新增表、索引优化与查询性能调优的实践指南;阐述数据模型演进、向后兼容与数据迁移的最佳实践,并覆盖数据验证、事务处理与并发控制的实现方法。
围绕数据模型与ORM的核心位置如下:
文档与依赖:数据库结构说明与Prisma版本
graph TB
subgraph "数据层"
PRISMA["Prisma Schema<br/>server/prisma/schema.prisma"]
CLIENT["Prisma Client<br/>server/src/models/index.ts"]
end
subgraph "业务层"
STORE["存储封装<br/>book-generator.store.ts"]
STAGE["状态机与并发控制<br/>stage-manager.ts"]
MIGRATE["迁移脚本<br/>migrate-genstage.ts / sync-genstage.ts"]
end
subgraph "文档与依赖"
DOC["数据库结构文档<br/>docs/database-structure.md"]
PKG["依赖与版本<br/>server/package.json"]
end
PRISMA --> CLIENT
CLIENT --> STORE
STORE --> STAGE
MIGRATE --> PRISMA
DOC --> PRISMA
PKG --> PRISMA
图表来源
章节来源
章节来源
数据模型扩展遵循“Schema先行、Client接入、封装调用、状态机保障、迁移兜底”的整体流程。
sequenceDiagram
participant Dev as "开发者"
participant Schema as "Prisma Schema"
participant Client as "Prisma Client"
participant Store as "存储封装(BookStore)"
participant Stage as "状态机(stage-manager)"
participant DB as "MySQL"
Dev->>Schema : 修改/新增模型与索引
Schema->>Client : 生成客户端代码
Client->>DB : 执行迁移/查询
Store->>Client : CRUD/事务
Stage->>Client : 乐观锁状态转移
Client-->>DB : 提交/回滚
图表来源
复合唯一键:如BookChapter的bookId_parentId_level_number
erDiagram
USER ||--o{ COMMENT : "评论"
USER ||--o{ DRAFT : "草稿"
USER ||--o{ FAVORITE : "收藏"
USER ||--o{ ORDER : "订单"
USER ||--o{ PLAY_RECORD : "播放记录"
USER ||--o{ PLAYLIST : "播放列表"
USER ||--o{ SIGN_RECORD : "签到"
USER ||--o{ SUBSCRIPTION : "订阅"
USER ||--o{ TOKEN_BALANCE : "余额"
USER ||--o{ TOKEN_USAGE : "用量"
USER ||--o{ PREFERENCE : "偏好"
BOOK }o--o{ BOOK_CHAPTER : "章节"
BOOK ||--o{ VIDEO_PROJECT : "视频项目"
BOOK }o--o{ FAVORITE : "收藏"
BOOK_CHAPTER ||--o{ COMMENT : "评论"
BOOK_CHAPTER ||--o{ PLAY_RECORD : "播放记录"
BOOK_CHAPTER ||--o{ PLAYLIST_ITEM : "播放列表项"
BOOK_CHAPTER ||--o{ VIDEO_PROJECT : "视频项目"
PLAYLIST ||--o{ PLAYLIST_ITEM : "条目"
PLAYLIST }o--o{ USER : "拥有者"
ORDER }o--o{ USER : "购买者"
ORDER }o--o{ SUBSCRIPTION_PLAN : "套餐"
ORDER ||--o{ TOKEN_USAGE : "用量"
SUBSCRIPTION }o--o{ USER : "用户"
SUBSCRIPTION }o--o{ SUBSCRIPTION_PLAN : "套餐"
图表来源
章节来源
章节来源
状态映射:outlineJson解析、章节树构建
sequenceDiagram
participant Svc as "业务服务"
participant Store as "BookStore"
participant Prisma as "Prisma Client"
participant Tx as "事务"
participant DB as "MySQL"
Svc->>Store : publishAlbum(bookId)
Store->>Tx : 开启事务
Tx->>Prisma : 更新book.isPublished
Tx->>Prisma : 更新bookChapter.isPublic(有音频)
Prisma-->>Tx : 提交
Tx-->>Store : 成功
Store-->>Svc : 返回
图表来源
章节来源
资源清理:回退时自动清理下游产物(音频/视频URL与时长)
flowchart TD
Start(["进入 safeTransition"]) --> CheckAllowed["检查是否允许转移"]
CheckAllowed --> |否| Error["抛出非法转移错误"]
CheckAllowed --> |是| CalcClean["计算需要清理的下游资源"]
CalcClean --> Optimistic["乐观锁写入:updateMany(genStage=当前)"]
Optimistic --> CountZero{"影响行数=0?"}
CountZero --> |是| QueryActual["查询实际状态"]
QueryActual --> SameTarget{"实际状态=目标?"}
SameTarget --> |是| Skip["跳过已达成"]
SameTarget --> |否| Conflict["记录冲突并跳过"]
CountZero --> |否| Done(["完成"])
图表来源
章节来源
推断逻辑:根据子章节状态推断书籍阶段,确保一致性
sequenceDiagram
participant Script as "迁移/同步脚本"
participant Prisma as "Prisma Client"
participant Stage as "状态机函数"
participant DB as "MySQL"
Script->>Prisma : 查询旧字段
Script->>Script : 推断/计算新genStage
Script->>Stage : safeTransition/advance/sync
Stage->>Prisma : 乐观锁更新
Prisma-->>Stage : 结果
Stage-->>Script : 成功/跳过
图表来源
章节来源
依赖关系:业务模块通过存储封装间接依赖Prisma Client
graph LR
PKG["server/package.json"] --> PRISMA["Prisma 6.x"]
PKG --> CLIENT["@prisma/client"]
STORE["book-generator.store.ts"] --> CLIENT
STAGE["stage-manager.ts"] --> CLIENT
SCHEMA["schema.prisma"] --> PRISMA
图表来源
章节来源
[本节为通用指导,无需具体文件分析]
章节来源
通过“Schema先行、Client接入、封装调用、状态机保障、迁移兜底”的整体设计,平台实现了可演进、可扩展、可维护的数据模型。遵循本文的扩展流程与最佳实践,可在保证向后兼容与数据一致性的前提下,安全地引入新表、字段与索引,持续提升系统性能与稳定性。
[本节为总结,无需具体文件分析]
章节来源