- 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张)
130 lines
6.8 KiB
SQL
130 lines
6.8 KiB
SQL
-- ============================================================
|
||
-- iShare 数据库设计 v2 → v3 增量脚本
|
||
-- 修订时间: 2026-02-17
|
||
-- 处理评审问题: R1, R2, I1, I2, I3(文档), L1, L2
|
||
-- ============================================================
|
||
|
||
USE pigxx_app;
|
||
SET NAMES utf8mb4;
|
||
|
||
-- ============================================================
|
||
-- R2: 修复 as_user_sub_member 唯一键问题
|
||
-- 原 UNIQUE(sub_id, user_id) 导致续费覆盖历史记录
|
||
-- 改为:允许多条记录,逻辑约束同 sub_id+user_id 只有一条 status=1
|
||
-- ============================================================
|
||
ALTER TABLE `as_user_sub_member`
|
||
DROP INDEX IF EXISTS `uk_sub_user`;
|
||
|
||
-- 补充索引(定时任务/我的订阅高频查询)
|
||
ALTER TABLE `as_user_sub_member`
|
||
ADD INDEX IF NOT EXISTS `idx_user_status` (`user_id`, `status`),
|
||
ADD INDEX IF NOT EXISTS `idx_expire_status` (`expire_time`, `status`);
|
||
|
||
-- L1: status 增加 4=等待车主录入凭据(广场拼车场景)
|
||
-- 注:仅修改注释,逻辑不变;应用层处理状态值
|
||
ALTER TABLE `as_user_sub_member`
|
||
MODIFY COLUMN `status` tinyint NOT NULL DEFAULT 0
|
||
COMMENT '状态: 0=待激活, 1=使用中, 2=已到期, 3=已退订, 4=等待车主录入凭据';
|
||
|
||
|
||
-- ============================================================
|
||
-- I2: as_sub_product.sub_plan_ids 逗号分隔改为关联表
|
||
-- ============================================================
|
||
|
||
-- 新增 M:N 关联表
|
||
CREATE TABLE IF NOT EXISTS `as_product_plan_rel` (
|
||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||
`product_id` bigint NOT NULL COMMENT '产品ID(→ as_sub_product.id)',
|
||
`plan_id` bigint NOT NULL COMMENT '订阅计划ID(→ as_sub_plan.id)',
|
||
`sort_order` int NOT NULL DEFAULT 0 COMMENT '排序权重(同产品内多计划的展示顺序)',
|
||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_product_plan` (`product_id`, `plan_id`),
|
||
KEY `idx_product_id` (`product_id`),
|
||
KEY `idx_plan_id` (`plan_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
||
COMMENT='产品-订阅计划关联表(M:N)';
|
||
|
||
-- 移除旧的逗号分隔字段
|
||
ALTER TABLE `as_sub_product`
|
||
DROP COLUMN IF EXISTS `sub_plan_ids`;
|
||
|
||
-- 补充 as_sub_product 高频查询索引
|
||
ALTER TABLE `as_sub_product`
|
||
ADD INDEX IF NOT EXISTS `idx_product_type_status` (`product_type`, `status`);
|
||
|
||
|
||
-- ============================================================
|
||
-- R1: 新增 as_recharge — 钱包充值单
|
||
-- 支持外部支付充值时追踪(待支付→成功→到账)
|
||
-- ============================================================
|
||
CREATE TABLE IF NOT EXISTS `as_recharge` (
|
||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||
`recharge_no` varchar(32) NOT NULL COMMENT '充值单号(RC+时间戳+随机,业务唯一)',
|
||
`user_id` bigint NOT NULL COMMENT '用户ID(→ app_user.user_id)',
|
||
`amount` decimal(10,2) NOT NULL COMMENT '充值金额',
|
||
`pay_type` tinyint NOT NULL COMMENT '支付方式: 1=人工充值(管理员), 2=支付宝, 3=微信支付',
|
||
`pay_no` varchar(64) DEFAULT NULL COMMENT '第三方支付单号(外部支付时回填)',
|
||
`status` tinyint NOT NULL DEFAULT 0 COMMENT '状态: 0=待支付, 1=已支付/已到账, 2=支付失败, 3=已取消',
|
||
`remark` varchar(256) DEFAULT NULL COMMENT '备注(人工充值时填写原因)',
|
||
`operator_id` bigint DEFAULT NULL COMMENT '操作人ID(人工充值时为管理员ID)',
|
||
`expire_time` datetime DEFAULT NULL COMMENT '订单过期时间(外部支付时 +15min)',
|
||
`pay_time` datetime DEFAULT NULL COMMENT '实际支付/到账时间',
|
||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_recharge_no` (`recharge_no`),
|
||
KEY `idx_user_id` (`user_id`),
|
||
KEY `idx_status` (`status`),
|
||
KEY `idx_pay_no` (`pay_no`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
||
COMMENT='钱包充值单表(含外部支付追踪)';
|
||
|
||
|
||
-- ============================================================
|
||
-- I1: 新增 as_banner — 首页广告位/Banner
|
||
-- ============================================================
|
||
CREATE TABLE IF NOT EXISTS `as_banner` (
|
||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||
`title` varchar(128) NOT NULL COMMENT 'Banner 标题(后台管理用)',
|
||
`image_url` varchar(512) NOT NULL COMMENT 'Banner 图片 URL',
|
||
`link_type` tinyint NOT NULL DEFAULT 0 COMMENT '跳转类型: 0=无跳转, 1=商品详情, 2=外部链接, 3=平台分类',
|
||
`link_target` varchar(512) DEFAULT NULL COMMENT '跳转目标(商品ID/URL/分类ID,按 link_type 解析)',
|
||
`sort_order` int NOT NULL DEFAULT 0 COMMENT '排序权重(升序,值小靠前)',
|
||
`status` tinyint NOT NULL DEFAULT 0 COMMENT '状态: 0=草稿, 1=展示中, 2=已下线',
|
||
`start_time` datetime DEFAULT NULL COMMENT '展示开始时间(NULL=立即生效)',
|
||
`end_time` datetime DEFAULT NULL COMMENT '展示结束时间(NULL=长期有效)',
|
||
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人',
|
||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_status_sort` (`status`, `sort_order`),
|
||
KEY `idx_time_range` (`start_time`, `end_time`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
||
COMMENT='首页 Banner 广告位表';
|
||
|
||
|
||
-- ============================================================
|
||
-- L2: 补充关键查询索引
|
||
-- ============================================================
|
||
|
||
-- as_order: 用户订单列表 / 状态过滤
|
||
ALTER TABLE `as_order`
|
||
ADD INDEX IF NOT EXISTS `idx_user_status` (`user_id`, `status`);
|
||
|
||
-- as_notification: 未读消息数
|
||
ALTER TABLE `as_notification`
|
||
ADD INDEX IF NOT EXISTS `idx_user_read` (`user_id`, `is_read`);
|
||
|
||
-- as_user_sub: 商品下的可用合租槽
|
||
ALTER TABLE `as_user_sub`
|
||
ADD INDEX IF NOT EXISTS `idx_product_status` (`product_id`, `status`);
|
||
|
||
-- as_sub_account: 产品下的账号列表
|
||
ALTER TABLE `as_sub_account`
|
||
ADD INDEX IF NOT EXISTS `idx_product_status` (`product_id`, `status`);
|
||
|
||
-- ============================================================
|
||
-- END
|
||
-- ============================================================
|