You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PostgreSQL中通过属性配置替代硬编码实现数据分供应商分发

优化字段-供应商映射方案的分析与推荐

需求背景

我有一张存了数千行数据的security表,包含cusip、isin、sedol三个字段,需要按以下规则分发数据:

  • cusip数据全部发给vendor 1
  • isin数据发给vendor 1和vendor 2
  • sedol数据全部发给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 15:15:05