3. 催收核心数据表结构解析:字段含义与关联关系

在催收特征工程中,理解底层数据表的结构是构建有效特征的前提。本章将深入解析催收系统中五张核心表:案件表、客户表、通话记录表、还款计划表和催收员操作表。我们将逐一拆解每张表的字段含义、业务逻辑以及表与表之间的关联关系,为后续的SQL特征提取打下坚实基础。

学习提示: 本章不涉及复杂的SQL代码,重点在于建立对数据模型的全局认知。建议读者在阅读时,对照自己实际工作中的数据字典进行印证,效果更佳。

3.1 五表全景图:核心实体与关系

催收业务的数据模型围绕“案件”这一核心实体展开。一个案件对应一笔逾期债务,关联一个客户、多条通话记录、一份还款计划以及一系列催收员操作记录。下图展示了五张表之间的核心关联关系。

催收核心数据表关联关系图 催收核心数据表关联关系全景图 案件表 (case_info) 主键: case_id 客户表 (customer) 主键: customer_id 通话记录表 (call_log) 主键: call_id 还款计划表 (repay_plan) 主键: plan_id 催收员操作表 (action_log) 主键: action_id customer_id case_id case_id case_id 说明:所有子表均通过 case_id 与案件表关联,形成一对多关系。 客户表通过 customer_id 与案件表关联,一个客户可有多笔案件。
核心关联逻辑: 案件表是催收数据模型的“中枢神经”。所有其他表(通话记录、还款计划、催收员操作)都通过 case_id 外键与案件表关联。客户表则通过 customer_id 与案件表关联,体现“一个客户可能有多笔逾期案件”的业务现实。

3.2 案件表 (case_info):催收的“主档案”

案件表是催收系统的核心,每一条记录代表一个独立的逾期案件。它记录了案件从产生到结案的全生命周期信息。

字段名 数据类型 字段含义 业务说明
case_id STRING 案件唯一标识 主键,全局唯一
customer_id STRING 客户ID 关联客户表的外键
product_type STRING 产品类型 如:现金贷、消费分期、信用卡
loan_amount DECIMAL 借款金额 案件初始本金
overdue_days INT 逾期天数 截至当前日期的逾期时长
overdue_amount DECIMAL 逾期总金额 本金+利息+罚息+滞纳金
case_status STRING 案件状态 如:催收中、已结清、核销、委外
assign_collector STRING 当前催收员 负责该案件的催收员ID
create_time DATETIME 案件创建时间 逾期发生的日期
close_time DATETIME 案件关闭时间 结清或核销的日期
注意: overdue_days 通常是动态计算的字段,在数据仓库中可能以快照形式存储。在特征工程中,我们常使用 DATEDIFF(CURRENT_DATE, create_time) 来实时计算逾期天数,以确保特征的时效性。

3.3 客户表 (customer):债务人的“画像”

客户表存储债务人的静态信息和历史行为数据。一个客户可能拥有多个案件,因此客户表与案件表是“一对多”关系。

字段名 数据类型 字段含义 业务说明
customer_id STRING 客户唯一标识 主键
name STRING 客户姓名 脱敏处理
id_number STRING 身份证号 脱敏处理
phone STRING 手机号码 主要联系方式
age INT 年龄 计算特征:年龄段
gender STRING 性别 M/F
city STRING 所在城市 可用于地域风险分析
income_level STRING 收入等级 如:高、中、低
credit_score INT 征信评分 外部征信机构提供
register_time DATETIME 注册时间 客户首次注册日期
特征工程切入点: 客户表中的 age、city、income_level 等字段可直接作为基础特征。更高级的特征可以通过聚合客户的历史案件行为来生成,例如“该客户历史逾期次数”、“历史最大逾期天数”等。

3.4 通话记录表 (call_log):催收过程的“痕迹”

通话记录表记录了催收员与债务人(或联系人)之间的每一次通话详情。它是构建“催收强度”和“触达率”特征的核心数据源。

字段名 数据类型 字段含义 业务说明
call_id STRING 通话记录唯一标识 主键
case_id STRING 关联案件ID 外键,关联案件表
caller STRING 主叫方 催收员ID或系统外呼号码
callee STRING 被叫方 债务人/联系人电话号码
call_type STRING 通话类型 如:外呼、呼入、三方通话
call_result STRING 通话结果 如:接通、无人接听、关机、空号、忙线
talk_duration INT 通话时长(秒) 仅接通时有值
call_start_time DATETIME 通话开始时间 精确到秒
contact_relation STRING 联系人关系 如:本人、配偶、父母、朋友
关键特征衍生: 基于通话记录表,可以衍生出大量高频特征,例如:
  • 催收频次: 每日/每周/每月的总通话次数。
  • 接通率: 接通次数 / 总通话次数。
  • 平均通话时长: 总通话时长 / 接通次数。
  • 有效通话占比: 通话时长超过30秒的通话占比。
  • 联系人多维度: 是否联系到本人、联系到本人的次数等。

3.5 还款计划表 (repay_plan):债务的“时间轴”

还款计划表记录了每笔案件的还款计划明细,包括每期应还金额、应还日期、实际还款情况等。它是判断债务人还款意愿和还款能力的重要依据。

字段名 数据类型 字段含义 业务说明
plan_id STRING 还款计划唯一标识 主键
case_id STRING 关联案件ID 外键
period_num INT 期数序号 第1期、第2期...
due_date DATE 应还日期 该期计划的最后还款日
due_amount DECIMAL 应还金额 该期应还本金+利息
actual_pay_date DATE 实际还款日期 NULL表示未还
actual_pay_amount DECIMAL 实际还款金额 部分还款时小于应还金额
pay_status STRING 还款状态 如:未还、部分还款、已还清、逾期
注意: 在特征工程中,due_date 与 actual_pay_date 的差值可以计算出“还款延迟天数”。对于多期案件,可以通过分析历史各期的还款行为(如是否经常逾期、是否部分还款)来构建“还款意愿”特征。

3.6 催收员操作表 (action_log):催收动作的“日志”

催收员操作表记录了催收员在案件上执行的所有操作,包括电话外呼、发送短信、标记催收结果、申请减免、发起委外等。它是分析催收员行为模式和案件处理效率的关键数据源。

字段名 数据类型 字段含义 业务说明
action_id STRING 操作记录唯一标识 主键
case_id STRING 关联案件ID 外键
collector_id STRING 催收员ID 执行操作的催收员
action_type STRING 操作类型 如:外呼、发送短信、标记承诺还款、申请减免、提交委外
action_result STRING 操作结果 如:成功、失败、待确认
action_content TEXT 操作内容/备注 催收员填写的备注信息
action_time DATETIME 操作时间 精确到秒
contact_type STRING 联系类型 如:电话、短信、微信、上门
特征工程切入点: 催收员操作表可以用于构建“催收员效率”特征,例如:
  • 操作频次: 每日/每周的操作次数。
  • 操作多样性: 使用的操作类型数量。
  • 承诺还款率: 标记“承诺还款”的次数占比。
  • 案件处理速度: 从案件分配到首次操作的时间间隔。

3.7 表关联关系总结:SQL JOIN 的“地图”

理解表之间的关联关系,是编写正确SQL查询的前提。下表总结了五张表之间的主要关联路径。

主表 关联表 关联键 关联类型 业务含义
case_info customer customer_id LEFT JOIN 获取案件对应的客户信息
case_info call_log case_id LEFT JOIN 获取案件的所有通话记录
case_info repay_plan case_id LEFT JOIN 获取案件的还款计划明细
case_info action_log case_id LEFT JOIN 获取案件的催收员操作记录
call_log action_log case_id + call_start_time ≈ action_time LEFT JOIN 将通话记录与催收员操作关联(时间近似匹配)
SQL 实战提示: 在后续章节中,我们将大量使用 LEFT JOIN 将案件表作为驱动表,关联其他子表进行特征聚合。例如:
SELECT
    c.case_id,
    c.overdue_days,
    COUNT(cl.call_id) AS total_calls,
    AVG(cl.talk_duration) AS avg_talk_duration
FROM case_info c
LEFT JOIN call_log cl ON c.case_id = cl.case_id
GROUP BY c.case_id, c.overdue_days;