一些关于行政区划的冷知识

Categories:

行政区划是一套典型的树状结构数据。大多数系统对这种树状菜单都会设计成 id --> parent_id 等来实现上下级关联。 例如

idparent_idname层级hierarchy
1中国
111广东省省级
11111广州市市级
1111111天河区县级
111111111五山街道镇级

然而我司有个主数据。但主数据用的却是扁平结构。例如

国家id国家省id市id县id镇id是否冻结
CN中国440000广东省440100广州市440106天河区440106019五山街道

我所在的系统是从外部招标采购的二次开发的系统。行政区划已经存在,并采用了id--parent_id的设计。
面对从主数据接入行政区划的需求时,我想大多数开发人员都会觉得so easy。

1、增加主数据编码、是否有效字段

首先对系统内已有的行政区划,增加主数据的对应编码。

idparent_idname层级hierarchymdg_area_code是否有效state
1中国国级CN1
111广东省省级4400001
11111广州市市级4401001
1111111天河区县级4401061
111111111五山街道镇级4401060191

2、增加【接收主数据数据推送】的接口。

逻辑也比较简单。将主数据推送的扁平数据,转换成投策系统内的树状数据。

举例,假设主数据推送了

CN中国xxxxxxxx省xxxyyyyy市xxxzzzzz区xxxzzzwwwww街道

最多可能需要在我方系统内增加5条数据。逻辑如下:

  1. 判断 mdg_area_code=CN 数据是否存在。不存在,增加一条;存在,更新该条记录的name字段。
  2. 判断 mdg_area_code=xxxxxx 数据是否存在。不存在,增加一条;存在,更新name字段。
  3. 判断 mdg_area_code=xxxyyy 数据是否存在。不存在,增加一条;存在,更新name字段。
  4. 判断 mdg_area_code=xxxzzz 数据是否存在。不存在,增加一条;存在,更新name字段。
  5. 判断 mdg_area_code=xxxzzzwww 数据是否存在。不存在,增加一条;存在,更新name字段。

因为主数据是扁平推送,假设有一天【广东省】改名为【大粤省】,那么主数据会将广东省下近2000个镇级都推送一遍。

虽说我们直觉会很冗余很没必要,但其实问题不大,毕竟数据量小,而且这种改动还是比较少的,也不至于产生有什么性能问题。

没想到就这么点东西,居然翻车了。

问题一、虚拟直辖市

我们常见的行政区划是四级结构。比如广东省-广州市-番禺区-洛浦街道。

但在后续的运维中,我们就发现了某些特殊的三级结构。

举2个例子,在国务院的行政区划里,有

广东省—东莞市(市级)—桥头镇(镇级)

海南省—文昌市(县级)—东路镇(镇级)

其他的四级机构一般如下
440000广东省—440100广州市—440106天河区—440106019五山街道

为了保持四级结构的一致性,主数据里插入了虚拟的直辖市结点。如下图

440000广东省—440100东莞市(市级)—440100直辖市—440100222桥头镇(镇级)
550000海南省—550100文昌市(县级)—550100直辖市—550100222东路镇(镇级)

一个重要但奇怪的点是,我搞不懂我司的主数据为什么要把虚拟出的这个直辖市节点设置了和父级节点一样的编码?
另外一个不合理的点是,未按实际的市县层级设置虚拟节点。如虚拟的文昌直辖市放在了县级,但实际上文昌市只是县级单位。
我以为如果真要用直辖市来占位的话,似乎下面这样会合适点。

广东省——东莞市(市级)——直辖市——桥头镇(镇级)
海南省——直辖市——文昌市(县级)——东路镇(镇级)

如果只是单纯的作为联系地址、收件地址,这个级别可能不太重要。
但我司是房地产企业,很多公司制度、业务逻辑在市县级别是有差异的。

问题二、城市冻结

随着城市的发展,会有很多城市级别升级,比如南雄县升级为南雄市。

同样也有很多县被合并、被取消。

如果只是镇级单位被取消,被冻结,那么在扁平结构下也不会存在问题。

然而如果是市级、县级被冻结,单从主数据推送过来的数据来看,是无法判断的。

举例,整个【黑龙江省–伊春市—伊春区】被撤销了,但主数据那边推送过来的数据如下

CN中国230000黑龙江省230700伊春市230702伊春区230702002东升街道X
CN中国230000黑龙江省230700伊春市230702伊春区230702003前进街道X
CN中国230000黑龙江省230700伊春市230702伊春区230702001旭日街道X
CN中国230000黑龙江省230700伊春市230702伊春区230702004朝阳街道X
CN中国230000黑龙江省230700伊春市230702伊春区230702005红升街道X

光从上面的推送来看,我们只能看出东升街道等街道级的被冻结了,但是很难判断出是【伊春区】整个被冻结了。

如果你觉得本文对你有帮助或不错,可略表心意,请我喝一杯冰可乐。

Comments