4. 数据模型设计:核心实体关系与字段定义
反洗钱推理链路的数据模型是整个系统的骨架。客户、账户、交易、预警、案例五大核心实体之间的关联关系,直接决定了风险传导的准确性和链路追踪的效率。本节将定义每个实体的关键字段,并建立实体间的标准映射关系。
4.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列表,同时支持灵活的归并操作。
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,满足审计要求。
扩展思考: 在微服务架构下,客户、账户、交易可能分属不同服务。此时建议使用事件驱动方式同步核心字段到反洗钱数据仓库,避免跨服务实时查询带来的性能瓶颈和耦合问题。