东营码良软件开发
  • 首页
  • 产品与服务
    抖音软件小程序开发网站建设小程序开发价格网站建设费用微信商城小程序源码交付APP定制开发建站公司选择
  • 开发案例
  • 新闻资讯
    二级菜单A
  • 关于我们
  • GEO 优化
  • Ai超市
咨询客服咨询客服
企业咨询
东营码良软件开发
首页›
产品与服务›
开发案例›
新闻资讯›
二级菜单A›
关于我们›GEO 优化›Ai超市›
会员中心
首页产品与服务开发案例新闻资讯我的
Dongying Maliang Software

码良软件开发

企业软件开发·微信小程序·网站建设·GEO 优化·AI 应用落地

咨询客服

导航

  • 首页
  • 产品与服务
  • 开发案例
  • 新闻资讯
  • 关于我们
  • GEO 优化
  • Ai超市

服务

  • 软件开发定制
  • GEO 搜索优化
  • 软件资源商城
  • 会员服务
  • 在线客服

行业方案

  • 零售门店
  • 教育培训
  • 医疗健康
  • 商务服务
  • 本地生活
  • 生产制造

联系电话

1886546092715154670927

地址

山东省东营市垦利区兴隆路8-5号

扫码

码良软件开发 · 品牌入驻
品牌入驻手机端查看商城、案例与在线咨询

Copyright © 2019-2026 东营码良软件开发 Inc. 版权所有鲁ICP备2025202136号-2
开发资讯 > 资讯详情

会员推荐关系 + 新零售商城 数据库 ER + 字段设计文档

2026-09-21 10:51:01阅读 17
广告
码良软件/小程序开发

码良软件/小程序开发

全栈技术团队 + 资深工程师开发 · 按需定制 · 源码交付 · 长期维护 · 东营本地可对接

小程序定制API接口设计bug修复升级改版软件开发企业管理系统
立即咨询 18865460927备用电话 15154670927

下面继续整理成可以直接给后端开发、数据库设计和技术评审使用的《数据库 ER + 字段设计文档》。重点把 用户、会员等级、推荐关系、升级审核、商品、SKU、购物车、地址、订单、支付、积分、转账、提现、收藏、关注、浏览记录、审计日志 统一起来,同时明确主键、唯一约束、索引和状态字段。

会员推荐关系 + 新零售商城

数据库 ER + 字段设计文档

版本: V1.0
数据库建议: MySQL 8.0+
字符集: utf8mb4
排序规则建议: utf8mb4_0900_ai_ci
主键策略: BIGINT UNSIGNED / 雪花 ID 或数据库自增 ID
金额存储: BIGINT,单位“分”
积分存储: BIGINT,整数
时间: DATETIME / TIMESTAMP,建议统一 UTC 存储
软删除: 业务数据按需增加 deleted_at


1. 数据库总体设计

系统按业务域拆分:

数据库
│
├── 用户域
│   ├── users
│   ├── user_profiles
│   ├── user_identities
│   └── user_bank_accounts
│
├── 会员域
│   ├── member_levels
│   ├── members
│   ├── member_relations
│   ├── member_upgrade_requests
│   └── member_upgrade_logs
│
├── 商城域
│   ├── categories
│   ├── zones
│   ├── products
│   ├── product_skus
│   ├── product_images
│   ├── carts
│   └── cart_items
│
├── 交易域
│   ├── addresses
│   ├── orders
│   ├── order_items
│   ├── payments
│   └── order_logs
│
├── 资产域
│   ├── point_accounts
│   ├── point_transactions
│   ├── point_transfers
│   ├── withdrawal_requests
│   └── withdrawal_logs
│
├── 用户行为域
│   ├── favorites
│   ├── follows
│   └── browsing_histories
│
└── 系统域
    ├── announcements
    ├── service_configs
    └── audit_logs

2. ER 总体关系

核心关系:

                        ┌──────────────┐
                        │    users     │
                        │ 用户主表     │
                        └──────┬───────┘
                               │
             ┌─────────────────┼──────────────────┐
             │                 │                  │
             ▼                 ▼                  ▼
    ┌────────────────┐  ┌───────────────┐  ┌──────────────┐
    │ user_profiles  │  │    members    │  │ point_accounts│
    │ 用户资料       │  │ 会员          │  │ 积分账户     │
    └────────────────┘  └───────┬───────┘  └──────┬───────┘
                                 │                 │
                    ┌────────────┼───────┐         │
                    │            │       │         │
                    ▼            ▼       ▼         ▼
             member_levels   relations  upgrade  transactions
                                      requests
                    │
                    ▼
             upgrade_logs

users
  │
  ├─────────────── addresses
  │
  ├─────────────── orders
  │                    │
  │                    ├──── order_items
  │                    └──── payments
  │
  ├─────────────── carts
  │                    │
  │                    └──── cart_items
  │
  ├─────────────── favorites ───── products
  ├─────────────── follows
  └─────────────── browsing_histories ───── products

products
   │
   ├──── categories
   ├──── zones
   ├──── product_images
   └──── product_skus

point_accounts
   │
   ├──── point_transactions
   └──── point_transfers

users
   ├──── user_identities
   ├──── user_bank_accounts
   └──── withdrawal_requests

3. 核心设计原则

3.1 用户与会员分离

不要把所有会员字段全部塞进 users。

推荐:

users
    ↓
members
    ↓
member_levels

原因:

用户身份:

登录、手机号、密码、状态

会员身份:

会员等级、会员状态、升级

属于不同业务域。


4. users 用户主表

表名:

users

用途:

保存系统所有用户的基础身份。

字段类型NULL默认值说明
idBIGINT UNSIGNED否-用户 ID,PK
mobileVARCHAR(20)否-手机号
password_hashVARCHAR(255)否-密码哈希
statusTINYINT否1账号状态
last_login_atDATETIME是NULL最近登录时间
last_login_ipVARCHAR(45)是NULL最近登录 IP
created_atDATETIME否CURRENT创建时间
updated_atDATETIME否CURRENT更新时间
deleted_atDATETIME是NULL软删除

status

0 = 禁用
1 = 正常
2 = 锁定

索引

PRIMARY KEY (id)

UNIQUE KEY uk_mobile (mobile)

KEY idx_status_created (status, created_at)

5. user_profiles 用户资料表

表名:

user_profiles

用途:

保存非认证型资料。

字段类型说明
idBIGINTPK
user_idBIGINT用户 ID
real_nameVARCHAR(50)姓名
nicknameVARCHAR(50)昵称
avatar_urlVARCHAR(500)头像
wechatVARCHAR(100)微信号
created_atDATETIME创建时间
updated_atDATETIME更新时间

约束:

UNIQUE KEY uk_user (user_id)

6. user_identities 实名信息表

表名:

user_identities

用途:

管理实名资料。

字段类型说明
idBIGINTPK
user_idBIGINT用户
real_nameVARCHAR(100)实名姓名
id_card_no_encryptedVARBINARY / TEXT加密身份证号
id_card_last4CHAR(4)后四位
statusTINYINT认证状态
verified_atDATETIME认证时间
created_atDATETIME创建时间
updated_atDATETIME更新时间

状态:

0 = 未认证
1 = 审核中
2 = 已认证
3 = 认证失败

安全

身份证号不得明文存储。

推荐:

原始值 → 应用层加密 → 数据库存储

7. user_bank_accounts 银行账户表

表名:

user_bank_accounts

用途:

提现银行卡资料。

字段类型说明
idBIGINTPK
user_idBIGINT用户
bank_nameVARCHAR(100)银行名称
card_no_encryptedVARBINARY / TEXT加密银行卡号
card_last4CHAR(4)尾号
holder_nameVARCHAR(100)持卡人
statusTINYINT状态
is_defaultTINYINT默认银行卡
created_atDATETIME创建时间
updated_atDATETIME更新时间

约束:

KEY idx_user_status (user_id, status)

银行卡号不得明文返回接口。


8. member_levels 会员等级表

表名:

member_levels

用途:

定义会员等级。

字段类型说明
idBIGINTPK
nameVARCHAR(50)等级名称
codeVARCHAR(50)等级编码
sortINT等级顺序
descriptionTEXT等级说明
upgrade_enabledTINYINT是否允许升级
statusTINYINT状态
created_atDATETIME创建时间
updated_atDATETIME更新时间

例如:

1 一星会员
2 二星会员
3 三星会员

约束:

UNIQUE KEY uk_code (code)
UNIQUE KEY uk_sort (sort)

9. members 会员表

表名:

members

用途:

记录用户当前会员身份。

字段类型说明
idBIGINTPK
user_idBIGINT用户
level_idBIGINT当前等级
statusTINYINT会员状态
joined_atDATETIME成为会员时间
upgraded_atDATETIME最近升级时间
created_atDATETIME创建时间
updated_atDATETIME更新时间

约束:

UNIQUE KEY uk_user (user_id)
KEY idx_level (level_id)

10. member_relations 推荐关系表

表名:

member_relations

这是整个推荐体系的核心表。

字段类型说明
idBIGINTPK
parent_user_idBIGINT推荐人
child_user_idBIGINT被推荐人
relation_levelINT推荐层级
statusTINYINT状态
created_atDATETIME建立时间

例如:

A 推荐 B

记录:

parent_user_id = A
child_user_id = B
relation_level = 1

如果未来支持多层团队:

A → B → C

可以产生:

A → B level 1
B → C level 1
A → C level 2

约束

UNIQUE KEY uk_parent_child (parent_user_id, child_user_id)

KEY idx_parent_level (
    parent_user_id,
    relation_level,
    status
)

KEY idx_child (
    child_user_id
)

禁止:

parent_user_id = child_user_id

11. 推荐关系为什么不建议直接放 users.referrer_id

简单系统可以:

users.referrer_id

但本项目未来存在:

团队
多层级
统计
团队人数
关系查询

因此建议使用独立关系表。

如果为了查询效率,也可以在 users 增加:

direct_referrer_id

作为冗余字段。

但:

users.direct_referrer_id

和:

member_relations

必须由服务端事务保持一致。


12. member_upgrade_requests 升级申请表

表名:

member_upgrade_requests
字段类型说明
idBIGINTPK
request_noVARCHAR(50)申请单号
user_idBIGINT申请用户
from_level_idBIGINT当前等级
to_level_idBIGINT申请等级
statusVARCHAR(30)状态
applicant_remarkTEXT申请说明
reviewer_idBIGINT审核人
reviewer_remarkTEXT审核说明
created_atDATETIME申请时间
reviewed_atDATETIME审核时间
updated_atDATETIME更新时间

状态:

pending
approved
rejected
cancelled

约束

同一个用户不能同时存在两个 pending。

实现方式:

可以通过应用层 + 唯一约束设计。

例如增加:

pending_flag

然后建立:

UNIQUE(user_id, pending_flag)

其中只有待审核状态使用固定值。


13. member_upgrade_logs 审核日志表

表名:

member_upgrade_logs

用途:

记录升级状态历史。

字段类型说明
idBIGINTPK
request_idBIGINT升级申请
operator_idBIGINT操作人
actionVARCHAR(30)操作
from_statusVARCHAR(30)原状态
to_statusVARCHAR(30)新状态
remarkTEXT说明
ipVARCHAR(45)IP
user_agentVARCHAR(500)UA
created_atDATETIME时间

例如:

pending → approved

记录:

operator_id
from_status = pending
to_status = approved
action = approve

14. categories 商品分类表

表名:

categories
字段类型说明
idBIGINTPK
parent_idBIGINT上级分类
nameVARCHAR(100)名称
iconVARCHAR(500)图标
sortINT排序
statusTINYINT状态
created_atDATETIME创建时间
updated_atDATETIME更新时间

支持:

一级分类
└── 二级分类

索引:

KEY idx_parent_status (parent_id, status)

15. zones 商品专区表

表名:

zones

用途:

新品、热销、专题等运营专区。

字段类型说明
idBIGINTPK
nameVARCHAR(100)专区名称
coverVARCHAR(500)封面
descriptionTEXT描述
sortINT排序
statusTINYINT状态
start_atDATETIME开始时间
end_atDATETIME结束时间
created_atDATETIME创建时间
updated_atDATETIME更新时间

16. zone_products 专区商品关联表

表名:

zone_products

因为一个商品可以属于多个专区,所以建立中间表。

字段类型说明
idBIGINTPK
zone_idBIGINT专区
product_idBIGINT商品
sortINT排序
created_atDATETIME创建时间

约束:

UNIQUE(zone_id, product_id)

17. products 商品主表

表名:

products
字段类型说明
idBIGINTPK
category_idBIGINT分类
nameVARCHAR(255)商品名称
subtitleVARCHAR(255)副标题
cover_urlVARCHAR(500)主图
descriptionLONGTEXT商品详情
price_centBIGINT基础价格,分
original_price_centBIGINT原价,分
stockBIGINT总库存
sales_countBIGINT销量
statusTINYINT上下架
sortINT排序
created_atDATETIME创建时间
updated_atDATETIME更新时间

状态:

0 = 下架
1 = 上架
2 = 草稿

18. product_skus 商品 SKU 表

表名:

product_skus
字段类型说明
idBIGINTPK
product_idBIGINT商品
sku_codeVARCHAR(100)SKU 编码
nameVARCHAR(255)SKU 名称
spec_jsonJSON规格
price_centBIGINTSKU 售价
original_price_centBIGINTSKU 原价
stockBIGINT库存
locked_stockBIGINT锁定库存
statusTINYINT状态
created_atDATETIME创建时间
updated_atDATETIME更新时间

库存设计:

可售库存 = stock - locked_stock

也可以直接使用:

available_stock

但二者不要重复维护,避免数据不一致。


19. product_images 商品图片表

表名:

product_images
字段类型说明
idBIGINTPK
product_idBIGINT商品
urlVARCHAR(500)图片
typeVARCHAR(30)类型
sortINT排序
created_atDATETIME创建时间

类型:

cover
gallery
detail

20. carts 购物车主表

表名:

carts

如果每个用户只有一个购物车,可以非常简单:

字段类型说明
idBIGINTPK
user_idBIGINT用户
created_atDATETIME创建时间
updated_atDATETIME更新时间

约束:

UNIQUE(user_id)

21. cart_items 购物车商品表

表名:

cart_items
字段类型说明
idBIGINTPK
cart_idBIGINT购物车
product_idBIGINT商品
sku_idBIGINTSKU
quantityINT数量
created_atDATETIME创建时间
updated_atDATETIME更新时间

约束:

UNIQUE(cart_id, sku_id)

加入同一 SKU 时:

quantity += new_quantity

而不是产生重复购物车记录。


22. addresses 收货地址表

表名:

addresses
字段类型说明
idBIGINTPK
user_idBIGINT用户
receiverVARCHAR(50)收货人
mobileVARCHAR(20)手机
provinceVARCHAR(50)省
cityVARCHAR(50)市
districtVARCHAR(50)区
detailVARCHAR(255)详细地址
is_defaultTINYINT默认
created_atDATETIME创建
updated_atDATETIME更新

索引:

KEY idx_user_default (user_id, is_default)

建议保证每个用户最多一个默认地址。


23. orders 订单主表

表名:

orders

这是商城交易核心表。

字段类型说明
idBIGINTPK
order_noVARCHAR(50)订单号
user_idBIGINT用户
statusVARCHAR(30)订单状态
product_amount_centBIGINT商品金额
discount_amount_centBIGINT优惠金额
freight_amount_centBIGINT运费
points_discount_centBIGINT积分抵扣金额
payable_amount_centBIGINT应付金额
paid_amount_centBIGINT实付金额
used_pointsBIGINT使用积分
receiver_snapshotJSON收货地址快照
remarkVARCHAR(500)备注
created_atDATETIME创建
paid_atDATETIME支付
shipped_atDATETIME发货
completed_atDATETIME完成
cancelled_atDATETIME取消
updated_atDATETIME更新

订单状态

pending_payment
pending_shipment
shipped
completed
cancelled
refund

可以根据实际业务增加:

refunding
refunded

订单号

UNIQUE(order_no)

24. 为什么订单必须保存快照

订单不能只存:

product_id

因为之后商品可能:

改名
改价
下架
删除
修改规格

所以订单商品必须保存:

商品名称
SKU 名称
价格
规格
图片

25. order_items 订单商品表

表名:

order_items
字段类型说明
idBIGINTPK
order_idBIGINT订单
product_idBIGINT原商品 ID
sku_idBIGINT原 SKU ID
product_nameVARCHAR(255)商品名称快照
sku_nameVARCHAR(255)SKU 快照
sku_spec_jsonJSON规格快照
cover_urlVARCHAR(500)图片快照
price_centBIGINT成交单价
quantityINT数量
subtotal_centBIGINT小计
created_atDATETIME创建时间

索引:

KEY idx_order (order_id)

26. payments 支付表

表名:

payments
字段类型说明
idBIGINTPK
payment_noVARCHAR(50)支付单号
order_idBIGINT订单
user_idBIGINT用户
providerVARCHAR(30)支付渠道
methodVARCHAR(30)支付方式
amount_centBIGINT支付金额
statusVARCHAR(30)支付状态
provider_trade_noVARCHAR(100)第三方交易号
paid_atDATETIME支付时间
callback_atDATETIME回调时间
created_atDATETIME创建时间
updated_atDATETIME更新时间

状态:

pending
paid
failed
cancelled
refunded

约束:

UNIQUE(payment_no)
KEY idx_order_status(order_id, status)
UNIQUE(provider, provider_trade_no)

第三方交易号需要允许 NULL。


27. order_logs 订单状态日志

表名:

order_logs
字段类型说明
idBIGINTPK
order_idBIGINT订单
operator_typeVARCHAR(30)操作主体
operator_idBIGINT操作人
actionVARCHAR(50)动作
from_statusVARCHAR(30)原状态
to_statusVARCHAR(30)新状态
remarkTEXT说明
created_atDATETIME时间

operator_type:

user
admin
system
payment
merchant

28. point_accounts 积分账户表

表名:

point_accounts
字段类型说明
idBIGINTPK
user_idBIGINT用户
available_pointsBIGINT可用积分
frozen_pointsBIGINT冻结积分
versionBIGINT乐观锁版本
updated_atDATETIME更新时间
created_atDATETIME创建

约束:

UNIQUE(user_id)

29. point_transactions 积分流水表

表名:

point_transactions

这是积分系统最重要的账本表。

字段类型说明
idBIGINTPK
transaction_noVARCHAR(50)流水号
user_idBIGINT用户
typeVARCHAR(30)类型
amountBIGINT变动积分
balance_beforeBIGINT变动前
balance_afterBIGINT变动后
reference_typeVARCHAR(50)业务类型
reference_idBIGINT业务 ID
remarkVARCHAR(500)备注
created_atDATETIME创建时间

类型:

recharge
reward
transfer_in
transfer_out
order_use
withdraw
freeze
unfreeze
adjustment

约束:

UNIQUE(transaction_no)

建议增加:

UNIQUE(reference_type, reference_id, user_id, type)

但具体唯一规则需要根据业务场景调整。


30. point_transfers 积分转账记录

表名:

point_transfers

用于记录一次完整的 A → B 转账。

字段类型说明
idBIGINTPK
transfer_noVARCHAR(50)转账单号
sender_user_idBIGINT转出用户
receiver_user_idBIGINT接收用户
pointsBIGINT转账积分
statusVARCHAR(30)状态
sender_transaction_idBIGINT转出流水
receiver_transaction_idBIGINT转入流水
created_atDATETIME创建
completed_atDATETIME完成

状态:

pending
completed
failed
cancelled

约束:

UNIQUE(transfer_no)

31. 积分转账数据库事务

完整转账:

BEGIN

锁定发送者 point_accounts
↓
锁定接收者 point_accounts
↓
检查发送方余额
↓
扣减发送方
↓
增加接收方
↓
写 sender point_transaction
↓
写 receiver point_transaction
↓
更新 point_transfer
↓
COMMIT

不能只:

UPDATE point_accounts

而不生成流水。


32. withdrawal_requests 提现申请表

表名:

withdrawal_requests
字段类型说明
idBIGINTPK
withdrawal_noVARCHAR(50)提现单号
user_idBIGINT用户
pointsBIGINT提现积分
amount_centBIGINT提现金额
bank_account_idBIGINT银行账户
statusVARCHAR(30)状态
reviewer_idBIGINT审核人
reviewer_remarkTEXT审核备注
paid_atDATETIME打款时间
created_atDATETIME创建
updated_atDATETIME更新

状态:

pending
reviewing
approved
rejected
paid
cancelled

33. 提现银行卡快照

提现不能只依赖:

bank_account_id

因为用户后续可能修改银行卡。

建议同时保存:

bank_name_snapshot
holder_name_snapshot
card_last4_snapshot

例如:

字段类型
bank_name_snapshotVARCHAR(100)
holder_name_snapshotVARCHAR(100)
card_last4_snapshotCHAR(4)

这样历史提现记录仍然能够保持当时状态。


34. withdrawal_logs 提现状态日志

表名:

withdrawal_logs
字段类型说明
idBIGINTPK
withdrawal_idBIGINT提现单
operator_idBIGINT操作人
actionVARCHAR(50)操作
from_statusVARCHAR(30)原状态
to_statusVARCHAR(30)新状态
remarkTEXT说明
created_atDATETIME时间

35. favorites 收藏表

表名:

favorites
字段类型说明
idBIGINTPK
user_idBIGINT用户
product_idBIGINT商品
created_atDATETIME收藏时间

约束:

UNIQUE(user_id, product_id)

防止重复收藏。


36. follows 关注表

表名:

follows

因为当前系统无法完全确认“关注”的具体业务对象,因此设计为通用结构。

字段类型说明
idBIGINTPK
user_idBIGINT用户
target_typeVARCHAR(30)对象类型
target_idBIGINT对象 ID
created_atDATETIME时间

例如:

shop
brand
product
zone

约束:

UNIQUE(user_id, target_type, target_id)

37. browsing_histories 浏览记录表

表名:

browsing_histories
字段类型说明
idBIGINTPK
user_idBIGINT用户
product_idBIGINT商品
browse_countINT浏览次数
first_browsed_atDATETIME首次时间
last_browsed_atDATETIME最近时间

约束:

UNIQUE(user_id, product_id)

每次浏览:

browse_count += 1
last_browsed_at = NOW()

不需要每次都新增一条完全重复记录。


38. announcements 公告表

表名:

announcements
字段类型说明
idBIGINTPK
titleVARCHAR(255)标题
contentLONGTEXT内容
is_topTINYINT置顶
statusTINYINT状态
start_atDATETIME开始
end_atDATETIME结束
created_atDATETIME创建
updated_atDATETIME更新

39. audit_logs 审计日志表

表名:

audit_logs

整个系统的统一操作审计表。

字段类型说明
idBIGINTPK
user_idBIGINT操作用户
actionVARCHAR(100)操作
resource_typeVARCHAR(50)资源类型
resource_idBIGINT资源 ID
request_idVARCHAR(100)请求 ID
methodVARCHAR(20)HTTP 方法
pathVARCHAR(500)接口
ipVARCHAR(45)IP
user_agentVARCHAR(500)UA
resultVARCHAR(30)结果
detail_jsonJSON详情
created_atDATETIME时间

敏感数据不要直接写进 detail_json。


40. 服务配置表

表名:

service_configs
字段类型说明
idBIGINTPK
config_keyVARCHAR(100)配置键
config_valueTEXT配置值
descriptionVARCHAR(255)说明
statusTINYINT状态
updated_atDATETIME更新时间

例如:

points.exchange_rate = 100
withdraw.enabled = 1
mall.enabled = 1

敏感密钥不能放在该表以明文保存。


41. 关键 ER 关系

用户与会员

users 1 ───── 1 members

members N ───── 1 member_levels

推荐关系

users 1 ───── N member_relations
users 1 ───── N member_relations

逻辑上:

parent_user_id → child_user_id

升级

users 1 ───── N member_upgrade_requests

member_upgrade_requests
       │
       ├── from_level_id → member_levels
       ├── to_level_id   → member_levels
       └── 1 ───── N member_upgrade_logs

商品

categories 1 ───── N products

products 1 ───── N product_skus
products 1 ───── N product_images

zones N ───── N products
       ↓
zone_products

购物车

users 1 ───── 1 carts

carts 1 ───── N cart_items

cart_items N ───── 1 product_skus

订单

users 1 ───── N orders

orders 1 ───── N order_items

orders 1 ───── N payments

orders 1 ───── N order_logs

积分

users 1 ───── 1 point_accounts

point_accounts 1 ───── N point_transactions

users
 └──── N point_transfers
       ├── sender_user_id
       └── receiver_user_id

提现

users 1 ───── N withdrawal_requests

withdrawal_requests N ───── 1 user_bank_accounts

withdrawal_requests 1 ───── N withdrawal_logs

42. 数据库核心索引汇总

重点索引:

users
├── uk_mobile
└── idx_status_created

members
├── uk_user
└── idx_level

member_relations
├── uk_parent_child
├── idx_parent_level
└── idx_child

member_upgrade_requests
├── uk_request_no
├── idx_user_status
└── idx_reviewer_status

products
├── idx_category_status
├── idx_status_sort
└── idx_created

product_skus
├── uk_sku_code
└── idx_product_status

cart_items
└── uk_cart_sku

addresses
└── idx_user_default

orders
├── uk_order_no
├── idx_user_status_created
└── idx_status_created

order_items
└── idx_order

payments
├── uk_payment_no
├── idx_order_status
└── uk_provider_trade_no

point_transactions
├── uk_transaction_no
├── idx_user_created
└── idx_reference

point_transfers
├── uk_transfer_no
├── idx_sender_created
└── idx_receiver_created

withdrawal_requests
├── uk_withdrawal_no
├── idx_user_status
└── idx_status_created

favorites
└── uk_user_product

follows
└── uk_user_target

browsing_histories
└── uk_user_product

43. 外键策略

生产环境建议根据业务和数据量决定是否使用数据库 Foreign Key。

逻辑关系必须保证:

users.id
↓
members.user_id
↓
orders.user_id
↓
point_accounts.user_id

但对于高并发、大规模商城:

可以采用:

数据库索引
+
应用层完整性检查
+
事务

而不是依赖大量 FK。

无论是否使用 FK,应用层都必须验证数据归属。


44. 删除策略

核心业务数据不建议物理删除。

例如:

订单
支付
积分流水
提现
升级申请
审计日志

不能直接:

DELETE

推荐:

status
deleted_at

或者永久保留。


45. 用户注销策略

用户注销后:

users.status = disabled

而不是删除整个用户。

因为用户可能仍然存在:

订单
积分流水
提现
推荐关系
审计记录

46. 会员升级事务

用户提交申请:

BEGIN

查询 members FOR UPDATE
↓
查询是否已有 pending
↓
读取当前等级
↓
读取下一等级
↓
检查业务条件
↓
INSERT member_upgrade_requests
↓
COMMIT

审核通过:

BEGIN

查询 upgrade_request FOR UPDATE
↓
检查 status = pending
↓
检查审核人权限
↓
检查申请人关系
↓
查询 member FOR UPDATE
↓
再次验证当前等级
↓
修改 members.level_id
↓
更新 upgrade_request
↓
INSERT member_upgrade_logs
↓
INSERT audit_logs
↓
COMMIT

47. 订单创建事务

BEGIN

锁定 SKU
↓
检查商品状态
↓
检查库存
↓
重新计算商品价格
↓
重新计算优惠
↓
重新计算积分
↓
重新计算运费
↓
创建订单
↓
创建 order_items
↓
锁定库存
↓
清理购物车
↓
写 order_logs
↓
COMMIT

注意:

不能以浏览器提交的总金额作为订单金额依据。


48. 订单支付完成事务

支付回调:

BEGIN

验证第三方签名
↓
查询 payments FOR UPDATE
↓
幂等检查
↓
核对订单
↓
核对支付金额
↓
更新 payment
↓
更新 order
↓
记录 order_logs
↓
COMMIT

49. 积分抵扣规则

现有系统页面显示:

100 积分 = 1 元

建议数据库配置:

points_to_cent = 100

例如:

100积分 → 100分人民币
500积分 → 500分人民币

但最终允许抵扣多少,还需要配置:

订单商品
最大抵扣比例
商品是否允许积分抵扣
用户当前积分

因此建议商品或系统配置增加:

points_discount_enabled
points_discount_rate

50. 积分与订单的关系

订单应保存:

used_points
points_discount_cent

例如:

商品金额:10000分
使用积分:500
积分抵扣:500分
实际支付:9500分

同时生成:

point_transactions
type = order_use
reference_type = order
reference_id = order_id

51. 提现业务模型

如果业务规则确实是:

积分 → 可提现

那么建议不要简单把积分余额直接改成“钱”。

明确划分:

point_accounts
    ↓
积分
    ↓
提现申请
    ↓
withdrawal_requests
    ↓
财务处理

这样可以避免:

购物抵扣积分
转账积分
可提现积分

三个概念混为一谈。

如果实际上存在“现金余额”和“积分余额”两种资产,则应进一步拆成:

asset_accounts
asset_transactions

不要继续共用一个 point_accounts。


52. 会员等级数据口径

目前前端检查发现:

会员平台:一星会员

商城个人中心:普通会员

数据库设计上必须避免两套等级字段。

错误:

users.member_level = 1
mall_users.level = normal
members.level_id = 1

推荐:

members.level_id

作为唯一会员等级来源。

商城只读取:

members.level_id

通过服务层统一转换为展示名称。


53. 推荐关系数据口径

同样不要出现:

users.referrer_id
team.parent_id
member.parent_id

多个地方分别保存一份关系。

推荐关系唯一来源:

member_relations

如有缓存字段:

users.direct_referrer_id

只能作为冗余查询字段。


54. 商城商品数据口径

价格唯一来源:

product_skus.price_cent

订单创建后:

order_items.price_cent

作为历史成交价格快照。

即:

实时商品价格
      ↓
product_skus

历史订单价格
      ↓
order_items

不能反过来读取当前商品价格显示历史订单。


55. 订单状态机

                 ┌───────────────┐
                 │ pending_payment│
                 └───────┬───────┘
                         │ 支付
                         ▼
                 ┌───────────────┐
                 │pending_shipment│
                 └───────┬───────┘
                         │ 发货
                         ▼
                    ┌─────────┐
                    │ shipped │
                    └────┬────┘
                         │ 收货
                         ▼
                    ┌─────────┐
                    │completed│
                    └─────────┘

pending_payment
       │
       └──── 取消 → cancelled

非法状态转换必须拒绝。


56. 会员升级状态机

pending
   │
   ├── approve → approved
   │
   └── reject  → rejected

要求:

approved → 不允许再次审核
rejected → 不允许再次审核

57. 提现状态机

pending
   ↓
reviewing
   ├── rejected
   │
   └── approved
          ↓
         paid

状态不能由客户端直接指定。

错误:

{
  "status": "paid"
}

正确:

提交申请 → pending
审核 → approved
财务打款 → paid

58. 数据库事务隔离

涉及:

订单库存
积分
提现
会员升级

建议至少考虑:

REPEATABLE READ

并结合:

SELECT ... FOR UPDATE

或乐观锁:

version

具体选型由并发量和现有架构决定。


59. 并发控制

积分

使用:

行锁
或
version 乐观锁

库存

使用:

available_stock

更新:

UPDATE product_skus
SET stock = stock - ?
WHERE id = ?
  AND stock >= ?

通过受影响行数判断库存是否足够。

重复订单提交

使用:

Idempotency-Key

60. 敏感字段存储原则

以下字段建议应用层加密:

身份证号
银行卡号

以下字段数据库中可直接保存,但接口需要脱敏:

手机号
微信号
姓名

数据库日志不能出现:

password
token
完整身份证
完整银行卡

61. 数据备份

至少包含:

users
members
member_relations
member_upgrade_requests
products
product_skus
orders
order_items
payments
point_accounts
point_transactions
point_transfers
withdrawal_requests
audit_logs

重点业务表需要:

每日备份
增量备份
异地备份
恢复演练

62. 推荐数据库分库边界

V1 不建议一开始就物理分库。

推荐逻辑分域:

user
member
mall
order
asset
system

数据库仍可以先:

一个 MySQL

通过表前缀/代码模块区分:

users
members
products
orders
point_accounts

后期数据量上升再考虑:

读写分离
分库
分表
缓存
消息队列

63. 推荐缓存

可以缓存:

member_levels
categories
zones
product detail
service_configs
announcements

不建议直接缓存作为最终数据源:

积分余额
订单状态
提现状态
会员等级
支付状态

这些必须最终以数据库为准。


64. 推荐 Redis 数据

例如:

session:{user_id}

login:fail:{mobile}

rate_limit:login:{ip}

product:{id}

category:list

member:level:{id}

积分余额如果做缓存,必须有严谨的一致性方案,不建议 V1 直接引入复杂缓存账本。


65. 数据字典

用户状态

0 disabled
1 active
2 locked

会员状态

0 disabled
1 active

升级状态

pending
approved
rejected
cancelled

商品状态

draft
on_sale
off_sale

订单状态

pending_payment
pending_shipment
shipped
completed
cancelled
refund

支付状态

pending
paid
failed
cancelled
refunded

提现状态

pending
reviewing
approved
rejected
paid
cancelled

66. 推荐数据库命名规范

表名:

snake_case

例如:

member_upgrade_requests

主键:

id

外键:

user_id
product_id
order_id

时间:

created_at
updated_at

状态:

status

金额:

xxx_amount_cent

数量:

quantity

积分:

points

67. 不建议的数据设计

不建议 1:订单直接保存商品名称 ID

错误:

orders.product_id

因为一个订单可能包含多个商品。

应该:

orders
    ↓
order_items

不建议 2:积分只保存一个余额

错误:

users.points

推荐:

point_accounts
point_transactions

不建议 3:提现直接修改积分

必须产生:

withdrawal_request
+
point_transaction

并且考虑冻结。


不建议 4:会员等级存在多个表

只允许:

members.level_id

作为权威数据。


不建议 5:前端传价格直接入库

错误:

{
  "price": 99,
  "total": 198
}

服务端必须自己计算。


68. 推荐完整 ER 图

users
│
├── 1:1 ── user_profiles
├── 1:1 ── user_identities
├── 1:N ── user_bank_accounts
├── 1:1 ── members
│           │
│           └── N:1 ── member_levels
│
├── 1:N ── member_relations
│           ├── parent_user_id
│           └── child_user_id
│
├── 1:N ── member_upgrade_requests
│           │
│           ├── from_level_id
│           ├── to_level_id
│           └── 1:N member_upgrade_logs
│
├── 1:1 ── carts
│           └── 1:N cart_items
│
├── 1:N ── addresses
│
├── 1:N ── orders
│           ├── 1:N order_items
│           ├── 1:N payments
│           └── 1:N order_logs
│
├── 1:1 ── point_accounts
│           └── 1:N point_transactions
│
├── 1:N ── point_transfers
│
├── 1:N ── withdrawal_requests
│           └── 1:N withdrawal_logs
│
├── 1:N ── favorites ── N:1 products
├── 1:N ── follows
└── 1:N ── browsing_histories ── N:1 products

categories
└── 1:N products
          ├── 1:N product_skus
          ├── 1:N product_images
          └── N:N zones
                  │
                  └── zone_products

69. V1 核心表清单

第一阶段数据库至少建立:

users
user_profiles
members
member_levels
member_relations

member_upgrade_requests
member_upgrade_logs

categories
products
product_skus

carts
cart_items

addresses

orders
order_items
payments
order_logs

point_accounts
point_transactions
point_transfers

withdrawal_requests
withdrawal_logs

user_identities
user_bank_accounts

favorites
follows
browsing_histories

audit_logs
announcements

70. 数据库开发优先级

P0:身份与会员

users
user_profiles
members
member_levels
member_relations
member_upgrade_requests
member_upgrade_logs

P1:商城交易

categories
products
product_skus
carts
cart_items
addresses
orders
order_items
payments
order_logs

P1:资产

point_accounts
point_transactions
point_transfers
withdrawal_requests
withdrawal_logs

P2:账户扩展

user_identities
user_bank_accounts
favorites
follows
browsing_histories

P2:系统

announcements
audit_logs
service_configs

71. 第一阶段数据库必须重点测试

用户

重复手机号
禁用用户
软删除用户
登录 Session

推荐

自己推荐自己
重复推荐
循环推荐
不存在推荐人
禁用推荐人

会员升级

跨级升级
重复申请
重复审核
越权审核
并发审核
审核后再次操作

商品

库存不足
SKU 下架
商品下架
SKU 并发扣库存

订单

重复创建
价格改变
库存改变
支付重复回调
订单越权
订单状态非法转换

积分

余额不足
重复转账
并发转账
负数积分
自己转给自己

提现

资料不完整
余额不足
重复提交
重复审核
并发提现
修改银行卡后的历史提现

72. 最终数据库架构原则

系统最终必须保持以下几个“唯一数据源”:

用户身份
→ users

会员等级
→ members.level_id

会员等级定义
→ member_levels

推荐关系
→ member_relations

商品实时价格
→ product_skus.price_cent

订单历史价格
→ order_items.price_cent

订单状态
→ orders.status

支付状态
→ payments.status

积分余额
→ point_accounts

积分历史
→ point_transactions

提现状态
→ withdrawal_requests

系统操作记录
→ audit_logs

避免同一事实在多个表中独立维护。


73. 数据一致性优先级

数据一致性优先于页面显示。

例如:

前端显示余额 = 1000
数据库余额 = 800

最终必须以数据库账本为准。

同样:

前端显示订单已支付
数据库订单未支付

应以支付回调验证后的服务端状态为准。


74. 推荐后续开发文档链路

数据库设计完成后,建议形成完整的技术文档链:

01 产品需求文档
        ↓
02 页面 / 原型文档
        ↓
03 API 接口文档
        ↓
04 数据库 ER + 字段设计
        ↓
05 权限设计
        ↓
06 状态机设计
        ↓
07 测试用例
        ↓
08 部署 / 运维文档

最终前后端开发人员可以按照:

页面
 ↓
API
 ↓
Service
 ↓
数据库

一条链路进行开发。


75. V1 数据库最终推荐架构

                  ┌───────────────┐
                  │     users     │
                  └───────┬───────┘
                          │
         ┌────────────────┼─────────────────┐
         │                │                 │
         ▼                ▼                 ▼
     会员域             商城域            资产域
         │                │                 │
   ┌─────┼─────┐     ┌────┼─────┐      ┌────┼─────┐
   │     │     │     │    │     │      │    │     │
 levels members relation products cart order points withdraw
   │              │       │       │      │    │     │
   │              │       SKU     │      │    │     │
   │              │               │      │    │     │
 upgrade          │              items   │ transaction
 request/logs     │                      │ transfer
                  │                      │
                team                    payment
                                         │
                                       logs

                         ┌───────────────┐
                         │    system     │
                         ├───────────────┤
                         │ announcements │
                         │ audit_logs    │
                         │ config        │
                         └───────────────┘

这套结构能够覆盖当前已检查出的会员推荐、等级升级、审核、团队、商城、订单、积分、转账、提现和用户资料功能,同时给后续后台管理、商家体系、多层团队和财务审核预留扩展空间。

现在三份文档已经形成一条完整开发链:

① 页面/原型 → ② API → ③ 数据库 ER/字段。

下一步最有价值的是把这三份继续整合成一份 《完整软件开发需求规格书 PRD》,然后再往下拆成 前端任务清单、后端任务清单、数据库建表 SQL、测试用例,开发团队就可以直接按 Sprint 开始执行。

DISCUSSION

评论

登录后参与
请使用网站前台用户账号登录后发表评论。

正在加载评论...


返回列表返回资讯列表

作者信息

超级管理
超级管理
等级作者
155文章
0点赞
0收藏
查看作者其他文章
广告🧩

软件定制 · 企业级项目 8 折起

10 年经验团队,按需定制 CRM、ERP、小程序,合同保障。

DDevStudio查看案例 →

文章展示

公众号排版助手上线|Markdown一键排版,直推草稿箱 - 东营码良软件开发资讯公众号排版助手上线|Markdown一键排版,直推草稿箱小程序UI设计有哪些风格?8种主流界面风格与5类导航图标设计指南 - 东营码良软件开发资讯小程序UI设计有哪些风格?8种主流界面风格与5类导航图标设计指南项目逆向研发|科研 - 东营码良软件开发资讯项目逆向研发|科研破甲软件下载 - 东营码良软件开发资讯破甲软件下载一个小项目养活一家人|纯干货无偿分享 - 东营码良软件开发资讯一个小项目养活一家人|纯干货无偿分享

热门排行

如何开通微信虚拟支付功能? - 东营码良软件开发资讯1如何开通微信虚拟支付功能?278 阅读东营网站开发哪家专业?选东营码良软件开发定制建站 - 东营码良软件开发资讯2东营网站开发哪家专业?选东营码良软件开发定制建站198 阅读如何在微信小程序中接入虚拟支付功能? - 东营码良软件开发资讯3如何在微信小程序中接入虚拟支付功能?156 阅读一个小项目养活一家人|纯干货无偿分享 - 东营码良软件开发资讯4一个小项目养活一家人|纯干货无偿分享129 阅读虚拟商品类小程序全类型汇总(2026微信合规版) - 东营码良软件开发资讯5虚拟商品类小程序全类型汇总(2026微信合规版)109 阅读会员权益/订阅付费类小程序 微信虚拟支付完整接入教程 - 东营码良软件开发资讯6会员权益/订阅付费类小程序 微信虚拟支付完整接入教程70 阅读
CONTENT GUIDE

文章目录

44 项
  1. 01数据库 ER + 字段设计文档
  2. 023.1 用户与会员分离
  3. 03status
  4. 04索引
  5. 05安全
  6. 06约束
  7. 07约束
  8. 08订单状态
  9. 09订单号
  10. 10用户与会员
  11. 11推荐关系
  12. 12升级
  13. 13商品
  14. 14购物车
  15. 15订单
  16. 16积分
  17. 17提现
  18. 18积分
  19. 19库存
  20. 20重复订单提交
  21. 21用户状态
  22. 22会员状态
  23. 23升级状态
  24. 24商品状态
  25. 25订单状态
  26. 26支付状态
  27. 27提现状态
  28. 28不建议 1:订单直接保存商品名称 ID
  29. 29不建议 2:积分只保存一个余额
  30. 30不建议 3:提现直接修改积分
  31. 31不建议 4:会员等级存在多个表
  32. 32不建议 5:前端传价格直接入库
  33. 33P0:身份与会员
  34. 34P1:商城交易
  35. 35P1:资产
  36. 36P2:账户扩展
  37. 37P2:系统
  38. 38用户
  39. 39推荐
  40. 40会员升级
  41. 41商品
  42. 42订单
  43. 43积分
  44. 44提现