如何在PostgreSQL中通过属性配置替代硬编码实现数据分供应商分发
优化字段-供应商映射方案的分析与推荐
需求背景
我有一张存了数千行数据的security表,包含cusip、isin、sedol三个字段,需要按以下规则分发数据:
cusip数据全部发给vendor 1isin数据发给vendor 1和vendor 2sedol数据全部发给vendor 3
目前是在Python代码里硬编码字段和供应商的映射关系,想找更优的解决方案,我自己提出了三个思路,下面逐个分析:
方案1:给security表新增vendor_name列
- 操作方式:给表中每一行数据指定对应的供应商名称
- 优势:逻辑直观,查询时直接关联字段就能拿到对应供应商
- 劣势:
- 数据冗余爆炸:比如
isin要发给两个供应商,每行都得存两条重复数据(或者用多值列,反而增加复杂度) - 维护成本极高:以后加字段或者改供应商规则,得批量更新所有行的数据
- 违反数据库设计范式,很容易出现数据不一致的问题
- 数据冗余爆炸:比如
方案2:用字段注释存储供应商映射规则
- 操作方式:给
security表的每个字段加注释(比如cusip的注释写vendor1,isin的注释写vendor1,vendor2),然后用下面的SQL语句提取注释信息:
SELECT pg_catalog.col_description(c.oid, a.attnum) AS column_comment, a.attname FROM pg_catalog.pg_class c JOIN pg_catalog.pg_attribute a ON a.attrelid = c.oid WHERE c.relname = 'security' AND a.attnum > 0 AND NOT a.attisdropped;
- 优势:
- 不用额外建表,直接用数据库自带的元数据功能
- 规则和字段绑定,看字段的时候就能知道分发规则
- 劣势:
- 注释是纯文本,解析的时候得额外处理(比如分割多供应商),很容易出格式错误
- 注释本来是用来写字段说明的,混着存业务规则会降低可读性
- 扩展能力有限:以后要是需要更复杂的规则(比如按数据值分发),注释根本满足不了
方案3:创建独立元数据表存储映射规则
- 操作方式:新建一张元数据表(比如叫
field_vendor_mapping),包含column_name(字段名)和vendor_name(供应商名)两列,每条记录对应一个字段-供应商的映射关系。示例表结构:
CREATE TABLE field_vendor_mapping ( column_name VARCHAR(50) NOT NULL, vendor_name VARCHAR(50) NOT NULL, PRIMARY KEY (column_name, vendor_name) );
- 插入初始规则数据:
INSERT INTO field_vendor_mapping (column_name, vendor_name) VALUES ('cusip', 'vendor1'), ('isin', 'vendor1'), ('isin', 'vendor2'), ('sedol', 'vendor3');
- 优势:
- 完全符合数据库设计范式,没有数据冗余
- 规则维护超灵活:以后加字段、改供应商,只需要修改元数据表就行,不用动业务代码或者主表数据
- 扩展性强:未来还能加字段(比如
rule_type、active状态)支持更复杂的分发逻辑 - 规则一目了然,可读性高,团队协作维护起来很方便
- 劣势:需要额外维护一张表,但这点成本和带来的收益比起来几乎可以忽略
最终推荐
优先选方案3,它在扩展性、维护性、规范性上都是最优的,完全能应付以后新增字段、调整规则的需求。如果暂时不想新建表,方案2可以作为过渡,但长远来看方案3是更稳健的选择。
内容的提问来源于stack exchange,提问作者Sachin
相关产品推荐
相关产品推荐

