feat: database design v2.0 - fix 15 defects, add 6 new tables

fixes:
- as_platform_type/platform: add status/del_flag/timestamps, sort_order varchar->int
- as_sub_plan: platform_id varchar->bigint, capacity varchar->int
- as_sub_payroll: rename sub_plans->sub_plan_id, add duration_months/original_price/is_active
- as_sub_product: fix Tags->tags naming bug, add platform_id/cover_image/status/total_capacity, type fields Long->tinyint
- as_sub_account: 4 int->bigint fields, passwd_salt int->varchar(64), add encrypt_type/status
- as_user_sub: remark int->varchar(bug fix), int->bigint fields, add product_id/status/expire_time, rename user_id->host_user_id/main_account->account_id
- as_sub_product_comment: add order_id/is_anonymous/reply_id/del_flag

new tables:
- as_user_sub_member: individual subscription record (critical missing table)
- as_order: full order table with state machine
- as_wallet: user wallet with optimistic lock
- as_wallet_log: balance transaction log
- as_invite: invitation relationship
- as_notification: system notifications
This commit is contained in:
阿米狗
2026-02-17 19:36:55 +08:00
parent d6af71ec14
commit 0192fc3523
2 changed files with 797 additions and 0 deletions

427
DATABASE_DESIGN_V2.md Normal file
View File

@@ -0,0 +1,427 @@
# iShare 数据库设计 v2.0(修订版)
> 基于原版 v1.02023-08 骨架)审查后全面修订
> 修订时间: 2026-02-17
> 建表脚本: `db/ishare_schema_v2.sql`
---
## 一、修订说明
### 1.1 原版问题总结
| 类型 | 数量 | 说明 |
|------|------|------|
| 🔴 严重缺陷 | 4 项 | 直接导致核心功能不可用 |
| 🟠 重要问题 | 6 项 | 数据类型错误/查询困难 |
| 🟡 设计缺失 | 5 项 | 运营/安全功能不完整 |
### 1.2 修订内容
| 表名 | 修订类型 | 主要变更 |
|------|----------|----------|
| `as_platform_type` | 补充 | 加 `status``del_flag`、时间戳;`sort_order` varchar→int |
| `as_platform` | 补充 | 加 `description``status``del_flag`、时间戳;`sort_order` varchar→int |
| `as_sub_plan` | 修复+补充 | `platform_id` varchar→**bigint**`capacity` varchar→**int**;加状态/软删除/时间戳 |
| `as_sub_payroll` | 重构 | `sub_plans`→**`sub_plan_id`**(语义明确);加 `duration_months``original_price``is_active`;软删除/时间戳 |
| `as_sub_product` | 修复+补充 | **`Tags``tags`**(命名修复);加 `platform_id``cover_image``status``total_capacity``product_type`/`sub_type` Long→**tinyint** |
| `as_sub_account` | 修复+补充 | 4个字段 int→**bigint**`passwd_salt` int→**varchar(64)**;加 `encrypt_type``status`、软删除/时间戳 |
| `as_user_sub` | 语义修订+修复 | 重定义为"合租槽(共享池)"`remark` int→**varchar**;字段 int→bigint`product_id``status``expire_time`、软删除/时间戳;`user_id``host_user_id`(语义明确);`main_account``account_id` |
| `as_sub_product_comment` | 补充 | 加 `order_id`(购买验证)、`is_anonymous``reply_id`(追评)、`del_flag` |
| `as_user_sub_member` | **新增** | 个人订阅记录(原版最大缺失),含 `status``start_time``expire_time` |
| `as_order` | **新增** | 完整订单表(含状态机、价格快照、支付信息) |
| `as_wallet` | **新增** | 用户钱包(含乐观锁 `version` 防并发) |
| `as_wallet_log` | **新增** | 钱包流水(含 `balance_after` 快照便于对账) |
| `as_invite` | **新增** | 邀请关系与返现 |
| `as_notification` | **新增** | 系统通知(续费提醒/订单/公告/奖励) |
| `app_user` | 追加字段 | 加 `invite_code`(专属邀请码)、`inviter_id` |
---
## 二、表结构v2.0
### 2.1 `as_platform_type` — 平台类型
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | bigint PK | 主键 |
| `name` | varchar(64) NOT NULL | 类型名称(视频/音乐/AI等 |
| `platform_type` | int DEFAULT 0 | 类型编号0=全部,用于筛选) |
| `sort_order` | int DEFAULT 0 | 排序权重(升序,**原为 varchar** |
| `status` | tinyint DEFAULT 1 | **新增** 0=禁用, 1=启用 |
| `del_flag` | char(1) DEFAULT '0' | **新增** 软删除 |
| `create_time` | datetime | **新增** |
| `update_time` | datetime | **新增** |
### 2.2 `as_platform` — 流媒体平台
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | bigint PK | 主键 |
| `platform_name` | varchar(128) NOT NULL | 平台名称 |
| `platform_type` | int DEFAULT 0 | 关联类型编号 |
| `icon` | varchar(512) | 图标 URL |
| `description` | varchar(512) | **新增** 平台简介 |
| `company` | varchar(128) | 所属公司 |
| `website` | varchar(256) | 官网 |
| `sort_order` | int DEFAULT 0 | 排序(**原为 varchar** |
| `status` | tinyint DEFAULT 1 | **新增** 0=禁用, 1=启用 |
| `del_flag` | char(1) DEFAULT '0' | **新增** 软删除 |
| `create_time` | datetime | **新增** |
| `update_time` | datetime | **新增** |
### 2.3 `as_sub_plan` — 订阅计划
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | bigint PK | 主键 |
| `name` | varchar(128) NOT NULL | 计划名称 |
| `platform_id` | bigint NOT NULL | 所属平台(**原为 varchar已修复** |
| `capacity` | int NOT NULL DEFAULT 1 | 席位容量(**原为 varchar已修复** |
| `remark` | varchar(256) | 备注 |
| `sort_order` | int DEFAULT 0 | 排序 |
| `status` | tinyint DEFAULT 1 | **新增** 0=禁用, 1=启用 |
| `del_flag` | char(1) DEFAULT '0' | **新增** 软删除 |
| `create_time` | datetime | **新增** |
| `update_time` | datetime | **新增** |
### 2.4 `as_sub_payroll` — 付费方案
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | bigint PK | 主键 |
| `sub_plan_id` | bigint NOT NULL | 所属订阅计划(**原 `sub_plans` 注释混乱,已重命名+澄清** |
| `platform_id` | bigint NOT NULL | 平台ID冗余 |
| `payroll` | tinyint NOT NULL | 周期: 1=月付, 2=季付, 3=年付 |
| `duration_months` | int NOT NULL | **新增** 实际月数: 1/3/12 |
| `price` | decimal(10,2) | 售价 |
| `original_price` | decimal(10,2) | **新增** 划线价(显示折扣用) |
| `currency` | varchar(8) DEFAULT 'CNY' | 货币单位 |
| `region` | varchar(64) | 适用地区 |
| `is_active` | tinyint DEFAULT 1 | **新增** 0=下架, 1=上架 |
| `del_flag` | char(1) DEFAULT '0' | **新增** 软删除 |
| `create_time` | datetime | **新增** |
| `update_time` | datetime | **新增** |
### 2.5 `as_sub_product` — 订阅产品(合租商品)
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | bigint PK | 主键 |
| `title` | varchar(256) NOT NULL | 产品标题 |
| `description` | varchar(1024) | 描述 |
| `cover_image` | varchar(512) | **新增** 封面图 URL |
| `tags` | varchar(256) | 标签(逗号分隔,**原字段名 `Tags` 大写 Bug 已修复** |
| `platform_id` | bigint NOT NULL | **新增** 所属平台(加速查询) |
| `sub_plan_ids` | varchar(256) | 关联计划ID列表逗号分隔保留现状 |
| `product_type` | tinyint NOT NULL DEFAULT 1 | 1=自营, 2=个人(**原为 Long已修复** |
| `sub_type` | tinyint NOT NULL DEFAULT 1 | 1=单品, 2=多品组合(**原为 Long已修复** |
| `total_capacity` | int NOT NULL DEFAULT 1 | **新增** 总席位数 |
| `amount` | decimal(10,2) | 基准月价 |
| `star` | decimal(3,1) DEFAULT 0.0 | 综合评分(由评价聚合更新) |
| `status` | tinyint NOT NULL DEFAULT 0 | **新增** 0=草稿, 1=上架, 2=下架, 3=售完 |
| `user_id` | bigint | 发布者用户ID |
| `del_flag` | char(1) DEFAULT '0' | **新增** 软删除 |
| `create_by` / `update_by` | varchar(64) | **新增** |
| `create_time` / `update_time` | datetime | |
### 2.6 `as_sub_account` — 平台账号凭据
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | bigint PK | 主键 |
| `product_id` | bigint | 关联产品ID |
| `sub_plan_id` | bigint | 订阅计划ID**原 int已修复** |
| `sub_payroll_id` | bigint | 付费方案ID**原 int已修复** |
| `platform_id` | bigint NOT NULL | 平台ID**原 int已修复** |
| `user_id` | bigint NOT NULL | 账号持有者(**原 int已修复** |
| `account_name` | varchar(256) NOT NULL | 平台登录用户名/邮箱 |
| `account_passwd` | varchar(512) NOT NULL | 加密后的密码 |
| `passwd_salt` | varchar(64) NOT NULL | 加密盐值(**原 int 已修复为 varchar(64)** |
| `encrypt_type` | tinyint NOT NULL DEFAULT 1 | **新增** 加密算法: 1=AES-256-GCM |
| `region` | varchar(64) | 账号地区 |
| `share_type` | tinyint | 分享类型 |
| `account_type` | tinyint | 账号类型 |
| `renew_date` | datetime | 账号下次续费日 |
| `status` | tinyint NOT NULL DEFAULT 0 | **新增** 0=正常, 1=已失效, 2=异常/被封 |
| `del_flag` | char(1) DEFAULT '0' | **新增** 软删除 |
| `create_time` / `update_time` | datetime | **新增** |
### 2.7 `as_user_sub` — 合租槽(共享池)
> 语义修订:代表"一个共享席位池",不代表个人订阅。个人订阅记录见 `as_user_sub_member`。
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | bigint PK | 主键 |
| `product_id` | bigint NOT NULL | **新增** 关联产品 |
| `plan_id` | bigint NOT NULL | 订阅计划(**原 int已修复** |
| `platform_id` | bigint NOT NULL | 平台(冗余) |
| `host_user_id` | bigint NOT NULL | **重命名自 `user_id`**车主用户ID语义明确 |
| `account_id` | bigint | **重命名自 `main_account`**,关联凭据(语义明确) |
| `capacity` | int NOT NULL | 总席位数 |
| `capacity_loaded` | int NOT NULL DEFAULT 0 | 已占用席位数 |
| `region` | varchar(64) | 地区 |
| `status` | tinyint NOT NULL DEFAULT 0 | **新增** 0=可加入, 1=已满, 2=已到期, 3=已关闭 |
| `expire_time` | datetime | **新增** 合租槽到期时间 |
| `remark` | varchar(512) | 车主说明(**原 int已修复为 varchar** |
| `del_flag` | char(1) DEFAULT '0' | **新增** 软删除 |
| `create_time` / `update_time` | datetime | **新增** |
### 2.8 `as_sub_product_comment` — 产品评价
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | bigint PK | 主键 |
| `product_id` | bigint NOT NULL | 关联产品 |
| `user_id` | bigint NOT NULL | 评价用户 |
| `order_id` | bigint | **新增** 关联订单(验证是否购买过) |
| `star` | tinyint NOT NULL | 评分 1-5 |
| `comment` | varchar(1024) | 评价内容 |
| `is_anonymous` | tinyint DEFAULT 0 | **新增** 0=公开, 1=匿名 |
| `reply_id` | bigint | **新增** 回复的评价ID追评/商家回复) |
| `del_flag` | char(1) DEFAULT '0' | **新增** 软删除 |
| `create_time` / `update_time` | datetime | |
### 2.9 `as_user_sub_member` — 个人订阅记录 【新增,原版最大缺失】
> 原版无此表,导致"哪些用户加入了哪个合租位"完全无法追踪。
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | bigint PK | 主键 |
| `sub_id` | bigint NOT NULL | 所在合租槽(→ `as_user_sub.id` |
| `user_id` | bigint NOT NULL | 订阅用户 |
| `order_id` | bigint NOT NULL | 来源订单(→ `as_order.id` |
| `payroll_id` | bigint NOT NULL | 购买的付费方案 |
| `status` | tinyint NOT NULL DEFAULT 0 | 0=待激活, 1=使用中, 2=已到期, 3=已退订 |
| `start_time` | datetime NOT NULL | 订阅开始时间 |
| `expire_time` | datetime NOT NULL | 订阅到期时间 |
| `del_flag` | char(1) DEFAULT '0' | 软删除 |
| `create_time` / `update_time` | datetime | |
| UK: `(sub_id, user_id)` | — | 同一合租槽同一用户只能有一条有效记录 |
### 2.10 `as_order` — 订单表 【新增】
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | bigint PK | 主键 |
| `order_no` | varchar(32) UNIQUE | 业务订单号AS+时间戳+随机) |
| `user_id` | bigint NOT NULL | 购买用户 |
| `product_id` | bigint NOT NULL | 商品 |
| `payroll_id` | bigint NOT NULL | 付费方案 |
| `original_amount` | decimal(10,2) | 原价快照(防价格变动) |
| `discount_amount` | decimal(10,2) DEFAULT 0 | 优惠金额 |
| `amount` | decimal(10,2) | 实付金额 |
| `pay_type` | tinyint | 1=余额, 2=支付宝, 3=微信 |
| `pay_no` | varchar(64) | 第三方支付单号 |
| `status` | tinyint NOT NULL DEFAULT 0 | 0=待支付, 1=已支付, 2=已完成, 3=已退款, 4=已取消 |
| `member_id` | bigint | 关联个人订阅记录(支付后填充) |
| `expire_time` | datetime NOT NULL | 订单过期时间(默认 +15min|
| `pay_time` | datetime | 实际支付时间 |
| `del_flag` | char(1) DEFAULT '0' | 软删除 |
| `create_time` / `update_time` | datetime | |
**订单状态机:**
```
[待支付] → 15分钟超时 → [已取消]
[待支付] → 支付成功 → [已支付] → 激活订阅 → [已完成]
[已支付/已完成] → 退款 → [已退款]
```
### 2.11 `as_wallet` — 用户钱包 【新增】
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | bigint PK | 主键 |
| `user_id` | bigint UNIQUE | 用户(一人一钱包) |
| `balance` | decimal(10,2) | 可用余额 |
| `frozen_amount` | decimal(10,2) | 冻结金额 |
| `total_income` | decimal(10,2) | 累计收入 |
| `total_expense` | decimal(10,2) | 累计支出 |
| `version` | int DEFAULT 0 | 乐观锁版本号(防并发余额错误) |
| `create_time` / `update_time` | datetime | |
### 2.12 `as_wallet_log` — 钱包流水 【新增】
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | bigint PK | 主键 |
| `user_id` | bigint NOT NULL | 用户 |
| `amount` | decimal(10,2) | 金额(正=收入, 负=支出) |
| `type` | tinyint | 1=充值, 2=消费, 3=退款, 4=邀请返现, 5=提现 |
| `order_id` | bigint | 关联订单(可空) |
| `balance_after` | decimal(10,2) | 操作后余额快照(对账用) |
| `remark` | varchar(256) | 说明 |
| `create_time` | datetime | |
### 2.13 `as_invite` — 邀请关系 【新增】
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | bigint PK | 主键 |
| `inviter_id` | bigint NOT NULL | 邀请人 |
| `invitee_id` | bigint NOT NULL UNIQUE | 被邀请人(一个人只有一条邀请记录) |
| `invite_code` | varchar(16) | 使用的邀请码 |
| `reward_amount` | decimal(10,2) | 返现金额 |
| `reward_status` | tinyint DEFAULT 0 | 0=待发放, 1=已发放, 2=已失效 |
| `reward_time` | datetime | 返现时间 |
| `create_time` | datetime | 注册时间 |
### 2.14 `as_notification` — 系统通知 【新增】
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | bigint PK | 主键 |
| `user_id` | bigint NOT NULL | 目标用户0=全体广播) |
| `title` | varchar(128) | 通知标题 |
| `content` | varchar(1024) | 通知内容 |
| `type` | tinyint | 1=续费提醒, 2=订单通知, 3=系统公告, 4=邀请奖励 |
| `ref_id` | bigint | 关联业务ID按 type 解析) |
| `is_read` | tinyint DEFAULT 0 | 0=未读, 1=已读 |
| `create_time` | datetime | |
---
## 三、完整 ER 关系图v2.0
```
as_platform_type (1) ──< (N) as_platform [platform_type]
as_platform (1) ──< (N) as_sub_plan [platform_id]
as_sub_plan (1) ──< (N) as_sub_payroll [sub_plan_id]
as_sub_plan (N) >──< (N) as_sub_product [sub_plan_ids 逗号分隔]
as_platform (1) ──< (N) as_sub_product [platform_id 冗余]
as_sub_product (1) ──< (N) as_sub_product_comment [product_id]
as_sub_product (1) ──< (N) as_sub_account [product_id]
as_sub_product (1) ──< (N) as_user_sub [product_id]
as_sub_plan (1) ──< (N) as_sub_account [sub_plan_id]
as_sub_payroll (1) ──< (N) as_sub_account [sub_payroll_id]
as_user_sub (1) ──< (N) as_user_sub_member [sub_id] ← 新增关键表
as_order (1) ──< (1) as_user_sub_member [order_id]
as_sub_payroll (1) ──< (N) as_user_sub_member [payroll_id]
as_sub_product (1) ──< (N) as_order [product_id]
as_sub_payroll (1) ──< (N) as_order [payroll_id]
as_order (1) ──< (N) as_wallet_log [order_id]
app_user (1) ──< (1) as_wallet [user_id]
as_wallet (1) ──< (N) as_wallet_log [user_id]
app_user (1) ──< (N) as_order [user_id]
app_user (1) ──< (N) as_user_sub [as host] [host_user_id]
app_user (1) ──< (N) as_user_sub_member [user_id]
app_user (1) ──< (N) as_sub_product [user_id 发布者]
app_user (1) ──< (N) as_sub_account [user_id 持有者]
app_user (1) ──< (N) as_sub_product_comment [user_id]
app_user (1) ──< (N) as_notification [user_id]
app_user (1) ──< (N) as_invite [as inviter] [inviter_id]
app_user (1) ──< (1) as_invite [as invitee] [invitee_id]
```
---
## 四、`as_user_sub_member` 状态机
```
购买成功(order paid)
[待激活] ──────────────→ [使用中]
┌───────────┤
│ │
主动退订 到期
│ │
↓ ↓
[已退订] [已到期]
续费
[使用中]
```
---
## 五、重要设计说明
### 5.1 容量管理与并发控制
**席位超卖防护:**
- `as_sub_product.total_capacity` — 总席位(固定值)
- `as_user_sub.capacity_loaded` — 已占用(购买时 +1退订/到期时 -1
- 购买时通过 **乐观锁** 控制:
```sql
UPDATE as_user_sub
SET capacity_loaded = capacity_loaded + 1
WHERE id = ? AND capacity_loaded < capacity
```
更新行数 = 0 则说明已满,拒绝购买
### 5.2 账号凭据加密
- 算法AES-256-GCM`encrypt_type = 1`
- `account_passwd`密文Base64 编码)
- `passwd_salt`:随机 IV16字节Base64 编码,**原 int 类型错误已修复**
- 密钥:存于服务端配置/环境变量,不入库
### 5.3 钱包余额并发控制
- `as_wallet.version` 字段实现乐观锁:
```sql
UPDATE as_wallet
SET balance = balance - ?, version = version + 1
WHERE user_id = ? AND version = ? AND balance >= ?
```
更新行数 = 0 则说明并发冲突或余额不足
### 5.4 订阅到期任务
定时任务(建议每日 02:00
```
1. 查询 expire_time < now() + 7d 且 status = 1 的 as_user_sub_member
→ 生成 as_notificationtype=1续费提醒
2. 查询 expire_time < now() 且 status = 1 的 as_user_sub_member
→ UPDATE status = 2已到期
→ UPDATE as_user_sub SET capacity_loaded = capacity_loaded - 1
```
### 5.5 评价限制
- 写评价前校验:`as_order` 存在且 `status IN (2,3)` 且 `user_id` 匹配
- `star` 范围 1-5服务端强制校验
- `as_sub_product.star` 由定时任务或触发器聚合更新AVG
---
## 六、数据库表总览v2.0
| # | 表名 | 类型 | 状态 |
|---|------|------|------|
| 1 | `app_user` | App基础 | 追加2字段 |
| 2 | `app_role` | App基础 | 沿用 |
| 3 | `app_user_role` | App基础 | 沿用 |
| 4 | `app_social_details` | App基础 | 沿用 |
| 5 | `app_article_category` | App基础 | 沿用 |
| 6 | `app_article` | App基础 | 沿用 |
| 7 | `app_article_collect` | App基础 | 沿用 |
| 8 | `app_page` | App基础 | 沿用 |
| 9 | `app_tabbar` | App基础 | 沿用 |
| 10 | `as_platform_type` | 业务 | 修订 |
| 11 | `as_platform` | 业务 | 修订 |
| 12 | `as_sub_plan` | 业务 | 修订 |
| 13 | `as_sub_payroll` | 业务 | 修订 |
| 14 | `as_sub_product` | 业务 | 修订 |
| 15 | `as_sub_account` | 业务 | 修订 |
| 16 | `as_user_sub` | 业务 | 修订(语义重定义) |
| 17 | `as_sub_product_comment` | 业务 | 修订 |
| 18 | `as_user_sub_member` | 业务 | **新增** |
| 19 | `as_order` | 业务 | **新增** |
| 20 | `as_wallet` | 业务 | **新增** |
| 21 | `as_wallet_log` | 业务 | **新增** |
| 22 | `as_invite` | 业务 | **新增** |
| 23 | `as_notification` | 业务 | **新增** |
合计9 张 App 基础表 + 14 张业务表 = **23 张表**