Files
pigx_ishare/DATABASE_DESIGN_OVERVIEW.md
Admin 3f5652e235 docs(db): v3 修订 - 处理全部评审问题(新增3表,修复唯一键,完善索引)
- R1: 新增 as_recharge 充值单表(支持外部支付充值追踪)
- R2: 移除 as_user_sub_member UNIQUE(sub_id,user_id),续费改为新建记录
- I1: 新增 as_banner 首页广告位表
- I2: 新增 as_product_plan_rel 关联表,移除 sub_plan_ids 逗号字段
- I3: DATABASE_DESIGN_OVERVIEW 统一字段名至 v2 修订版
- L1: as_user_sub_member.status 增加 4=等待车主录入凭据
- L2: 补充 12 项关键查询索引

表数量: v2(23张) → v3(27张)
2026-02-17 12:55:41 +01:00

243 lines
9.2 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.
# iShare 数据库设计概要
> 版本v3基于 v2 评审修订)
> 修订时间2026-02-17
> 完整建表 SQLv2 基础版):`db/ishare_schema_v2.sql`
> 增量变更 SQLv2→v3`db/ishare_schema_v3_delta.sql`
> 完整字段说明:`DATABASE_DESIGN_V2.md`
---
## 一、表总览27 张表)
### 1.1 App 基础表(复用 PigX共 9 张)
| # | 表名 | 说明 | 变更 |
|---|------|------|------|
| 1 | `app_user` | 用户 | 追加 `invite_code``inviter_id` |
| 2 | `app_role` | 角色 | 沿用 |
| 3 | `app_user_role` | 用户角色关联 | 沿用 |
| 4 | `app_social_details` | 第三方登录 | 沿用 |
| 5 | `app_article_category` | 文章分类 | 沿用 |
| 6 | `app_article` | 文章/公告 | 沿用 |
| 7 | `app_article_collect` | 文章收藏 | 沿用 |
| 8 | `app_page` | 页面配置 | 沿用 |
| 9 | `app_tabbar` | 底部导航 | 沿用 |
### 1.2 业务表iShare 专属,共 18 张)
#### 平台与产品
| # | 表名 | 说明 | v3 变更 |
|---|------|------|---------|
| 10 | `as_platform_type` | 平台分类(视频/音乐/AI等 | — |
| 11 | `as_platform` | 流媒体平台 | — |
| 12 | `as_sub_plan` | 订阅计划 | — |
| 13 | `as_sub_payroll` | 付费方案(月/季/年) | — |
| 14 | `as_sub_product` | 合租商品 | 移除 `sub_plan_ids` 逗号字段 |
| 15 | `as_product_plan_rel` | 产品-计划 M:N 关联表 | ✨ 新增I2 修复) |
| 16 | `as_sub_account` | 平台账号凭据AES 加密) | — |
| 17 | `as_sub_product_comment` | 商品评价 | — |
| 18 | `as_banner` | 首页 Banner 广告位 | ✨ 新增I1 修复) |
#### 订阅与订单
| # | 表名 | 说明 | v3 变更 |
|---|------|------|---------|
| 19 | `as_user_sub` | 合租槽/共享池 | 补充索引 |
| 20 | `as_user_sub_member` | 个人订阅记录 | 移除唯一键、新增 status=4、补充索引 |
| 21 | `as_order` | 订单(含状态机、价格快照) | 补充索引 |
#### 钱包与推广
| # | 表名 | 说明 | v3 变更 |
|---|------|------|---------|
| 22 | `as_recharge` | 钱包充值单 | ✨ 新增R1 修复) |
| 23 | `as_wallet` | 用户钱包(乐观锁防并发) | — |
| 24 | `as_wallet_log` | 钱包流水(含余额快照) | — |
| 25 | `as_invite` | 邀请关系与返现 | — |
| 26 | `as_notification` | 系统通知 | 补充索引 |
---
## 二、核心 ER 关系概览v3
```
as_platform_type (1) ──< (N) as_platform
as_platform (1) ──< (N) as_sub_plan
as_sub_plan (1) ──< (N) as_sub_payroll
as_sub_plan (N) >──< (N) as_sub_product [via as_product_plan_rel] ← v3 改为关联表
as_platform (1) ──< (N) as_sub_product [platform_id 冗余加速查询]
as_sub_product (1) ──< (N) as_sub_account [product_id]
as_sub_product (1) ──< (N) as_user_sub [product_id]
as_user_sub (1) ──< (N) as_user_sub_member [sub_id]
as_sub_product (1) ──< (N) as_order [product_id]
as_order (1) ──< (1) as_user_sub_member [order_id]
app_user (1) ──< (1) as_wallet
as_wallet (1) ──< (N) as_wallet_log
as_wallet (1) ──< (N) as_recharge [user_id] ← v3 新增
app_user (1) ──< (N) as_order
app_user (1) ──< (N) as_recharge [user_id] ← v3 新增
app_user (1) ──< (N) as_user_sub_member
app_user (1) ──< (N) as_invite [as inviter]
app_user (1) ──< (1) as_invite [as invitee]
app_user (1) ──< (N) as_notification
```
---
## 三、关键状态机
### 3.1 订单as_order
```
[待支付] ─→ 15min 超时 ─→ [已取消]
[待支付] ─→ 支付成功 ─→ [已支付] ─→ 激活订阅 ─→ [已完成]
[已支付/已完成] ─→ 退款 ─→ [已退款]
```
### 3.2 充值单as_recharge ← v3 新增
```
[待支付(0)] ─→ 外部支付成功 ─→ [已到账(1)]
─→ 15min 超时 ─→ [已取消(3)]
─→ 支付失败 ─→ [支付失败(2)]
人工充值:管理员操作 → 直接创建 status=1 记录
```
### 3.3 个人订阅as_user_sub_member ← v3 修订
```
[待激活(0)] ─→ 订单完成 ─→ [使用中(1)]
[等待车主(4)] ← 广场拼车付款后,等待车主录入凭据
[等待车主(4)] ─→ 车主录入凭据 ─→ [使用中(1)]
[使用中(1)] ─→ 到期 ─→ [已到期(2)] ─→ 续费 ─→ [使用中(1)] 新建记录
─→ 主动退订 ─→ [已退订(3)]
```
> **v3 修订**:移除 UNIQUE(sub_id, user_id)续费时新建记录旧记录置2=已到期),保留完整历史
### 3.4 合租槽as_user_sub
```
[可加入(0)] ─→ 席位满 ─→ [已满(1)]
[可加入/已满] ─→ 到期 ─→ [已到期(2)]
─→ 车主关闭 ─→ [已关闭(3)]
```
---
## 四、关键设计机制
### 4.1 席位超卖防护(乐观锁)
```sql
-- 购买时原子性占位affected rows = 0 则席位已满
UPDATE as_user_sub
SET capacity_loaded = capacity_loaded + 1
WHERE id = ? AND capacity_loaded < capacity;
```
### 4.2 账号凭据加密
- 算法AES-256-GCM`as_sub_account.encrypt_type = 1`
- `account_passwd`密文Base64
- `passwd_salt`:随机 IV16 字节 Base64
- 密钥:服务端环境变量,不入库
- 查看凭据:仅限 `as_user_sub_member.status = 1`,服务端解密后返回明文,不记录日志
### 4.3 钱包余额并发控制(乐观锁)
```sql
UPDATE as_wallet
SET balance = balance - ?, version = version + 1
WHERE user_id = ? AND version = ? AND balance >= ?;
-- affected rows = 0并发冲突或余额不足
```
### 4.4 续费记录设计
- 续费时**新建** `as_user_sub_member` 记录,旧记录 `status` 置为 2已到期
- 同一 `sub_id + user_id` 只允许一条 `status = 1` 的记录(应用层强制)
- 历史续费记录完整保留,支持对账和退款审计
### 4.5 产品-计划 M:N 查询
```sql
-- 商品详情:该商品关联哪些订阅计划
SELECT sp.* FROM as_sub_plan sp
JOIN as_product_plan_rel r ON r.plan_id = sp.id
WHERE r.product_id = ?
ORDER BY r.sort_order;
-- 计划维度:哪些商品使用了该计划
SELECT p.* FROM as_sub_product p
JOIN as_product_plan_rel r ON r.product_id = p.id
WHERE r.plan_id = ? AND p.status = 1;
```
### 4.6 订阅到期定时任务(每日 02:00
```
1. expire_time < now() + 7天 且 status=1 → 推送续费提醒通知as_notification
2. expire_time < now() 且 status=1 → 标记 status=2已到期
→ as_user_sub.capacity_loaded -1释放席位
3. as_order.expire_time < now() 且 status=0 → 标记 status=4已取消释放席位预留
4. as_recharge.expire_time < now() 且 status=0 → 标记 status=3已取消
```
---
## 五、关键索引清单
| 表 | 索引 | 用途 |
|----|------|------|
| `as_user_sub_member` | `(user_id, status)` | 我的订阅列表 |
| `as_user_sub_member` | `(expire_time, status)` | 定时任务扫描到期 |
| `as_order` | `(user_id, status)` | 用户订单列表 |
| `as_order` | `order_no` UNIQUE | 订单号查询 |
| `as_notification` | `(user_id, is_read)` | 未读通知数 |
| `as_user_sub` | `(product_id, status)` | 商品可用合租槽 |
| `as_sub_account` | `(product_id, status)` | 产品账号列表 |
| `as_sub_product` | `(product_type, status)` | 广场/自营分类查询 |
| `as_banner` | `(status, sort_order)` | 首页 Banner 展示 |
| `as_banner` | `(start_time, end_time)` | 时间段筛选 |
| `as_recharge` | `(user_id, status)` | 充值记录查询 |
| `as_product_plan_rel` | `(product_id)` / `(plan_id)` | M:N 双向查询 |
---
## 六、v2 → v3 变更记录
| 问题 | 类型 | 处理方式 | 结果 |
|------|------|----------|------|
| R1 充值流水缺失 | 🔴 严重 | 新增 `as_recharge` 表 | ✅ 已修复 |
| R2 续费历史丢失 | 🔴 严重 | 移除 `as_user_sub_member` UNIQUE KEY续费改为新建记录 | ✅ 已修复 |
| I1 Banner 表缺失 | 🟠 重要 | 新增 `as_banner` 表 | ✅ 已修复 |
| I2 M:N 逗号分隔 | 🟠 重要 | 新增 `as_product_plan_rel`;移除 `sub_plan_ids` 字段 | ✅ 已修复 |
| I3 文档字段不一致 | 🟠 重要 | 本文档统一使用 v2 修订后字段名 | ✅ 已同步 |
| L1 拼车凭据状态 | 🟡 轻微 | `as_user_sub_member.status` 增加值 4=等待车主录入凭据 | ✅ 已修复 |
| L2 索引规划缺失 | 🟡 轻微 | 补充 12 项关键索引(见上表) | ✅ 已修复 |
**表数量变化v223张→ v327张新增 as_recharge / as_banner / as_product_plan_rel**
---
## 七、待决策项(需 Ami 确认)
| # | 问题 | 选项 |
|---|------|------|
| 1 | 付费方式一期支持哪些? | A) 仅余额人工充值B) 余额+支付宝 C) 三种都支持 |
| 2 | 拼车广场是否需要审核流程? | A) 管理员审核 B) 自动上架 C) 仅自营,无拼车广场 |
| 3 | 账号凭据展示方式? | A) 直接明文 B) 需二次验证 C) 限时展示30s后隐藏 |
| 4 | 邀请返现比例和条件? | 需定义:金额/比例,是否有上限 |
| 5 | ~~sub_plan_ids 是否改关联表?~~ | ✅ v3 已改为关联表 `as_product_plan_rel` |
| 6 | 提现功能是否一期上线? | A) 一期上 B) 二期(一期只充值不提现) |
---
*最后更新2026-02-17 · v3*