4. 数据模型设计:核心实体关系与字段定义

反洗钱推理链路的数据模型是整个系统的骨架。客户、账户、交易、预警、案例五大核心实体之间的关联关系,直接决定了风险传导的准确性和链路追踪的效率。本节将定义每个实体的关键字段,并建立实体间的标准映射关系。

4.1 五大核心实体总览

反洗钱系统采用星型+雪花型混合模型,以客户为中心,账户和交易为行为载体,预警为风险触发点,案例为处置闭环。实体间关系如下:

核心关系原则: 一个客户可拥有多个账户;一个账户产生多笔交易;多笔交易可触发一条预警;多条预警可归并为一个案例。反向追溯时,案例可关联回客户,形成完整推理链路。
反洗钱核心实体关系图 反洗钱核心实体关系图 客户 (Customer) 核心主体 账户 (Account) 资金载体 交易 (Transaction) 行为记录 预警 (Alert) 风险触发 案例 (Case) 处置闭环 1:N 1:N 1:N N:1 N:1 反向追溯

4.2 客户实体字段定义

客户表是反洗钱系统的根实体,所有风险分析最终都归集到客户层面。字段设计需兼顾身份识别、风险评级和监管报送要求。

字段名 类型 长度/精度 说明
customer_id VARCHAR 32 客户唯一标识,主键
customer_name VARCHAR 128 客户姓名/名称
customer_type CHAR 2 01-个人,02-企业,03-其他
id_type CHAR 2 01-身份证,02-护照,03-营业执照
id_number VARCHAR 64 证件号码(加密存储)
risk_level CHAR 2 01-低风险,02-中风险,03-高风险
risk_score DECIMAL 5,2 风险评分 0.00~100.00
country_of_residence CHAR 3 ISO 3166-1 国家代码
occupation VARCHAR 64 职业/行业类别
kyc_status CHAR 2 00-未认证,01-已认证,02-认证过期
created_at TIMESTAMP - 创建时间
updated_at TIMESTAMP - 最后更新时间
设计要点: id_number 字段必须加密存储,查询时使用脱敏后的哈希值进行匹配。risk_level 和 risk_score 由推理引擎定期计算更新,不直接由人工写入。

4.3 账户实体字段定义

账户是客户与交易之间的桥梁。一个客户可拥有多个账户,账户类型包括储蓄、支票、信用卡、电子钱包等。

字段名 类型 长度/精度 说明
account_id VARCHAR 32 账户唯一标识,主键
customer_id VARCHAR 32 所属客户ID,外键
account_number VARCHAR 32 账号(脱敏显示)
account_type CHAR 2 01-储蓄,02-支票,03-信用卡,04-电子钱包
currency CHAR 3 ISO 4217 货币代码
balance DECIMAL 18,2 当前余额
account_status CHAR 2 01-正常,02-冻结,03-销户
open_date DATE - 开户日期
close_date DATE - 销户日期(可空)

4.4 交易实体字段定义

交易是反洗钱分析的核心数据源。每笔交易必须记录交易双方、金额、时间和渠道四个维度的信息,以支持链路追溯。

字段名 类型 长度/精度 说明
transaction_id VARCHAR 32 交易唯一标识,主键
from_account_id VARCHAR 32 付款账户ID,外键
to_account_id VARCHAR 32 收款账户ID,外键
transaction_amount DECIMAL 18,2 交易金额
currency CHAR 3 ISO 4217 货币代码
transaction_type CHAR 2 01-转账,02-取现,03-消费,04-存款
channel CHAR 2 01-网银,02-柜面,03-ATM,04-移动端
transaction_time TIMESTAMP - 交易发生时间
ip_address VARCHAR 45 交易IP地址(IPv4/IPv6)
device_id VARCHAR 64 设备指纹(可空)
geo_location VARCHAR 64 GPS坐标或城市代码
remark VARCHAR 256 交易附言/备注
注意: 交易表是数据量最大的表,日均可能达到百万至千万级。必须对 transaction_time 和 from_account_id 建立联合索引,否则推理链路的查询性能将严重下降。

4.5 预警实体字段定义

预警是推理引擎的输出结果,代表系统检测到的可疑行为。一条预警可关联多笔交易,但最终归并到一个案例。

字段名 类型 长度/精度 说明
alert_id VARCHAR 32 预警唯一标识,主键
customer_id VARCHAR 32 触发预警的客户ID,外键
alert_type CHAR 4 预警类型代码,如 A001-大额交易,A002-频繁交易
alert_score DECIMAL 5,2 预警评分 0.00~100.00
alert_status CHAR 2 01-待处理,02-已确认,03-误报,04-已升级
trigger_rule_id VARCHAR 32 触发规则ID,外键
alert_time TIMESTAMP - 预警生成时间
summary VARCHAR 512 预警摘要描述
assigned_to VARCHAR 32 处理人ID(可空)

4.6 案例实体字段定义

案例是反洗钱处置的最终单元。多条预警经过分析师研判后,可归并为同一案例进行统一调查和上报。

字段名 类型 长度/精度 说明
case_id VARCHAR 32 案例唯一标识,主键
case_name VARCHAR 128 案例名称
case_status CHAR 2 01-调查中,02-已结案,03-已上报
case_priority CHAR 2 01-普通,02-紧急,03-特急
primary_customer_id VARCHAR 32 主要嫌疑人客户ID,外键
total_alert_count INT - 关联预警数量
total_transaction_amount DECIMAL 18,2 涉案总金额
opened_at TIMESTAMP - 立案时间
closed_at TIMESTAMP - 结案时间(可空)
sar_filed BOOLEAN - 是否已提交可疑交易报告
sar_id VARCHAR 32 可疑交易报告编号(可空)

4.7 实体关联关系与链路追溯

推理链路的核心在于跨实体追溯。以下 SQL 示例展示了如何从一条预警出发,追溯至关联交易、账户和客户:

-- 从预警追溯完整链路
SELECT
    a.alert_id,
    a.alert_type,
    a.alert_score,
    t.transaction_id,
    t.transaction_amount,
    t.transaction_time,
    ac.account_id,
    ac.account_type,
    c.customer_id,
    c.customer_name,
    c.risk_level
FROM alert a
JOIN alert_transaction at ON a.alert_id = at.alert_id
JOIN transaction t ON at.transaction_id = t.transaction_id
JOIN account ac ON t.from_account_id = ac.account_id
JOIN customer c ON ac.customer_id = c.customer_id
WHERE a.alert_id = 'ALT202503210001'
ORDER BY t.transaction_time DESC;
链路追溯要点: 实际生产环境中,预警与交易之间通过关联表 alert_transaction 实现多对多映射。案例与预警之间同样使用 case_alert 关联表。这种设计避免了在预警表中存储冗余的交易ID列表,同时支持灵活的归并操作。
推理链路追溯数据流 推理链路追溯数据流 预警 (Alert) alert_transaction 交易 (Transaction) 账户 (Account) 客户 (Customer) 1:N N:1 N:1 N:1

4.8 数据模型设计最佳实践

  • 分表策略: 交易表按时间分区(按月或按季度),预警表和案例表按状态分区,提升查询性能。
  • 索引设计: 交易表建立 (from_account_id, transaction_time) 联合索引;预警表建立 (customer_id, alert_time) 联合索引;关联表建立 (alert_id, transaction_id) 唯一索引。
  • 数据保留: 交易数据至少保留5年(监管要求),预警和案例数据永久保留。历史数据可归档至冷存储。
  • 字段冗余: 在案例表中冗余存储 primary_customer_id 和 total_transaction_amount,避免每次查询都进行聚合计算。
  • 审计追踪: 所有实体表增加 created_by、updated_by 字段,记录操作人ID,满足审计要求。
扩展思考: 在微服务架构下,客户、账户、交易可能分属不同服务。此时建议使用事件驱动方式同步核心字段到反洗钱数据仓库,避免跨服务实时查询带来的性能瓶颈和耦合问题。