Files
integral-shop/backend/docs/数据库设计说明.md
2026-03-08 18:35:11 +08:00

37 KiB
Raw Blame History

商品寄卖服务模块 - 数据库设计说明(表名"wa_"开头)

项目名称: 商品寄卖服务模块
数据库类型: MySQL 5.7
字符集: utf8mb4
存储引擎: InnoDB
文档版本: V1.0
创建日期: 2024年12月


目录

  1. 数据库概述
  2. 数据表分类
  3. 核心业务表设计
  4. 用户相关表设计
  5. 商品相关表设计
  6. 订单交易表设计
  7. 财务相关表设计
  8. 系统配置表设计
  9. 表关系图
  10. 索引设计建议
  11. 数据字典

一、数据库概述

1.1 设计原则

  • 规范性: 遵循第三范式,减少数据冗余
  • 扩展性: 预留扩展字段,便于后期功能升级
  • 性能: 合理设计索引,优化查询效率
  • 安全性: 敏感信息加密存储,权限严格控制
  • 完整性: 使用外键约束保证数据一致性

1.2 命名规范

  • 表名: 统一前缀 wa_,使用小写字母和下划线
  • 字段名: 使用小写字母和下划线,语义清晰
  • 主键: 统一使用 id 作为主键名
  • 时间字段: 统一使用 created_at(创建时间)和 updated_at(更新时间)

1.3 数据表统计

分类 表数量 说明
用户相关 3张 用户表、地址表、支付账户表
商品相关 3张 商品表、寄售商品表、商品分类表
订单交易 1张 订单表
财务相关 5张 余额、优惠券、奖金、提现记录表
系统配置 5张 轮播图、设置、短信、上传、选项表
权限管理 4张 管理员、角色、权限规则表
总计 22张 -

二、数据表分类

2.1 核心业务表7张

wa_users          # 用户表
wa_goods          # 商品表
wa_merchandise    # 寄售商品表
wa_order          # 订单表
wa_category       # 商品分类表
wa_address        # 收货地址表
wa_banner         # 轮播图表

2.2 财务相关表5张

wa_money_log         # 余额变动表
wa_coupon_log        # 优惠券变动表
wa_selfbonus_log     # 个人奖金变动表
wa_sharebonus_log    # 推广奖金变动表
wa_withdraw          # 提现表

2.3 支付相关表2张

wa_alipay         # 用户支付宝表
wa_bank           # 用户银行卡表

2.4 系统管理表8张

wa_admins         # 管理员表
wa_admin_roles    # 管理员角色关联表
wa_roles          # 角色表
wa_rules          # 权限规则表
wa_options        # 选项表
wa_setting        # 设置配置表
wa_sms            # 短信验证码表
wa_uploads        # 附件上传表

三、核心业务表设计

3.1 用户表 (wa_users)

表说明: 存储用户基本信息、财务信息、邀请关系等核心数据

表结构:

字段名 类型 长度 允许NULL 默认值 说明
id int 10 - 主键ID
pid int 11 0 父级用户ID推荐人
username varchar 32 - 用户名
nickname varchar 40 - 昵称
mobile varchar 16 - 手机号
password varchar 255 - 密码(加密)
salt varchar 128 - 密码盐
sex enum - 1 性别: 0=女, 1=男
avatar varchar 255 - 头像URL
invite varchar 11 - 邀请码
level tinyint 4 1 用户等级
birthday date - - 生日
money decimal 13,3 0.000 余额(元)
coupon decimal 13,3 0.000 优惠券余额
self_bonus decimal 13,3 0.000 我的奖金
share_bonus decimal 13,3 0.000 推广奖金
score int 11 0 积分
last_time datetime - - 最后登录时间
last_ip varchar 50 - 最后登录IP
join_time datetime - - 注册时间
join_ip varchar 50 - 注册IP
token varchar 50 - 登录Token
status tinyint 4 1 状态: 0=禁用, 1=启用
is_vip tinyint 1 0 是否VIP: 0=否, 1=是
viptime datetime - - VIP截止时间
contract varchar 255 '' 合同文件
max_order int 10 0 最高可抢单数
is_resell tinyint 1 1 是否可转拍: 0=否, 1=是
created_at datetime - - 创建时间
updated_at datetime - - 更新时间

业务逻辑:

  • pid: 记录推荐人关系,用于推广奖励计算
  • invite: 用户专属邀请码,用于邀请新用户
  • money/coupon/self_bonus/share_bonus: 四种财务账户,独立管理
  • is_vip: VIP用户可享受提前抢购等特权
  • max_order: 限制用户最大可抢购订单数量
  • is_resell: 控制用户是否可以进行商品转拍

索引建议:

PRIMARY KEY (`id`)
UNIQUE KEY `mobile` (`mobile`)
UNIQUE KEY `invite` (`invite`)
INDEX `idx_pid` (`pid`)
INDEX `idx_status` (`status`)

3.2 商品表 (wa_goods)

表说明: 存储平台自营商品信息

表结构:

字段名 类型 长度 允许NULL 默认值 说明
id int 11 - 主键ID
goods_category_id int 11 - 商品分类ID
images varchar 1500 - 商品图片JSON数组
title varchar 255 - 商品标题
price decimal 10,2 0.00 售价
line_price decimal 10,2 0.00 原价(划线价)
stock_num int 11 0 库存数量
sales_volume int 11 0 显示销量
content text - - 商品详情(富文本)
notes text - - 购买须知
status tinyint 1 1 状态: 0=下架, 1=上架
created_at datetime - - 创建时间
updated_at datetime - - 更新时间

业务逻辑:

  • images: 存储JSON格式的图片URL数组如: ["url1","url2"]
  • line_price: 原价用于显示折扣,增强营销效果
  • sales_volume: 虚拟销量,可手动设置
  • content: 富文本商品详情支持HTML格式

索引建议:

PRIMARY KEY (`id`)
INDEX `idx_category` (`goods_category_id`)
INDEX `idx_status` (`status`)
INDEX `idx_created_at` (`created_at`)

3.3 寄售商品表 (wa_merchandise)

表说明: 存储用户寄售的二手商品信息

表结构:

字段名 类型 长度 允许NULL 默认值 说明
id int 11 - 主键ID
old_id int 11 0 从订单转拍过来的原订单ID
user_id int 11 - 卖家用户ID
title varchar 255 '' 商品标题
image varchar 1500 '' 商品图片
price decimal 10,2 0.00 寄售价格
is_show tinyint 1 1 是否显示: 0=隐藏, 1=显示
status tinyint 1 1 状态: 0=已售, 1=未售
created_at datetime - - 创建时间
updated_at datetime - - 更新时间

业务逻辑:

  • old_id: 支持从已购订单转拍记录原订单ID实现二次流转
  • user_id: 卖家ID关联到用户表
  • is_show: 管理员审核通过后设为1才在前台显示
  • status: 售出后自动更新为0

索引建议:

PRIMARY KEY (`id`)
INDEX `idx_user_id` (`user_id`)
INDEX `idx_status` (`status`, `is_show`)
INDEX `idx_old_id` (`old_id`)

3.4 订单表 (wa_order)

表说明: 存储所有交易订单信息(包括商品订单和寄售商品订单)

表结构:

字段名 类型 长度 允许NULL 默认值 说明
id int 10 - 主键ID
old_id int 11 - 从订单转拍过来的原订单ID
seller_id int 11 - 卖家ID平台或用户
buyer_id int 11 0 买家ID
order_sn varchar 255 - 订单编号
total_money decimal 10,2 0.00 支付金额
pay_time datetime - - 支付时间
pay_img varchar 255 - 支付凭证图片
status tinyint 1 0 订单状态: 0=待付款, 1=已支付, 2=已完成
is_resell tinyint 1 0 是否转拍: 0=否, 1=是
is_show tinyint 1 1 是否显示: 0=隐藏, 1=显示
is_cancel tinyint 1 0 是否取消: 0=否, 1=是
consignee char 50 - 收货人
phone char 50 - 收货电话
province char 50 - 省份
city char 50 - 城市
area char 50 - 区县
address varchar 255 - 详细地址
merchandise_id int 11 0 寄售商品ID如果是寄售商品订单
confirm_time datetime - - 确认收货时间
buy_time datetime - - 下单抢购时间
buy_ip varchar 50 - 下单IP
cancel_ip varchar 50 - 取消订单IP
created_at datetime - - 创建时间
updated_at datetime - - 更新时间

订单状态说明:

状态值 状态名称 说明 可执行操作
0 待付款 订单已创建,等待支付 支付、取消
1 已支付 买家已支付,等待卖家发货 申请退款
2 已完成 交易完成,确认收货 评价、申请售后

业务逻辑:

  • order_sn: 唯一订单号,格式建议:年月日+时分秒+随机数
  • seller_id: 0表示平台自营>0表示用户寄售
  • merchandise_id: >0表示这是一个寄售商品订单
  • is_resell: 标记该订单是否已转拍
  • pay_img: 如果采用线下支付,上传支付凭证
  • 收货地址字段冗余存储,防止用户修改地址后历史订单地址变更

索引建议:

PRIMARY KEY (`id`)
UNIQUE KEY `order_sn` (`order_sn`)
INDEX `idx_seller_buyer` (`seller_id`, `buyer_id`)
INDEX `idx_status` (`status`)
INDEX `idx_merchandise` (`merchandise_id`)
INDEX `idx_created_at` (`created_at`)

四、用户相关表设计

4.1 收货地址表 (wa_address)

表说明: 存储用户收货地址信息

表结构:

字段名 类型 长度 允许NULL 默认值 说明
id int 11 - 主键ID
user_id int 11 - 用户ID
consignee varchar 255 '' 收货人姓名
phone char 50 - 手机号
province varchar 255 '' 省份
city varchar 255 '' 城市
area varchar 255 '' 区县
address varchar 255 '' 详细地址
is_default tinyint 1 - 是否默认地址: 0=否, 1=是
created_at datetime - - 创建时间
updated_at datetime - - 更新时间

业务逻辑:

  • 每个用户可以有多个收货地址
  • is_default=1 的地址在下单时自动选中
  • 设置新默认地址时,需要将该用户其他地址的is_default设为0

索引建议:

PRIMARY KEY (`id`)
INDEX `idx_user_id` (`user_id`)
INDEX `idx_default` (`user_id`, `is_default`)

4.2 用户支付宝表 (wa_alipay)

表说明: 存储用户支付宝收款账户信息

表结构:

字段名 类型 长度 允许NULL 默认值 说明
id int 11 - 主键ID
user_id int 11 - 用户ID
username varchar 255 '' 真实姓名
account varchar 255 '' 支付宝账号
qrcode varchar 255 '' 收款码图片URL
phone char 50 - 手机号
created_at datetime - - 创建时间
updated_at datetime - - 更新时间

业务逻辑:

  • 用于提现时选择支付宝收款方式
  • qrcode: 可选,用户上传收款二维码

索引建议:

PRIMARY KEY (`id`)
INDEX `idx_user_id` (`user_id`)

4.3 用户银行卡表 (wa_bank)

表说明: 存储用户银行卡信息

表结构:

字段名 类型 长度 允许NULL 默认值 说明
id int 11 - 主键ID
user_id int 11 - 用户ID
username varchar 255 '' 持卡人姓名
bank varchar 255 '' 开户行
account varchar 255 '' 银行卡号(加密存储)
phone char 50 - 预留手机号
created_at datetime - - 创建时间
updated_at datetime - - 更新时间

业务逻辑:

  • 用于提现时选择银行卡收款方式
  • account: 银行卡号需要加密存储,保护用户隐私

索引建议:

PRIMARY KEY (`id`)
INDEX `idx_user_id` (`user_id`)

五、商品相关表设计

5.1 商品分类表 (wa_category)

表说明: 商品分类管理

表结构:

字段名 类型 长度 允许NULL 默认值 说明
id int 10 - 主键ID
name varchar 255 - 分类名称
weight int 11 0 排序权重(数字越大越靠前)
status tinyint 4 1 状态: 0=隐藏, 1=显示
created_at datetime - - 创建时间
updated_at datetime - - 更新时间

业务逻辑:

  • weight: 用于前台分类排序展示
  • 当前为一级分类,如需多级分类可增加pid字段

索引建议:

PRIMARY KEY (`id`)
INDEX `idx_status_weight` (`status`, `weight`)

5.2 轮播图表 (wa_banner)

表说明: 首页轮播图管理

表结构:

字段名 类型 长度 允许NULL 默认值 说明
id int 10 - 主键ID
image varchar 255 - 图片URL
url varchar 255 '' 跳转地址(页面路径或外部链接)
weight int 11 0 排序权重
created_at datetime - - 创建时间
updated_at datetime - - 更新时间

业务逻辑:

  • url: 点击轮播图跳转的目标地址
  • weight: 控制轮播图显示顺序

索引建议:

PRIMARY KEY (`id`)
INDEX `idx_weight` (`weight`)

六、订单交易表设计

订单表已在核心业务表中详细说明,此处补充订单关联的业务说明。

6.1 订单业务流程

创建订单 (status=0)
    ↓
支付订单 (status=1, 记录pay_time)
    ↓
卖家发货
    ↓
买家确认收货 (status=2, 记录confirm_time)
    ↓
交易完成

6.2 订单取消逻辑

场景 操作 数据变更
待付款取消 买家/系统超时 is_cancel=1, 记录cancel_ip
已支付取消 需要双方协商或平台介入 is_cancel=1, 退款处理

6.3 订单转拍逻辑

买家购买商品
    ↓
确认收货 (status=2)
    ↓
申请转拍 (is_resell=1)
    ↓
创建寄售商品记录 (wa_merchandise, old_id=订单ID)
    ↓
其他用户购买
    ↓
生成新订单

七、财务相关表设计

7.1 余额变动表 (wa_money_log)

表说明: 记录用户余额的所有变动记录

表结构:

字段名 类型 长度 允许NULL 默认值 说明
id int 10 - 主键ID
user_id int 10 0 用户ID
type tinyint 1 1 类型: 1=收入, 2=支出
money decimal 13,3 0.000 变更金额
before decimal 13,3 0.000 变更前余额
after decimal 13,3 0.000 变更后余额
memo varchar 255 '' 备注说明
created_at datetime - - 创建时间
updated_at datetime - - 更新时间

业务逻辑:

  • 每次余额变动都需要记录一条日志
  • beforeafter字段用于核对余额计算是否正确
  • memo记录变动原因,如:"购买商品"、"充值"、"退款"等

收入场景:

  • 充值
  • 退款
  • 活动奖励

支出场景:

  • 购买商品
  • 提现

索引建议:

PRIMARY KEY (`id`)
INDEX `idx_user_type` (`user_id`, `type`)
INDEX `idx_created_at` (`created_at`)

7.2 优惠券变动表 (wa_coupon_log)

表说明: 记录用户优惠券的所有变动记录

表结构:

字段名 类型 长度 允许NULL 默认值 说明
id int 10 - 主键ID
user_id int 10 0 用户ID
type tinyint 1 1 类型: 1=收入, 2=支出, 3=提现驳回
money decimal 13,3 0.000 变更金额
before decimal 13,3 0.000 变更前金额
after decimal 13,3 0.000 变更后金额
memo varchar 255 '' 备注说明
created_at datetime - - 创建时间
updated_at datetime - - 更新时间

业务逻辑:

  • 优惠券是平台发放的虚拟货币,不可提现(根据业务规则可能可以提现)
  • type=3 提现驳回,将扣除的金额返还

索引建议:

PRIMARY KEY (`id`)
INDEX `idx_user_type` (`user_id`, `type`)

7.3 个人奖金变动表 (wa_selfbonus_log)

表说明: 记录用户个人奖金的所有变动记录

表结构:

字段名 类型 长度 允许NULL 默认值 说明
id int 10 - 主键ID
user_id int 10 0 用户ID
type tinyint 1 1 类型: 1=收入, 2=支出
money decimal 13,3 0.000 变更金额
before decimal 13,3 0.000 变更前金额
after decimal 13,3 0.000 变更后金额
memo varchar 255 '' 备注说明
created_at datetime - - 创建时间
updated_at datetime - - 更新时间

业务逻辑:

  • 个人奖金来源于用户自己的交易奖励
  • 可以提现或转入余额

索引建议:

PRIMARY KEY (`id`)
INDEX `idx_user_id` (`user_id`)

7.4 推广奖金变动表 (wa_sharebonus_log)

表说明: 记录用户推广奖金的所有变动记录

表结构:

字段名 类型 长度 允许NULL 默认值 说明
id int 10 - 主键ID
user_id int 10 0 用户ID
type tinyint 1 1 类型: 1=收入, 2=支出, 3=提现驳回
money decimal 13,3 0.000 变更金额
before decimal 13,3 0.000 变更前金额
after decimal 13,3 0.000 变更后金额
memo varchar 255 '' 备注说明
created_at datetime - - 创建时间
updated_at datetime - - 更新时间

业务逻辑:

  • 推广奖金来源于邀请用户的消费返佣
  • 支持提现功能

索引建议:

PRIMARY KEY (`id`)
INDEX `idx_user_type` (`user_id`, `type`)

7.5 提现表 (wa_withdraw)

表说明: 记录用户提现申请和处理结果

表结构:

字段名 类型 长度 允许NULL 默认值 说明
id int 10 - 主键ID
transfer_no varchar 255 '' 提现编号(唯一)
user_id int 11 0 用户ID
cate tinyint 1 0 提现类型: 2=优惠券, 4=推广奖金
account_type tinyint 1 1 账号类型: 1=银行卡, 2=支付宝
account_id int 11 0 收款账号ID关联银行卡或支付宝表
account_info text - - 收款账号信息JSON格式
money decimal 13,2 0.00 提现金额
handling_fee decimal 13,2 0.00 手续费
actual_amount decimal 13,2 0.00 实际到账金额
status tinyint 3 0 状态: 0=待审核, 1=通过, 2=驳回
remark varchar 255 '' 备注(驳回原因等)
created_at datetime - - 申请时间
updated_at datetime - - 更新时间

提现类型说明:

cate 名称 对应字段
2 优惠券提现 wa_users.coupon
4 推广奖金提现 wa_users.share_bonus

提现状态流转:

用户申请 (status=0)
    ↓
管理员审核
    ↓
通过 (status=1, 扣除相应账户余额) / 驳回 (status=2, 返还金额)

业务逻辑:

  • transfer_no: 唯一提现流水号
  • account_info: 冗余存储收款账号信息,防止用户修改账号后历史记录丢失
  • actual_amount = money - handling_fee
  • 驳回时需要返还扣除的金额并记录到对应的变动表type=3

索引建议:

PRIMARY KEY (`id`)
UNIQUE KEY `transfer_no` (`transfer_no`)
INDEX `idx_user_status` (`user_id`, `status`)
INDEX `idx_created_at` (`created_at`)

八、系统配置表设计

8.1 管理员表 (wa_admins)

表说明: 后台管理员账号信息

表结构:

字段名 类型 长度 允许NULL 默认值 说明
id int 10 - 主键ID
username varchar 32 - 登录账号
nickname varchar 40 - 昵称
password varchar 255 - 密码(加密)
avatar varchar 255 /app/admin/avatar.png 头像
email varchar 100 - 邮箱
mobile varchar 16 - 手机号
qrcode varchar 255 '' 二维码
login_at datetime - - 最后登录时间
status tinyint 4 - 状态: 0=禁用, 1=启用
created_at datetime - - 创建时间
updated_at datetime - - 更新时间

索引建议:

PRIMARY KEY (`id`)
UNIQUE KEY `username` (`username`)
INDEX `idx_status` (`status`)

8.2 角色表 (wa_roles)

表说明: 管理员角色配置

表结构:

字段名 类型 长度 允许NULL 默认值 说明
id int 10 - 主键ID
name varchar 80 - 角色名称
rules text - - 权限规则ID集合JSON数组
pid int 10 - 父级角色ID
created_at datetime - - 创建时间
updated_at datetime - - 更新时间

索引建议:

PRIMARY KEY (`id`)

8.3 管理员角色关联表 (wa_admin_roles)

表说明: 管理员与角色的多对多关系

表结构:

字段名 类型 长度 允许NULL 默认值 说明
id int 11 - 主键ID
role_id int 11 - 角色ID
admin_id int 11 - 管理员ID

索引建议:

PRIMARY KEY (`id`)
INDEX `idx_admin_role` (`admin_id`, `role_id`)

8.4 权限规则表 (wa_rules)

表说明: 后台权限菜单和功能规则

表结构:

字段名 类型 长度 允许NULL 默认值 说明
id int 10 - 主键ID
title varchar 255 - 菜单标题
icon varchar 255 - 图标
key varchar 255 - 权限标识(唯一)
pid int 10 0 父级菜单ID
href varchar 255 - 链接地址
type int 11 1 类型: 1=菜单, 2=按钮
weight int 11 0 排序权重
created_at datetime - - 创建时间
updated_at datetime - - 更新时间

索引建议:

PRIMARY KEY (`id`)
UNIQUE KEY `key` (`key`)
INDEX `idx_pid` (`pid`)

8.5 短信验证码表 (wa_sms)

表说明: 存储发送的短信验证码记录

表结构:

字段名 类型 长度 允许NULL 默认值 说明
id int 10 - 主键ID
mobile varchar 16 - 手机号
event varchar 16 - 事件名register/login/forget等
code varchar 10 - 验证码
times int 11 0 已验证次数
ip varchar 50 - 发送IP
created_at datetime - - 创建时间
updated_at datetime - - 更新时间

业务逻辑:

  • 验证码有效期通常为5-10分钟通过created_at判断
  • times记录验证失败次数超过限制如3次则失效
  • 同一手机号、同一事件类型1分钟内只能发送一次

索引建议:

PRIMARY KEY (`id`)
INDEX `idx_mobile_event` (`mobile`, `event`)
INDEX `idx_created_at` (`created_at`)

8.6 附件上传表 (wa_uploads)

表说明: 记录所有上传的文件信息

表结构:

字段名 类型 长度 允许NULL 默认值 说明
id int 11 - 主键ID
name varchar 128 - 文件名称
url varchar 255 - 文件URL
admin_id int 11 - 上传管理员ID
file_size int 11 - 文件大小(字节)
mime_type varchar 255 - MIME类型
image_width int 11 - 图片宽度(如果是图片)
image_height int 11 - 图片高度(如果是图片)
ext varchar 128 - 文件扩展名
storage varchar 255 local 存储位置: local/oss/qiniu等
category varchar 128 - 文件分类
created_at date - - 上传时间
updated_at date - - 更新时间

索引建议:

PRIMARY KEY (`id`)
INDEX `idx_admin_id` (`admin_id`)
INDEX `idx_created_at` (`created_at`)

8.7 选项表 (wa_options)

表说明: 存储系统配置的键值对

表结构:

字段名 类型 长度 允许NULL 默认值 说明
id int 10 - 主键ID
name varchar 255 - 配置键名
value longtext - - 配置值
created_at datetime - 2022-08-15 00:00:00 创建时间
updated_at datetime - 2022-08-15 00:00:00 更新时间

使用示例:

{
  "name": "site_name",
  "value": "寄卖商城"
}

索引建议:

PRIMARY KEY (`id`)
UNIQUE KEY `name` (`name`)

8.8 设置配置表 (wa_setting)

表说明: 系统设置的结构化存储

表结构:

字段名 类型 长度 允许NULL 默认值 说明
id int 10 - 主键ID
name varchar 30 '' 变量名
group varchar 30 '' 分组名
title varchar 100 '' 变量标题
tip varchar 100 '' 变量描述
value text - - 变量值

索引建议:

PRIMARY KEY (`id`)
INDEX `idx_group` (`group`)

九、表关系图

9.1 核心业务表关系

┌─────────────┐         ┌──────────────┐         ┌─────────────┐
│  wa_users   │────1:N──│  wa_address  │         │ wa_category │
│  (用户表)    │         │  (地址表)     │         │ (商品分类)   │
└─────────────┘         └──────────────┘         └─────────────┘
       │                                                  │
       │ 1:N                                             1:N
       │                                                  │
       ↓                                                  ↓
┌─────────────┐                                  ┌─────────────┐
│wa_merchandise│                                 │  wa_goods   │
│ (寄售商品)   │                                  │  (商品表)    │
└─────────────┘                                  └─────────────┘
       │                                                  │
       │ 1:N                                             1:N
       │                                                  │
       └──────────────┬──────────────────────────────────┘
                      ↓
              ┌──────────────┐
              │   wa_order   │
              │   (订单表)    │
              └──────────────┘

9.2 财务表关系

┌─────────────┐
│  wa_users   │
│  (用户表)    │
│  - money    │──────1:N────→  wa_money_log (余额变动)
│  - coupon   │──────1:N────→  wa_coupon_log (优惠券变动)
│  - self_bonus│─────1:N────→  wa_selfbonus_log (个人奖金变动)
│  - share_bonus│────1:N────→  wa_sharebonus_log (推广奖金变动)
└─────────────┘
       │
       │ 1:N
       ↓
┌──────────────┐
│  wa_withdraw │
│  (提现表)     │
└──────────────┘
       │
       ├──────→  wa_bank (银行卡)
       └──────→  wa_alipay (支付宝)

9.3 权限管理表关系

┌─────────────┐
│  wa_admins  │
│  (管理员)    │
└─────────────┘
       │
       │ N:M (through wa_admin_roles)
       ↓
┌─────────────┐         ┌──────────────┐
│  wa_roles   │────1:N──│  wa_rules    │
│  (角色表)    │         │  (权限规则)   │
└─────────────┘         └──────────────┘

十、索引设计建议

10.1 主键索引

所有表都应该有主键索引:

PRIMARY KEY (`id`)

10.2 唯一索引

对于需要保证唯一性的字段:

-- 用户表
UNIQUE KEY `mobile` (`mobile`)
UNIQUE KEY `invite` (`invite`)

-- 订单表
UNIQUE KEY `order_sn` (`order_sn`)

-- 提现表
UNIQUE KEY `transfer_no` (`transfer_no`)

-- 管理员表
UNIQUE KEY `username` (`username`)

10.3 普通索引

常用查询字段添加索引:

用户相关:

-- wa_users
INDEX `idx_pid` (`pid`)
INDEX `idx_status` (`status`)
INDEX `idx_mobile` (`mobile`)
INDEX `idx_invite` (`invite`)

-- wa_address
INDEX `idx_user_id` (`user_id`)
INDEX `idx_default` (`user_id`, `is_default`)

商品相关:

-- wa_goods
INDEX `idx_category` (`goods_category_id`)
INDEX `idx_status` (`status`)
INDEX `idx_created_at` (`created_at`)

-- wa_merchandise
INDEX `idx_user_id` (`user_id`)
INDEX `idx_status` (`status`, `is_show`)

订单相关:

-- wa_order
INDEX `idx_seller_buyer` (`seller_id`, `buyer_id`)
INDEX `idx_status` (`status`)
INDEX `idx_merchandise` (`merchandise_id`)
INDEX `idx_created_at` (`created_at`)

财务相关:

-- wa_money_log, wa_coupon_log等
INDEX `idx_user_type` (`user_id`, `type`)
INDEX `idx_created_at` (`created_at`)

-- wa_withdraw
INDEX `idx_user_status` (`user_id`, `status`)

10.4 复合索引说明

  • 复合索引遵循最左前缀原则
  • 查询频率高的字段放在前面
  • 区分度高的字段放在前面

十一、数据字典

11.1 枚举值说明

用户状态 (wa_users.status)

说明
0 禁用
1 启用

性别 (wa_users.sex)

说明
0
1

订单状态 (wa_order.status)

说明
0 待付款
1 已支付
2 已完成

财务变动类型 (money_log.type等)

说明
1 收入
2 支出
3 提现驳回(部分表)

提现类型 (wa_withdraw.cate)

说明
2 优惠券提现
4 推广奖金提现

提现账号类型 (wa_withdraw.account_type)

说明
1 银行卡
2 支付宝

提现状态 (wa_withdraw.status)

说明
0 待审核
1 通过
2 驳回

商品状态 (wa_goods.status)

说明
0 下架
1 上架

寄售商品状态 (wa_merchandise.status)

说明
0 已售
1 未售

十二、数据库优化建议

12.1 性能优化

  1. 合理使用索引: 为常用查询字段添加索引,但避免过多索引影响写入性能
  2. 分表策略:
    • 日志类表money_log等按月分表
    • 订单表按年分表
  3. 读写分离: 主库负责写入,从库负责查询
  4. 缓存策略:
    • 热点数据缓存到Redis
    • 商品列表、分类等查询缓存

12.2 安全建议

  1. 敏感信息加密:
    • 密码使用bcrypt加密
    • 银行卡号使用AES加密
  2. SQL注入防护: 使用参数化查询
  3. 数据备份:
    • 每天全量备份
    • 每小时增量备份

12.3 扩展性建议

  1. 预留字段: 每个表预留1-2个扩展字段
  2. 软删除: 重要数据不要物理删除使用软删除添加deleted_at字段
  3. 版本控制: 数据库表结构变更使用migration工具管理

十三、数据初始化脚本

13.1 创建数据库

CREATE DATABASE IF NOT EXISTS `uniapp_mall` 
DEFAULT CHARACTER SET utf8mb4 
DEFAULT COLLATE utf8mb4_unicode_ci;

USE `uniapp_mall`;

13.2 添加主键和索引

-- 用户表
ALTER TABLE `wa_users`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `mobile` (`mobile`),
  ADD UNIQUE KEY `invite` (`invite`),
  ADD KEY `idx_pid` (`pid`),
  ADD KEY `idx_status` (`status`);

-- 订单表
ALTER TABLE `wa_order`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `order_sn` (`order_sn`),
  ADD KEY `idx_seller_buyer` (`seller_id`, `buyer_id`),
  ADD KEY `idx_status` (`status`),
  ADD KEY `idx_merchandise` (`merchandise_id`);

-- 其他表类似...

13.3 自增ID设置

ALTER TABLE `wa_users`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

ALTER TABLE `wa_order`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

-- 其他表类似...

十四、常见查询SQL示例

14.1 用户相关查询

查询用户及其推荐人信息:

SELECT 
  u.id, u.nickname, u.mobile, 
  p.nickname AS parent_nickname
FROM wa_users u
LEFT JOIN wa_users p ON u.pid = p.id
WHERE u.id = 123;

查询用户的所有财务账户余额:

SELECT 
  id, nickname, 
  money AS 余额,
  coupon AS 优惠券,
  self_bonus AS 个人奖金,
  share_bonus AS 推广奖金
FROM wa_users 
WHERE id = 123;

查询用户的推广下线列表:

SELECT id, nickname, mobile, join_time
FROM wa_users
WHERE pid = 123
ORDER BY join_time DESC;

14.2 订单相关查询

查询用户的买家订单:

SELECT o.*, m.title AS goods_title, m.image
FROM wa_order o
LEFT JOIN wa_merchandise m ON o.merchandise_id = m.id
WHERE o.buyer_id = 123
ORDER BY o.created_at DESC;

查询用户的卖家订单:

SELECT o.*, u.nickname AS buyer_nickname
FROM wa_order o
LEFT JOIN wa_users u ON o.buyer_id = u.id
WHERE o.seller_id = 123
ORDER BY o.created_at DESC;

统计订单金额:

SELECT 
  COUNT(*) AS order_count,
  SUM(total_money) AS total_amount,
  status
FROM wa_order
WHERE buyer_id = 123
GROUP BY status;

14.3 财务相关查询

查询余额变动明细:

SELECT *
FROM wa_money_log
WHERE user_id = 123
ORDER BY created_at DESC
LIMIT 20;

统计用户收支情况:

SELECT 
  type,
  SUM(money) AS total_money,
  COUNT(*) AS count
FROM wa_money_log
WHERE user_id = 123
GROUP BY type;

查询待审核的提现申请:

SELECT w.*, u.nickname, u.mobile
FROM wa_withdraw w
LEFT JOIN wa_users u ON w.user_id = u.id
WHERE w.status = 0
ORDER BY w.created_at ASC;

14.4 商品相关查询

查询寄售商品列表(含卖家信息):

SELECT m.*, u.nickname AS seller_nickname
FROM wa_merchandise m
LEFT JOIN wa_users u ON m.user_id = u.id
WHERE m.status = 1 AND m.is_show = 1
ORDER BY m.created_at DESC;

查询用户的寄售商品:

SELECT *
FROM wa_merchandise
WHERE user_id = 123
ORDER BY created_at DESC;

十五、数据库变更记录

15.1 版本历史

版本号 日期 变更内容 变更人
V1.0 2024-12-01 初始数据库设计 产品团队
V1.1 待定 待添加的扩展功能 -

15.2 待优化项

  • 添加商品评价表
  • 添加物流信息表
  • 添加消息通知表
  • 添加积分商城相关表
  • 优化财务日志表的分表策略

文档维护: 产品团队
最后更新: 2024年12月
下次审查: 2025年1月