# iShare 数据库设计 v2.0(修订版) > 基于原版 v1.0(2023-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`:随机 IV(16字节,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_notification(type=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 张表**