我是一段不羁的公告!
记得给艿艿这 3 个项目加油,添加一个 STAR 噢。
https://github.com/YunaiV/SpringBoot-Labs
https://github.com/YunaiV/onemall
https://github.com/YunaiV/ruoyi-vue-pro

数据库实体设计 —— 公用(3.1)之地区信息

艿艿目前正在做一个开源的电商项目,胖友可以 star 下。https://gitee.com/zhijiantianya/onemall

1. 概述

本文主要分享公用模块的地区信息的数据库实体设计

基于如下信息,逆向猜测数据库实体:

【护脸旁白】
笔者非电商行业出身 && 非有赞工程师,所以有错误或不合理的地方,烦请斧正和探讨。
有赞是个各方面都很 NICE 的公司,推荐

2. 背景了解

在大多数系统里,都需要用到地区信息。例如:

  1. 用户添加收货地址
  2. 用户设置所在地

那么为系统提供一套公用的地区信息就非常有必要。

一般情况下,我们可以将地区进行分级:

  1. 国家
  2. 省份
  3. 城市
  4. 县区
  5. 街道

对于大多数系统,一般整理到区县级别即可。

3. 数据库实体

整体实体类关系如下图:

3.1 CommonRegion

CommonRegion ,公用地区。

/**
* 地区编号
*/
private Integer id;
/**
* 名字
*/
private String name;
/**
* 级别
*
* 1-国家
* 2-省份
* 3-城市
* 4-区县
* 5-街道
*/
private Integer level;
/**
* 父地区编号
*/
private Integer parentId;
/**
* 拼音
*/
private String pinyin;
  • id ,地区编号。
  • name ,地区名。
  • level ,级别,按照我们上面说的枚举。
  • pid ,父地址编号。
  • pinyin ,拼音,例如 "beijing" 。可以使用 jpinyin 根据 name 生成。该字段用于对地名根据字幕排序的需求。

3.2 数据

胖友可以解析 youzan_regions.json ,生成自己的地区库数据。有如下注意点:

  1. 数据来自有赞 API ,感谢有赞。笔者简单对比了下淘宝的数据,基本一致。
  2. 该数据包括省份、城市、区县。如果胖友需要国家、街道,需要另外找数据源。
  3. 解析时,可以创建 id = 1 的中国为父地区,并修改所有省份地区的 parentId = 1
  4. 该地区库存在一个占位规律:
    • 第一二位:省份,例如浙江省为 330000 。
    • 第三四位:城市,例如杭州市为 330100 。
    • 第五六位:区县,例如上城区为 330102 。
  5. 未来添加其他国家时,控制 id 范围在 [1, 1000] 之间,避免冲突。
  6. 未来添加区域数据时,第七八九位为街道,例如清波街道为 330102001 。原有地区数据的编号不要动,避免影响关联数据。

胖友也可以解析 yunai_regions.json ,生成自己的地区库数据。有如下注意点:

  1. 数据来源笔者不太记得了,可能来自淘宝。
  2. 该数据包括国家、省份、城市、区县。如果胖友需要街道,需要另外找数据源。
  3. 数据和有赞 API 基本一致。

胖友还可以了解 worldArea 开源项目,其提供了:

MySQL 数据库脚本,包含世界各地区的地区编码以及中文名称。


笔者建议,时间允许的情况下,三种方式都了解下,地区库是十分重要的,且定义好后,不方便轻易调整

4. API

基于如下整理 API 类。

4.1 CommonRegoinAPI

CommonRegoinAPI ,地区 API 。

5. 踩坑

  1. 国家的地区不是静止不变的,不断的会有地区和地区之间的合并,又或者是地区的分拆。因此,笔者建议可以以淘宝的地区库为准。
  2. 地区的分级只是大体的分级,实际上,会存在镇级市、县级市等等。
  3. 如果对接其他公司的服务,地区编号可能存在不同,需要做好映射关系。
  4. 如果胖友有基于微信公众号的产品,一些用户设置所在地为国外,可以基于自己产品的情况,保存用户信息可以存储成中国。

666. 彩蛋

简单小文一篇。

后续会继续分享,手机段、IP 归属地等等的设计和数据信息。

总访客数 && 总访问量