MySQL分表

针对于mysql进行分表

首先看一下这张表

lagou_position_source(源数据表)

 

严重的数据冗余

4914591    西安        产品运营专员    数据服务,分类信息    5    8    3-5年    大专    运营|编辑|客服类 - 运营    全职    五险一金,周末双休    2018-07-26 15:05:05    2018-07-26 07:29:00    105728    北佳信息    陕西北佳信息技术有限责任公司    150-500人    不需要融资
4914592    杭州        销售管理实习生    信息安全,数据服务    2    3    应届毕业生    本科    市场|商务|销售类 - 销售    实习    全员MAC,独角兽公司    2018-07-26 15:05:05    2018-07-26 07:29:00    6502    同盾科技    同盾科技有限公司    500-2000人    C轮
4914589    杭州        省区经理(浙江)    移动互联网,医疗健康    6    10    不限    大专    市场|商务|销售类 - 销售    全职    双休,工作灵活,大平台    2018-07-26 15:04:44    2018-07-26 07:29:00    284208    神中科技    杭州神中科技有限公司    50-150人    天使轮
4914587    北京        风控算法工程师    电子商务,金融    20    40    不限    本科    开发|测试|运维类 - 人工智能    全职    六险一金,团队氛围好    2018-07-26 15:04:43    2018-07-26 07:29:00    19243    趣店    趣分期(北京)信息技术有限公司    500-2000人    上市公司
4914588    上海        大数据分析    移动互联网,硬件    18    30    3-5年    本科    开发|测试|运维类 - 数据开发    全职    五险一金,正式编制,交通便利,节假日福利    2018-07-26 15:04:43    2018-07-26 07:29:00    146293    闻善科技    深圳闻善科技有限公司    50-150人    不需要融资

不满足范式

所有我们需要进行分表,同时迁移里面的数据

思路:首先源数据表lagou_position_source

暂且我们直观的可以分出城市区域表(city)、公司表(company)、和职位表(position)

我们以简单粗暴的方式创建

首先来一张公司表

drop table IF EXISTS lagou_company;
create table lagou_company
    select  distinct company_id,company_short_name,
      company_size,company_full_name,financestage
    from lagou_position_new;

查询出来的数据

成功的分出来一张公司表

现在来分析城市表(根据原有数据是有局限的)

原因只是显示公司所在区域,下次添加一条记录,我需要地区根本无从选择

所以在此需要有一个完整的区域表

区域表

此表也是需要分离

得到需要的字段(关联方式为id,parentId)话不多说同理

分离方法

drop table if exists lagou_city;
create table lagou_city as
select s3.id cid,s1.cityName province,s2.cityName city,s3.cityName district from s_provinces s1
  right join s_provinces s2 on s2.parentId = s1.id
  right join s_provinces s3 on s3.parentId = s2.id
union
select s2.id,s1.cityName,s2.cityName,null from s_provinces s1
  right  join s_provinces s2 on s2.parentId = s1.id ;

最后得到city表

最后剩下position 既然分离出去了必定要有关联

所以该删的删该加的加原有的city、district改为 position_city表的ID即可

方法

drop table  if exists lagou_position;
create table lagou_position as
SELECT p.pid,p.company_id,c.cid,p.position,
p.field,p.salary_min,p.salary_max,p.workyear,
p.education,p.ptype,p.pnature,p.advantage,p.published_at,p.updated_at
FROM (SELECT *
        FROM lagou_position_source
        WHERE district IS NULL) p
    JOIN lagou_city c ON (c.city LIKE concat(p.city, '%') AND c.district IS NULL )
union
select p.pid,p.company_id,c.cid,p.position,
  p.field,p.salary_min,p.salary_max,p.workyear,
  p.education,p.ptype,p.pnature,p.advantage,p.published_at,p.updated_at
from (select * from lagou_position_source where district is not null)p
  join lagou_city c on (c.city like concat(p.city,'%')
and c.district like concat(p.district,'%'));

lagou_position表

结论:两个原(lagou_position_source)、(s_provinces)表分离成最后

lagou_position;
lagou_city ;
lagou_company;

 

posted on 2018-09-13 20:19  东子z  阅读(135)  评论(0编辑  收藏  举报

导航