企业主数据(EnterpriseInfo)和外部工商数据(ExternalEnterpriseInfo)之间冗余字段

你这里其实遇到的是企业主数据(EnterpriseInfo)和外部工商数据(ExternalEnterpriseInfo)之间冗余字段的问题

目前问题:

  • EnterpriseInfo 里存了很多工商字段(法定代表人、注册资本、成立日期、经营范围等)。
  • ExternalEnterpriseInfo 里也存了一份类似字段。
  • 查询时,不知道该用哪个表,存在重复、维护成本高。

解决思路

1. 明确定位

  • EnterpriseInfo:作为主表,核心作用是“监控用的内部企业实体”,存最少必要字段(企业唯一标识、名称、是否外企、是否上市等核心属性)。
  • ExternalEnterpriseInfo:作为工商信息来源(外部同步/导入),存全部工商原始字段
  • 未来如果有更多外部来源(比如税务局、社保局),同样建 ExternalXXX 表。

这样,EnterpriseInfo 负责内部监控的“主体身份”,而工商信息完全交给 ExternalEnterpriseInfo


2. 字段裁剪方案

可以考虑:

  • EnterpriseInfo移除或废弃 重复的工商字段(比如 registered_capitalestablishment_datebusiness_scope 等)。
  • 保留内部业务强相关字段(比如 is_foreign_enterprise, total_revenue, insured_person_count)。
  • 关联查询时,直接 select_related("external_enterprise_info") 拉工商信息。

3. 查询优化方案

比如你要展示企业详情时:

enterprise = (
    EnterpriseInfo.objects
    .select_related("external_enterprise_info")
    .get(id=enterprise_id)
)

这样就能一次性拿到:

  • enterprise.enterprise_name(内部主表核心字段)
  • enterprise.external_enterprise_info.registered_capital(工商信息)
  • enterprise.external_enterprise_info.business_scope(工商信息)

避免字段重复维护。


4. 统一接口层

如果系统上层调用者不关心区分表,可以在 Serializer 层 做聚合:

class EnterpriseDetailSerializer(serializers.ModelSerializer):
    registered_capital = serializers.CharField(source="external_enterprise_info.registered_capital")
    business_scope = serializers.CharField(source="external_enterprise_info.business_scope")

    class Meta:
        model = EnterpriseInfo
        fields = [
            "id", "enterprise_name", "is_foreign_enterprise", "total_revenue",
            "registered_capital", "business_scope"
        ]

这样上层用的时候,仍然是 EnterpriseInfo 的序列化结果,但底层其实查的是 ExternalEnterpriseInfo


5. 历史兼容

  • 已经在 EnterpriseInfo 表里的工商字段,可以先标记为废弃字段(在代码和接口里不再使用),只保留数据库层方便过渡。
  • 新业务逻辑全部从 ExternalEnterpriseInfo 里取。
  • 后续可以考虑迁移/清理。

✅ 总结:

  • 主表(EnterpriseInfo)轻量化 → 只存内部监控核心字段。
  • 外部表(ExternalEnterpriseInfo)专职存工商信息
  • 查询时用 select_related 或 Serializer 聚合。
  • 废弃重复字段,减少冗余和维护成本。

Scroll to Top