你这里其实遇到的是企业主数据(EnterpriseInfo)和外部工商数据(ExternalEnterpriseInfo)之间冗余字段的问题。
目前问题:
EnterpriseInfo里存了很多工商字段(法定代表人、注册资本、成立日期、经营范围等)。ExternalEnterpriseInfo里也存了一份类似字段。- 查询时,不知道该用哪个表,存在重复、维护成本高。
解决思路
1. 明确定位
- EnterpriseInfo:作为主表,核心作用是“监控用的内部企业实体”,存最少必要字段(企业唯一标识、名称、是否外企、是否上市等核心属性)。
- ExternalEnterpriseInfo:作为工商信息来源(外部同步/导入),存全部工商原始字段。
- 未来如果有更多外部来源(比如税务局、社保局),同样建 ExternalXXX 表。
这样,EnterpriseInfo 负责内部监控的“主体身份”,而工商信息完全交给 ExternalEnterpriseInfo。
2. 字段裁剪方案
可以考虑:
- 从
EnterpriseInfo中 移除或废弃 重复的工商字段(比如registered_capital、establishment_date、business_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 聚合。 - 废弃重复字段,减少冗余和维护成本。