You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
RuoYi-Vue/docs/architecture/database-structure.md

456 lines
25 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# RuoYi-Vue 数据库结构分析
> 分析日期2026-06-28
> 数据来源:建表 SQL 文件、Mapper XML 文件、Domain 实体类
---
## 1. 表结构清单
### 1.1 系统管理表sys_* / gen_* / QRTZ_*
系统管理表位于 `ry` 数据库,由 RuoYi 框架提供。
| 表名 | 字段数 | 主键 | 用途 | 备注 |
|------|--------|------|------|------|
| `sys_user` | 18 | user_id (bigint, AI) | 用户信息表 | 含 del_flag 软删除 |
| `sys_dept` | 12 | dept_id (bigint, AI) | 部门表 | 树形结构,含 ancestors |
| `sys_role` | 13 | role_id (bigint, AI) | 角色信息表 | 含 data_scope 数据权限 |
| `sys_menu` | 17 | menu_id (bigint, AI) | 菜单权限表 | 树形结构M/C/F 三种类型 |
| `sys_post` | 9 | post_id (bigint, AI) | 岗位信息表 | - |
| `sys_dict_type` | 9 | dict_id (bigint, AI) | 字典类型表 | **唯一索引**: dict_type |
| `sys_dict_data` | 12 | dict_code (bigint, AI) | 字典数据表 | 关联 dict_type |
| `sys_config` | 9 | config_id (int, AI) | 参数配置表 | - |
| `sys_notice` | 9 | notice_id (int, AI) | 通知公告表 | content 使用 longblob |
| `sys_oper_log` | 15 | oper_id (bigint, AI) | 操作日志记录 | 大表,高频写入 |
| `sys_logininfor` | 8 | info_id (bigint, AI) | 系统访问记录 | 登录日志 |
| `sys_job` | 12 | (job_id, job_name, job_group) 联合主键 | 定时任务调度表 | - |
| `sys_job_log` | 7 | job_log_id (bigint, AI) | 定时任务调度日志 | - |
| `sys_user_role` | 2 | (user_id, role_id) 联合主键 | 用户-角色关联表 | 多对多中间表 |
| `sys_role_menu` | 2 | (role_id, menu_id) 联合主键 | 角色-菜单关联表 | 多对多中间表 |
| `sys_role_dept` | 2 | (role_id, dept_id) 联合主键 | 角色-部门关联表 | 多对多中间表 |
| `sys_user_post` | 2 | (user_id, post_id) 联合主键 | 用户-岗位关联表 | 多对多中间表 |
| `gen_table` | 17 | table_id (bigint, AI) | 代码生成业务表 | - |
| `gen_table_column` | 21 | column_id (bigint, AI) | 代码生成业务表字段 | - |
| `QRTZ_JOB_DETAILS` | 10 | (sched_name, job_name, job_group) | Quartz 任务详情 | 外键关联 |
| `QRTZ_TRIGGERS` | 14 | (sched_name, trigger_name, trigger_group) | Quartz 触发器 | FK → QRTZ_JOB_DETAILS |
| `QRTZ_SIMPLE_TRIGGERS` | 6 | (sched_name, trigger_name, trigger_group) | Quartz 简单触发器 | FK → QRTZ_TRIGGERS |
| `QRTZ_CRON_TRIGGERS` | 5 | (sched_name, trigger_name, trigger_group) | Quartz Cron 触发器 | FK → QRTZ_TRIGGERS |
| `QRTZ_BLOB_TRIGGERS` | 4 | (sched_name, trigger_name, trigger_group) | Quartz Blob 触发器 | FK → QRTZ_TRIGGERS |
| `QRTZ_CALENDARS` | 3 | (sched_name, calendar_name) | Quartz 日历 | - |
| `QRTZ_FIRED_TRIGGERS` | 11 | (sched_name, entry_id) | Quartz 已触发触发器 | - |
| `QRTZ_PAUSED_TRIGGER_GRPS` | 2 | (sched_name, trigger_group) | Quartz 暂停触发器组 | - |
| `QRTZ_SCHEDULER_STATE` | 5 | (sched_name, instance_name) | Quartz 调度器状态 | - |
| `QRTZ_LOCKS` | 2 | (sched_name, lock_name) | Quartz 锁表 | - |
| `QRTZ_SIMPROP_TRIGGERS` | 8 | (sched_name, trigger_name, trigger_group) | Quartz 简单属性触发器 | FK → QRTZ_TRIGGERS |
### 1.2 股票业务表nstocks 数据库)
| 表名 | 字段数 | 主键 | 用途 | 备注 |
|------|--------|------|------|------|
| `stocks` | 15 | id (double, AI) | 全部 A 股每日交易数据 | 核心行情表AUTO_INCREMENT=82694 |
| `stocks_tmp` | 7 | id (double, AI) | 全部 A 股每日交易数据辅助表 | 临时/辅助计算表 |
| `stock_index` | 23 | id (double, AI) | 指数交易行情 | AUTO_INCREMENT=82694 |
| `stock_financial` | 9 | id (double, AI) | A 股财务数据 | AUTO_INCREMENT=137032 |
| `stock_basis` | 15 | id (double, AI) | A 股基础信息 | 大文件(521KB),含上市日期等 |
| `stocks_in_trend` | 5 | id (double, AI) | 动量个股 | 关联 trends 表 |
| `stocks_limit_up` | 3 | id (double, AI) | 每日涨停板 | 仅 code + trade_day |
| `trends` | 9 | id (double, AI) | 动量结果(板块级别) | 含板块排名 |
| `industries` | 5 | id (double, AI) | 东财行业 2 级每日数据 | - |
| `industries_basis` | 3 | id (double, AI) | 东财行业 2 级基础信息 | 行业字典表 |
| `trade_dates` | 3 | **无主键** | 可交易日期日历 | 包含节假日信息 |
### 1.3 账户/记账业务表ry 数据库)
| 表名 | 字段数 | 主键 | 用途 | 备注 |
|------|--------|------|------|------|
| `account` | 9 | id (double, AI) | 账户每日统计 | 净资产、总资产、盈亏 |
| `account_book` | 14 | id (double, AI) | 操作记录表(交易记) | 对应 Operations 实体 |
| `operations` | 16 | id (double, AI) | 操作表(含账户转入转出) | 含 deal_logic 操作逻辑 |
| `statistics` | 10 | id (double, AI) | 交易统计表单笔操作 | 清仓时统计 |
| `statistics_remain` | 10 | id (double, AI) | 统计表当日持仓 | 包含当日清仓 |
| `statistics_total` | 16 | id (double, AI) | 统计表清仓后汇总 | 总盈亏、总手续费等 |
### 1.4 分类统计
| 分类 | 表数量 | 占比 |
|------|--------|------|
| 系统管理表 | 21 | 42% |
| Quartz 定时任务表 | 9 | 18% |
| 股票业务表 | 11 | 22% |
| 账户/记账业务表 | 6 | 12% |
| 代码生成表 | 2 | 4% |
| **合计** | **~49** | **100%** |
---
## 2. 表关系
### 2.1 系统管理模块关系图
```
┌─────────────┐ ┌───────────────┐ ┌─────────────┐
│ sys_dept │◄─────│ sys_user │─────►│ sys_post │
│ (部门树) │ │ (用户信息) │ │ (岗位) │
└──────┬──────┘ └──────┬────────┘ └──────┬──────┘
│ │ │
│ ┌─────┴─────┐ ┌─────┴──────┐
│ │sys_user_ │ │sys_user_ │
│ │ role │ │ post │
│ │(N-M 中间) │ │(N-M 中间) │
│ └─────┬─────┘ └────────────┘
│ │
│ ┌─────┴─────┐ ┌─────────────┐
└─────────────►│ sys_role │◄─────│ sys_role_ │
│ (角色) │ │ dept │
└─────┬─────┘ │(N-M 中间) │
│ └─────────────┘
┌─────┴─────┐
│sys_role_ │ ┌─────────────┐
│ menu │◄─────│ sys_menu │
│(N-M 中间) │ │ (菜单树) │
└───────────┘ └─────────────┘
```
### 2.2 股票业务模块关系图
```
┌──────────────────┐ ┌───────────────┐ ┌──────────────────┐
│ stock_basis │ │ stocks │ │ stock_financial │
│ (股票基础信息) │ │ (每日行情) │ │ (财务数据) │
└────────┬─────────┘ └───────┬───────┘ └──────────────────┘
│ │
│ code(逻辑关联) │ code + trade_day
│ │
▼ ▼
┌──────────────────┐ ┌───────────────┐ ┌──────────────────┐
│ industries_ │ │ stock_index │ │ stocks_in_trend │
│ basis │ │ (指数行情) │ │ (动量个股) │
│ (行业字典) │ └───────────────┘ └────────┬─────────┘
└────────┬─────────┘ │
│ code + trade_day
│ │
▼ ▼
┌──────────────────┐ ┌──────────────────┐
│ industries │ │ trends │
│ (行业每日数据) │◄──── blemind2 关联 ──────│ (板块动量排名) │
└──────────────────┘ └──────────────────┘
┌──────────────────┐ ┌───────────────┐
│ trade_dates │ │stocks_limit_up│
│ (交易日历) │ │ (涨停板) │
└──────────────────┘ └───────────────┘
```
### 2.3 账户/记账模块关系图
```
┌─────────────┐ ┌───────────────┐ ┌─────────────┐
│ account │ │ operations │◄───►│account_book │
│ (账户统计) │ │ (操作记录) │ │ (交易记录) │
└─────────────┘ └───────┬───────┘ └─────────────┘
user_id │ pre_id
┌─────────────┼─────────────┐
▼ ▼ ▼
┌──────────┐ ┌───────────┐ ┌─────────────┐
│statistics │ │statistics │ │statistics_ │
│ (单笔统计)│ │ _remain │ │ total │
│ │ │(当日持仓) │ │(清仓汇总) │
└──────────┘ └───────────┘ └─────────────┘
user_id user_id user_id
```
### 2.4 外键约束分析
| 表名 | 外键字段 | 引用表 | 引用字段 | 约束类型 |
|------|----------|--------|----------|----------|
| QRTZ_TRIGGERS | (sched_name, job_name, job_group) | QRTZ_JOB_DETAILS | 主键 | 物理外键 |
| QRTZ_SIMPLE_TRIGGERS | (sched_name, trigger_name, trigger_group) | QRTZ_TRIGGERS | 主键 | 物理外键 |
| QRTZ_CRON_TRIGGERS | (sched_name, trigger_name, trigger_group) | QRTZ_TRIGGERS | 主键 | 物理外键 |
| QRTZ_BLOB_TRIGGERS | (sched_name, trigger_name, trigger_group) | QRTZ_TRIGGERS | 主键 | 物理外键 |
| QRTZ_SIMPROP_TRIGGERS | (sched_name, trigger_name, trigger_group) | QRTZ_TRIGGERS | 主键 | 物理外键 |
**注意**:系统管理表和业务表之间 **没有物理外键约束**,全部采用逻辑关联(通过代码层 JOIN 实现)。
### 2.5 多对多关系表
| 中间表 | 关联实体 1 | 关联实体 2 | 用途 |
|--------|-----------|-----------|------|
| `sys_user_role` | sys_user | sys_role | 用户角色分配 |
| `sys_role_menu` | sys_role | sys_menu | 角色菜单权限 |
| `sys_role_dept` | sys_role | sys_dept | 角色数据权限范围 |
| `sys_user_post` | sys_user | sys_post | 用户岗位分配 |
---
## 3. 索引分析
### 3.1 主键索引清单
| 表名 | 主键类型 | 主键字段 | 自增 |
|------|----------|----------|------|
| sys_user | 单列 | user_id (bigint) | ✅ |
| sys_dept | 单列 | dept_id (bigint) | ✅ |
| sys_role | 单列 | role_id (bigint) | ✅ |
| sys_menu | 单列 | menu_id (bigint) | ✅ |
| sys_post | 单列 | post_id (bigint) | ✅ |
| sys_dict_type | 单列 | dict_id (bigint) | ✅ |
| sys_dict_data | 单列 | dict_code (bigint) | ✅ |
| sys_config | 单列 | config_id (int) | ✅ |
| sys_notice | 单列 | notice_id (int) | ✅ |
| sys_oper_log | 单列 | oper_id (bigint) | ✅ |
| sys_logininfor | 单列 | info_id (bigint) | ✅ |
| sys_job | **联合** | (job_id, job_name, job_group) | job_id 自增 |
| sys_job_log | 单列 | job_log_id (bigint) | ✅ |
| sys_user_role | **联合** | (user_id, role_id) | ❌ |
| sys_role_menu | **联合** | (role_id, menu_id) | ❌ |
| sys_role_dept | **联合** | (role_id, dept_id) | ❌ |
| sys_user_post | **联合** | (user_id, post_id) | ❌ |
| stocks | 单列 | id (double) | ✅ |
| stock_index | 单列 | id (double) | ✅ |
| trade_dates | **无主键** | - | ❌ |
### 3.2 唯一索引
| 表名 | 索引字段 | 说明 |
|------|----------|------|
| sys_dict_type | dict_type | 字典类型编码唯一 |
| sys_user | 无唯一索引 | 用户名/手机/邮箱仅有应用层校验 |
### 3.3 普通索引 / 复合索引
**大部分业务表缺少索引**,仅有主键索引。以下表没有除主键外的任何索引:
- `stocks` — 15 字段,仅有主键
- `stock_index` — 23 字段,仅有主键
- `stock_financial` — 9 字段,仅有主键
- `operations` — 16 字段,仅有主键
- `statistics` — 10 字段,仅有主键
- `statistics_remain` — 10 字段,仅有主键
- `statistics_total` — 16 字段,仅有主键
- `trade_dates` — 无主键、无索引
### 3.4 索引使用情况评估
| 表名 | 索引覆盖度 | 评价 |
|------|-----------|------|
| sys_dict_type | ★★★☆☆ | 有唯一索引,但缺少 status 索引 |
| sys_user | ★★☆☆☆ | 缺少 userName、phone、email 索引 |
| sys_oper_log | ★☆☆☆☆ | 缺少 oper_time、oper_name 索引 |
| stocks | ★☆☆☆☆ | 缺少 code、trade_day 索引 |
| trade_dates | ☆☆☆☆☆ | 无主键无索引 |
---
## 4. 查询模式
### 4.1 常用查询模式
#### 系统管理模块
| 查询场景 | 涉及表 | 查询方式 | 典型条件 |
|----------|--------|----------|----------|
| 用户登录 | sys_user | 等值查询 | user_name = ? |
| 用户列表 | sys_user + sys_dept | LEFT JOIN + 模糊查询 | del_flag='0', LIKE 姓名/手机 |
| 用户详情 | sys_user + sys_dept + sys_user_role + sys_role | 多表 LEFT JOIN | user_id = ? |
| 角色已分配用户 | sys_user + sys_dept + sys_user_role + sys_role | 多表 JOIN + DISTINCT | role_id = ? |
| 角色未分配用户 | sys_user + sys_dept + sys_user_role + sys_role | NOT IN 子查询 | role_id != ? |
| 部门树查询 | sys_dept | 递归/ancestors LIKE | parent_id = ? |
| 菜单树查询 | sys_menu | 递归/parent_id | parent_id = ? |
| 操作日志 | sys_oper_log | 分页 + 时间范围 | oper_time BETWEEN |
| 登录日志 | sys_logininfor | 分页 + 时间范围 | login_time BETWEEN |
| 字典查询 | sys_dict_type + sys_dict_data | 等值关联 | dict_type = ? |
#### 股票业务模块
| 查询场景 | 涉及表 | 查询方式 | 典型条件 |
|----------|--------|----------|----------|
| 股票行情查询 | stocks | 等值 + 范围 | code = ?, trade_day = ? |
| 区间涨跌幅查询 | stocks | 范围查询 | differrange10/20/60 BETWEEN |
| 动量个股查询 | stocks_in_trend + trends | code 关联 | trade_day = ?, type = ? |
| 涨停板查询 | stocks_limit_up | 等值 | trade_day = ? |
| 财务数据查询 | stock_financial | 等值 + 排序 | code = ?, period = ? |
| 指数行情查询 | stock_index | 等值 + 范围 | code = ?, trade_day = ? |
#### 账户记账模块
| 查询场景 | 涉及表 | 查询方式 | 典型条件 |
|----------|--------|----------|----------|
| 账户统计 | account | 等值查询 | trade_day = ?, user_id = ? |
| 操作记录 | operations | 等值 + 模糊 | code = ?, name LIKE, trade_day = ? |
| 当日持仓统计 | statistics_remain | 等值 | code = ?, trade_day = ?, user_id = ? |
| 清仓汇总统计 | statistics_total | 等值 | code = ?, user_id = ? |
| 单笔统计 | statistics | 等值 | code = ?, operations_id = ? |
### 4.2 复杂关联查询
#### 查询 1用户详情4 表 JOIN
```sql
-- SysUserMapper.xml: selectUserVo
SELECT u.*, d.*, r.*
FROM sys_user u
LEFT JOIN sys_dept d ON u.dept_id = d.dept_id
LEFT JOIN sys_user_role ur ON u.user_id = ur.user_id
LEFT JOIN sys_role r ON r.role_id = ur.role_id
WHERE u.user_name = ?
```
**分析**4 表 LEFT JOINsys_user_role 和 sys_role 的 JOIN 会产生笛卡尔积膨胀(一个用户多个角色时返回多行),由 MyBatis 的 `<collection>` 标签在应用层聚合。
#### 查询 2部门树递归查询
```sql
-- SysUserMapper.xml: deptId 条件
SELECT t.dept_id FROM sys_dept t
WHERE find_in_set(#{deptId}, ancestors)
```
**分析**:使用 `find_in_set` 函数进行字符串匹配,无法使用索引,全表扫描。
#### 查询 3数据范围过滤
```sql
-- SysUserMapper.xml: dataScope
${params.dataScope} -- 动态 SQL 拼接
```
**分析**:使用 `${}` 直接拼接 SQL存在 SQL 注入风险(虽然框架层有控制)。
### 4.3 统计查询
| 统计场景 | 涉及表 | 说明 |
|----------|--------|------|
| 账户每日盈亏 | account | 按 trade_day 聚合 assets_diff |
| 个股总盈亏 | statistics_total | 按 code + user_id 汇总 total_profit |
| 持仓盈亏 | statistics_remain | 按 trade_day 汇总 total_profit |
| 板块排名 | trends | 按 sort 排序 |
### 4.4 性能瓶颈识别
| 瓶颈 | 位置 | 严重程度 | 说明 |
|------|------|----------|------|
| `find_in_set` 查询 | sys_dept.ancestors | 🔴 高 | 全表扫描,无法利用索引 |
| 日期格式化查询 | sys_user.create_time | 🟡 中 | `date_format(u.create_time,'%y%m%d')` 导致索引失效 |
| LIKE 前缀通配符 | 多处 name/phone | 🟡 中 | `LIKE '%keyword%'` 无法使用索引 |
| 大表无索引 | stocks, stock_index | 🔴 高 | 8 万+ 记录表仅主键索引 |
| NOT IN 子查询 | 未分配用户查询 | 🟡 中 | 可能被 NOT EXISTS 优化 |
| 动态 SQL 拼接 | dataScope | 🟡 中 | 安全风险 + 查询计划不可预测 |
---
## 5. 存在的问题
### 5.1 问题清单
| # | 问题 | 涉及表 | 严重程度 | 影响范围 |
|---|------|--------|----------|----------|
| 1 | **主键使用 double 类型** | 所有业务表stocks, account, operations, statistics 等) | 🔴 严重 | double 是浮点类型,用于主键可能导致精度问题和性能下降 |
| 2 | **trade_dates 表无主键** | trade_dates | 🔴 严重 | 无主键表无法保证数据唯一性,复制和备份可能出错 |
| 3 | **业务表缺少必要索引** | stocks, stock_index, stock_financial, operations 等 | 🔴 严重 | 高频查询字段code, trade_day无索引导致全表扫描 |
| 4 | **statistics 表存在字段名拼写错误** | statistics | 🟡 中等 | 同时存在 `operations_id`(varchar) 和 `operateion_id`(double) 两个含义相近字段 |
| 5 | **无逻辑外键导致数据一致性风险** | sys_user_role, sys_role_menu, statistics 等 | 🟡 中等 | 删除用户/角色时,关联表数据可能残留 |
| 6 | **find_in_set 查询无法利用索引** | sys_dept | 🟡 中等 | 部门树查询性能随数据量线性下降 |
| 7 | **date_format 函数导致索引失效** | sys_user, sys_oper_log 等 | 🟡 中等 | 时间范围查询使用 `date_format()` 包装列 |
| 8 | **缺少审计字段** | 大部分业务表 | 🟢 低 | 业务表缺少 create_by, create_time, update_by, update_time |
| 9 | **缺少软删除机制** | 业务表stocks, operations 等) | 🟢 低 | 数据删除后无法恢复,不符合审计要求 |
| 10 | **大字段 TEXT/BLOB 无分离** | sys_notice, operations.deal_logic, statistics.bz | 🟢 低 | 大文本字段与主表混合存储,影响查询性能 |
### 5.2 优化建议
#### P0必须修复
1. **主键类型修正**:将所有业务表的 `id double` 改为 `id bigint(20) NOT NULL AUTO_INCREMENT`
```sql
ALTER TABLE stocks MODIFY COLUMN id bigint(20) NOT NULL AUTO_INCREMENT;
```
2. **添加核心查询索引**
```sql
-- stocks 表
ALTER TABLE stocks ADD INDEX idx_code_trade (code, trade_day);
ALTER TABLE stocks ADD INDEX idx_trade_day (trade_day);
-- stock_index 表
ALTER TABLE stock_index ADD INDEX idx_code_trade (code, trade_day);
-- operations 表
ALTER TABLE operations ADD INDEX idx_code_trade (code, trade_day);
ALTER TABLE operations ADD INDEX idx_user_id (user_id);
-- statistics_remain 表
ALTER TABLE statistics_remain ADD INDEX idx_code_trade (code, trade_day);
ALTER TABLE statistics_remain ADD INDEX idx_user_id (user_id);
```
3. **trade_dates 表添加主键**
```sql
ALTER TABLE trade_dates ADD PRIMARY KEY (date);
```
#### P1建议修复
4. **修复 statistics 表字段**:合并 `operations_id``operateion_id` 为统一的外键字段
5. **时间查询优化**:将 `date_format(u.create_time,'%y%m%d') >= ?` 改为范围查询:
```sql
AND u.create_time >= #{params.beginTime}
AND u.create_time < DATE_ADD(#{params.endTime}, INTERVAL 1 DAY)
```
6. **部门树查询优化**:考虑使用闭包表(Closure Table)或物化路径的整数数组类型替代 `find_in_set`
#### P2可选改进
7. **添加审计字段**:为所有业务表添加 create_by, create_time, update_by, update_time
8. **添加软删除**:为业务表添加 del_flag 字段
9. **大字段分离**:将 operations.deal_logicstatistics.bz TEXT 字段移至扩展表
---
## 附录:数据库 ER 概览
```
┌─────────────────────────────────────────────────────────────────┐
│ RuoYi-Vue 数据库概览 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─ 系统管理 (ry) ──────────────────────────────────────────┐ │
│ │ sys_user ←→ sys_dept (树) │ │
│ │ sys_user ←N:M→ sys_role ←N:M→ sys_menu (树) │ │
│ │ sys_user ←N:M→ sys_post │ │
│ │ sys_role ←N:M→ sys_dept │ │
│ │ sys_dict_type ←1:N→ sys_dict_data │ │
│ │ sys_oper_log / sys_logininfor (日志) │ │
│ │ sys_job → sys_job_log (定时任务) │ │
│ │ gen_table ←1:N→ gen_table_column (代码生成) │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ ┌─ 股票业务 (nstocks) ─────────────────────────────────────┐ │
│ │ stock_basis ←(code)→ stocks ←(code)→ stock_financial │ │
│ │ stocks ←(code)→ stocks_in_trend ←(code)→ trends │ │
│ │ stock_index (独立) │ │
│ │ industries_basis ←(name)→ industries │ │
│ │ stocks_limit_up (独立) │ │
│ │ trade_dates (日历) │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ ┌─ 账户记账 (ry) ──────────────────────────────────────────┐ │
│ │ account (每日统计) │ │
│ │ operations ←(pre_id)→ operations (自引用) │ │
│ │ operations ←→ statistics (单笔统计) │ │
│ │ operations ←→ statistics_remain (当日持仓) │ │
│ │ operations ←→ statistics_total (清仓汇总) │ │
│ │ account_book (操作快照) │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
```
---
*文档结束*