Skip to content

数据模型

系统共 17 张表,覆盖用户、记账、标签、规则、AI、通知、邮箱账单与日志审计。所有表主键为自增 id,表间关系均为逻辑外键(通过 user_idcategory_id 等字段在应用层维护,未声明物理外键)。

表清单

业务域表名说明
用户t_user用户表(用户名、BCrypt 密码、昵称)
记账t_category收支分类(收入/支出,含图标与排序)
记账t_transaction收支记录(核心表)
标签t_tag标签
标签t_transaction_tag交易-标签关联(多对多)
规则t_rule自定义归类规则
规则t_rule_tag规则-标签关联(多对多)
AIt_ai_config每用户一条的 AI 配置
AIt_ai_usageAI 调用用量记录
通知t_notification_config每用户一条的提醒配置
通知t_notification_channel通知渠道
通知t_notification_log通知发送日志
邮箱账单t_email_bill_configIMAP 邮箱配置
邮箱账单t_email_bill_sender_rule发件人规则
邮箱账单t_email_bill_message拉取到的账单消息
日志t_http_log接口访问日志
日志t_login_log登录日志

关系概览

text
t_user 1 ── N  t_category / t_transaction / t_tag / t_rule
                  / t_notification_channel / t_email_bill_config
                  / t_email_bill_sender_rule / t_email_bill_message
                  / t_ai_usage / t_http_log / t_login_log
t_user 1 ── 1  t_ai_config
t_user 1 ── 1  t_notification_config

t_category 1 ── N t_transaction        (transaction.category_id,可空=未分类)
t_transaction N ── M t_tag             (经 t_transaction_tag,联合唯一)

t_category 1 ── N t_rule               (rule.category_id,命中目标分类)
t_rule N ── M t_tag                    (经 t_rule_tag,联合唯一)

t_email_bill_config 1 ── N t_email_bill_message
t_email_bill_sender_rule 1 ── N t_email_bill_message

核心表字段

t_transaction(收支记录)

字段说明
user_id所属用户
category_id分类(可空,未分类)
typeINCOME / EXPENSE
amount金额(DECIMAL(12,2))
payment_method支付方式(如 ALIPAY / WECHAT / CASH / BANK
remark备注
remark_hidden备注是否隐藏
external_no外部账单交易号,导入去重
transaction_time交易发生时间
include_in_stats是否计入统计(默认 1)
raw_data账单导入原始 JSON(手动记录为空)

关键索引:唯一索引 uk_user_external (user_id, external_no) 实现导入去重;idx_user_time (user_id, transaction_time) 支撑按时间查询与统计。

t_category / t_tag

  • 分类:nametypeicon(Emoji)、sort_order
  • 标签:namecolorsort_order,唯一索引 uk_user_name (user_id, name) 保证用户内标签名唯一。

t_rule

nameenabledsort_order(优先级)、typekeywordmin_amountmax_amountcategory_id

t_email_bill_config

IMAP 连接信息(host/port/use_ssl/username/password/folder)、状态(status/last_error/last_connected_at/last_uid)、默认归类(expense_category_id/income_category_id/tag_ids)与拉取范围(fetch_scope/fetch_limit)。

t_email_bill_message

config_iduidmessage_idsubjectfrom_addressreceived_at、附件信息、命中的 sender_rule_idbill_type、状态(PULLED/CONFIRMED/IGNORED)、error。唯一索引 uk_email_bill_message (config_id, uid, attachment_index) 防止重复拉取。

MySQL 与 SQLite 双脚本

系统同时维护 sql/init.sql(MySQL)与 sql/schema-sqlite.sql(SQLite),表结构与语义保持一致,主要差异:

维度MySQLSQLite
主键自增BIGINT AUTO_INCREMENTINTEGER PRIMARY KEY AUTOINCREMENT
布尔TINYINT(1)INTEGER
金额DECIMAL(12,2)NUMERIC(12,2)
JSONJSONTEXT
时间默认值DEFAULT CURRENT_TIMESTAMPstrftime(...,'localtime')
updated_at 自动更新ON UPDATE CURRENT_TIMESTAMPAFTER UPDATE 触发器
语句分隔符;;;(兼容触发器内部的分号)
列注释支持不支持

统计模块会依据当前数据源类型,切换 MySQL 与 SQLite 的时间分组函数(DATE_FORMAT/QUARTERstrftime)。

初始化

  • 应用启动时由 SchemaInitializer 执行对应建表脚本(幂等)。
  • 新用户注册时由 DefaultDataInitializer 初始化默认分类、标签与邮箱发件人规则。

基于 Spring Boot 3 + Vue 3 的个人收支管理系统