龙空技术网

中国省市县级联菜单,设计数据库表,把开源项目转换SQL入库

flyiot 853

前言:

如今同学们对“mysql省市区数据库表设计”大致比较看重,咱们都需要学习一些“mysql省市区数据库表设计”的相关资讯。那么小编在网摘上网罗了一些关于“mysql省市区数据库表设计””的相关文章,希望小伙伴们能喜欢,兄弟们一起来学习一下吧!

#头条创作挑战赛#

目录1,关于省市县数据2,使用china-regions项目3,总结1,关于省市县数据

github上有中国的省市县开源项目,找到一个特别评分高的项目2.9K星星:

我修改的代码放到这里了,包括脚本和SQL:

设计思路,这个项目有多种方式的接入。

1,json文件,放服务端客户端都行,直接数据写死了。

2,数据库的ddl文件直接存储到数据库中。

个人偏向第二中,存储到数据库中,可以方便维护点,同时在做数据处理分析的时候。

可以直接 join 表,数据的修改查询也很方便。

2,使用china-regions项目

git clone  china_regions/mysql # 有数据库相关脚本

但是现在有个问题,这个数据库的脚本是分3个表的,本身数据量也不大,没有必要分成三个表。

于是合并成一个 region 表得了。同时发现这个地区编码,为了兼容乡村使用的是 12 位的。

如果要是使用省市区,使用前 6 位就可以了。

数据库表设计:

CREATE TABLE `region` (  `id` varchar(10) NOT NULL COMMENT '地区主键编号',  `name` varchar(50) NOT NULL COMMENT '地区名称',  `parent_id` varchar(10) DEFAULT NULL COMMENT '地区父id',  `level` int(2) DEFAULT NULL COMMENT ' 1-省、自治区、直辖市 2-地级市, 3-市辖区、县',  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='地区表';-- 默认,父节点和level 都是0 

但是现在有个问题,没有提供相关的数据库文件,是拆分的。

不用担心,作者已经有个python 的脚本了。直接修改 python 代码,自定义生成一个表就行了。

上pyhton3脚本,修改下官方的脚本就可以了:

# -*- coding:utf-8 -*-import jsonimport osimport codecsfrom collections import OrderedDictddl = """CREATE TABLE `region` (  `id` varchar(10) NOT NULL COMMENT '地区主键编号',  `name` varchar(50) NOT NULL COMMENT '地区名称',  `parent_id` varchar(10) DEFAULT NULL COMMENT '地区父id',  `level` int(2) DEFAULT NULL COMMENT ' 1-省、自治区、直辖市 2-地级市, 3-市辖区、县',  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='地区表';"""sql_tmp =  "INSERT IGNORE INTO region ('id', 'name', 'parent_id', 'level') VALUES ('%s', '%s', '%s', '%s');\n"region_path = "mysql-region"def make_data():    #只读取省市县数据。    source_file_list = ['county', 'city',  'province' ]    for k in list(reversed(source_file_list)):        data = codecs.open('json/%s.json' % k, 'r', 'utf-8').read()        json_data = json.loads(data)        mysql_data_list = []        if k == 'province':            for index, province in enumerate(json_data):                tmp_id = province['id']                mysql_data = sql_tmp % (province['id'][0:6], province['name'], 0, 1)  # noqa                mysql_data_list.append(mysql_data)        if k == 'city':            index = 0            for province_id in sorted(json_data.keys()):                for city in json_data[province_id]:                    index += 1                    mysql_data = sql_tmp % (city['id'][0:6], city['name'], province_id[0:6], 2)  # noqa                    mysql_data_list.append(mysql_data)        if k == 'county':            index = 0            for city_id in sorted(json_data.keys()):                for county in json_data[city_id]:                    index += 1                    mysql_data = sql_tmp % (county['id'][0:6], county['name'], city_id[0:6], 3)  # noqa                    mysql_data_list.append(mysql_data)        if k in ['province', 'city', 'county']:            out_mysql = codecs.open(region_path + '/%s.sql' % k, 'w', 'utf-8')            index = 0            start = 0            while start < len(mysql_data_list):                end = start + 1000                out_mysql.write(''.join(mysql_data_list[start:end]))                start = end            out_mysql.close()def main():    if not os.path.exists(region_path):    	os.mkdir(region_path)    make_data()if __name__ == '__main__':    main()

然后生成了省市区的相关的SQL代码:

INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('110000', '北京市', '0', '1');INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('120000', '天津市', '0', '1');INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('130000', '河北省', '0', '1');INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('140000', '山西省', '0', '1');INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('150000', '内蒙古自治区', '0', '1');INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('210000', '辽宁省', '0', '1');....INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('110101', '东城区', '110100', '3');INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('110102', '西城区', '110100', '3');INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('110105', '朝阳区', '110100', '3');INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('110106', '丰台区', '110100', '3');INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('110107', '石景山区', '110100', '3');INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('110108', '海淀区', '110100', '3');INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('110109', '门头沟区', '110100', '3');.....INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('110101', '东城区', '110100', '3');INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('110102', '西城区', '110100', '3');INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('110105', '朝阳区', '110100', '3');INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('110106', '丰台区', '110100', '3');INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('110107', '石景山区', '110100', '3');INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('110108', '海淀区', '110100', '3');INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('110109', '门头沟区', '110100', '3');共  3644 条记录....

数据都对 1 ,2 , 3 级数据都关联对了,同时对字符串进行裁剪了下,之前的区号是12 位,包括到乡镇。

这个是6 位符合邮编代码。其他的数据就不用了。

3,总结

单个数据表可以解决 省市区的问题,要是到乡镇的话还是拆分成小表比较好。

查询速度也快了。要是就着三级查询,合并成一张表就行。

这个项目本地也可以启动

cd location-demo

npm install

npm run start

就可在 访问了。

标签: #mysql省市区数据库表设计