前言:
如今同学们对“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省市区数据库表设计