2、金融实体模型基础:实体类型、属性与关系图设计
金融实体模型是解析回放对比分析的数据基石。在金融业务中,实体(Entity)指代具有独立业务意义且可被唯一标识的对象,例如一家银行、一位客户或一只基金。本章将系统梳理金融实体的三大类型、核心属性体系以及实体关系图(ER图)的设计方法,为后续的SQL回放对比提供精确的数据结构支撑。
2.1 实体类型:机构、个人、产品
金融实体按业务角色可划分为三大类:机构(Institution)、个人(Individual)和产品(Product)。三者之间的交互构成了金融交易与风险管理的核心闭环。
| 实体类型 | 业务定义 | 典型示例 | 唯一标识(PK) |
|---|---|---|---|
| 机构 | 依法设立、从事金融或非金融业务的组织 | 工商银行、中信证券、中国平安 | 机构代码(如统一社会信用代码) |
| 个人 | 具有民事行为能力的自然人客户或从业人员 | 张三(零售客户)、李四(基金经理) | 身份证号或客户ID |
| 产品 | 金融机构发行或代销的可交易金融工具 | 余额宝、沪深300ETF、某信托计划 | 产品代码(如ISIN或内部编码) |
实体类型划分原则:在回放对比场景中,机构、个人、产品必须严格区分,因为同一笔交易可能涉及多个实体类型(例如:个人通过机构购买产品)。SQL关联时,实体类型字段是过滤与分组的关键维度。
2.2 实体属性体系
每个实体类型都拥有一组核心属性,用于描述其身份、状态与业务特征。属性设计需兼顾唯一性、时效性和可追溯性。
2.2.1 机构实体属性
- 基础属性:机构全称、机构简称、统一社会信用代码、注册地址、注册资本。
- 分类属性:机构类型(银行/证券/保险/基金/其他)、监管机构、是否上市。
- 状态属性:经营状态(正常/停业/注销)、成立日期、注销日期。
- 关系属性:上级机构ID、所属集团ID、关联机构列表。
2.2.2 个人实体属性
- 身份属性:姓名、证件类型、证件号码、国籍、出生日期。
- 联系属性:手机号、电子邮箱、居住地址(加密存储)。
- 职业属性:职业类别、任职机构、职务、从业资格编号。
- 风险属性:客户风险等级、黑名单标识、反洗钱评级。
2.2.3 产品实体属性
- 识别属性:产品代码、产品全称、产品简称、ISIN码。
- 分类属性:产品类型(股票/债券/基金/理财/衍生品)、投资标的、风险等级。
- 交易属性:发行机构ID、托管机构ID、成立日期、到期日期、面值、单位净值。
- 状态属性:产品状态(存续/到期/清盘)、暂停交易标识。
属性设计要点:在SQL回放对比中,实体属性常作为
WHERE过滤条件或GROUP BY分组依据。建议为高频过滤字段(如机构类型、产品风险等级)建立索引,以提升回放查询性能。
2.3 实体关系图(ER图)设计
实体关系图(ER图)用于描述机构、个人、产品之间的业务关联。在金融解析回放场景中,核心关系包括:持有(个人持有产品)、发行(机构发行产品)、任职(个人在机构任职)、交易(个人通过机构交易产品)。
以下ER图展示了三大实体之间的主要关系及关键属性:
ER图设计要点:
- 主键(PK)设计:每个实体必须拥有业务含义的唯一主键(如机构代码、客户ID、产品代码),避免使用自增ID作为业务关联依据。
- 关系基数:机构与产品之间是“一对多”发行关系;个人与产品之间是“多对多”持有关系;交易记录是“多对一”关联到三个实体。
- 时间维度:所有关系表必须包含生效日期和失效日期,以支持回放对比中的“时间点快照”查询。
2.4 实体关系在SQL回放中的映射
在SQL回放对比分析中,实体关系图直接映射为数据库表结构。以下是一个简化的DDL示例,展示机构、个人、产品及交易记录表的定义:
-- 机构表
CREATE TABLE dim_institution (
inst_code VARCHAR(20) PRIMARY KEY, -- 机构代码
inst_name VARCHAR(100) NOT NULL, -- 机构全称
inst_type VARCHAR(20) NOT NULL, -- 机构类型
reg_capital DECIMAL(18,2), -- 注册资本
status VARCHAR(10) DEFAULT 'ACTIVE', -- 状态
eff_date DATE NOT NULL, -- 生效日期
exp_date DATE DEFAULT '9999-12-31' -- 失效日期
);
-- 个人表
CREATE TABLE dim_individual (
cust_id VARCHAR(30) PRIMARY KEY, -- 客户ID
cust_name VARCHAR(60) NOT NULL, -- 姓名
id_type VARCHAR(10) NOT NULL, -- 证件类型
id_no VARCHAR(30) NOT NULL, -- 证件号码
risk_level VARCHAR(10), -- 风险等级
eff_date DATE NOT NULL,
exp_date DATE DEFAULT '9999-12-31'
);
-- 产品表
CREATE TABLE dim_product (
prod_code VARCHAR(30) PRIMARY KEY, -- 产品代码
prod_name VARCHAR(100) NOT NULL, -- 产品名称
prod_type VARCHAR(20) NOT NULL, -- 产品类型
issuer_code VARCHAR(20) NOT NULL, -- 发行机构代码
risk_level VARCHAR(10), -- 风险等级
eff_date DATE NOT NULL,
exp_date DATE DEFAULT '9999-12-31',
FOREIGN KEY (issuer_code) REFERENCES dim_institution(inst_code)
);
-- 交易记录表(关联实体)
CREATE TABLE fact_transaction (
trans_id BIGINT PRIMARY KEY, -- 交易ID
trans_time TIMESTAMP NOT NULL, -- 交易时间
cust_id VARCHAR(30) NOT NULL, -- 客户ID
inst_code VARCHAR(20) NOT NULL, -- 参与机构
prod_code VARCHAR(30) NOT NULL, -- 交易产品
trans_amount DECIMAL(18,2) NOT NULL, -- 交易金额
trans_dir VARCHAR(4) NOT NULL, -- 交易方向(买入/卖出)
batch_id VARCHAR(30), -- 回放批次ID
FOREIGN KEY (cust_id) REFERENCES dim_individual(cust_id),
FOREIGN KEY (inst_code) REFERENCES dim_institution(inst_code),
FOREIGN KEY (prod_code) REFERENCES dim_product(prod_code)
);
回放对比注意事项:在回放对比SQL中,实体表通常使用
LEFT JOIN关联交易记录表,并利用eff_date和exp_date做时间范围过滤,确保每个交易时间点关联到正确的实体快照。例如:ON t.cust_id = i.cust_id AND t.trans_time BETWEEN i.eff_date AND i.exp_date。
2.5 实体模型设计检查清单
在开始SQL回放对比之前,请使用以下清单验证实体模型是否完备:
| 检查项 | 说明 | 验证方法 |
|---|---|---|
| 实体类型覆盖 | 是否包含机构、个人、产品三大类 | 检查维度表数量 |
| 主键唯一性 | 每个实体表是否有业务主键 | 执行SELECT COUNT(DISTINCT pk) FROM table |
| 时间维度 | 是否包含生效/失效日期 | 检查表结构中的eff_date和exp_date |
| 外键完整性 | 关联字段是否引用正确的主键 | 执行SELECT * FROM fact WHERE fk NOT IN (SELECT pk FROM dim) |
| 属性完备性 | 是否包含回放对比所需的过滤字段 | 与业务需求文档核对 |