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

#头条创作挑战赛#

目录

1,关于省市县数据


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

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

https://github.com/freewebsys/china_regions_lite

设计思路,这个项目有多种方式的接入。
1,json文件,放服务端客户端都行,直接数据写死了。
2,数据库的ddl文件直接存储到数据库中。

个人偏向第二中,存储到数据库中,可以方便维护点,同时在做数据处理分析的时候。
可以直接 join 表,数据的修改查询也很方便。

2,使用china-regions项目


git clone https://github.com/wecatch/china_regions.git

cd 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 json
import os
import codecs
from collections import OrderedDict

ddl = """

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');
"
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

就可在 http://localhost:4200/ 访问了。

展开阅读全文

页面更新:2024-03-01

标签:门头沟区   石景山区   丰台区   省市   西城区   项目   省市区   县级   中国   脚本   菜单   数据库   地区   数据

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top