Files
work_flow_ishare/DATABASE_DESIGN_V2.md
Admin 2e34dd172b init: iShare Phase D 设计文档完整归档
文档清单:
- README.md                     仓库导航
- iShare-dev-plan.md            开发规划
- SYSTEM_DESIGN.md              系统设计(角色/流程/接口)
- DATABASE_DESIGN_V2.md         数据库完整字段设计
- DATABASE_DESIGN_OVERVIEW.md   设计概要 v4(28张表)
- DECISIONS.md                  6个关键决策记录
- db/ishare_schema_v2.sql       基础建表 SQL
- db/ishare_schema_v3_delta.sql v2→v3 增量(评审修复)
- db/ishare_schema_v4_delta.sql v3→v4 增量(决策确认)
- memory_2026-02-17.md          工作日志

Phase D 完成:28张表定稿,所有决策已确认
2026-02-17 13:27:34 +01:00

428 lines
19 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 数据库设计 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 张表**