0 0

数据库 拆分存储5

现在我有两张表 T1为 company表
address(详细地址) PS: 中国 浙江 杭州市 拱墅区...路...号....
provinceId;//省Id
cityId;//市Id
zoneId;//区Id
province;//省
city;//市
zone;//区

T2表为  省市区地址及ID
name   ps:全国的地址(省市区全有)  
parentId     ps:每个省市区 对应的Id


如何将T1表中的address根据空格拆分出各个省市区 存入province,city,zone
在根据T2表找到T1表中province,city,zone找到对应的ID  存入T1表中对应的provinceId,cityId,zoneId

(数据量很大70W的数据量)
如何实现呢? 辛苦大神们 帮小弟解决下,小弟在此谢过了!

问题补充:MySQl数据库 还是sql实现吧,数据量有点大,我怕java后台内存泄漏,你要是方便的话,都实现下吧,我也想学学java处理大量数据时怎么做比较好
hudingchen 写道
什么数据库?你想sql实现?还是java后台实现?


问题补充:MySQl数据库 还是sql实现吧,数据量有点大,我怕java后台内存泄漏,你要是方便的话,都实现下吧,我也想学学java处理大量数据时怎么做比较好
hudingchen 写道
什么数据库?你想sql实现?还是java后台实现?


问题补充:怎么关联呢?
高级java工程师 写道
做关联呀,做关系表就行


问题补充:
hudingchen 写道
考虑效率的话,最好写mysql 存储过程,说下思路:
1.遍历T1表。
2.取出address字段,根据空格解析address(详细地址),不会的话搜索下:mysql split。
3.根据2解析的数据,更新T1表。

对不起,可以详细写一下么,好帮助我理解下。谢了

6个答案 按时间排序 按投票排序

0 0

采纳的答案

表结构和数据:

mysql> desc t1;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| provinceid | varchar(45)  | YES  |     | NULL    |                |
| cityid     | varchar(45)  | YES  |     | NULL    |                |
| zoneid     | varchar(45)  | YES  |     | NULL    |                |
| province   | varchar(45)  | YES  |     | NULL    |                |
| city       | varchar(45)  | YES  |     | NULL    |                |
| zone       | varchar(45)  | YES  |     | NULL    |                |
| address    | varchar(200) | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+

mysql> desc t2;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(11)     | NO   | PRI | NULL    | auto_increment |
| name     | varchar(45) | YES  |     | NULL    |                |
| parentld | varchar(45) | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+

mysql> select * from t1;
+----+------------+--------+--------+----------+------+------+-------------------------------------------+
| id | provinceid | cityid | zoneid | province | city | zone | address                                   |
+----+------------+--------+--------+----------+------+------+-------------------------------------------+
|  1 |            |        |        |          | NULL | NULL | 中国 浙江1 杭州市1 拱墅区1 2路            |
|  2 | NULL       | NULL   | NULL   |          | NULL | NULL | 中国 浙江2 杭州市2 拱墅区2 2路            |
+----+------------+--------+--------+----------+------+------+-------------------------------------------+
2 rows in set (0.00 sec)

mysql> select * from t2;
+----+------------+----------+
| id | name       | parentld |
+----+------------+----------+
|  1 | 浙江1      | p01      |
|  2 | 浙江2      | p02      |
|  3 | 杭州市1    | c01      |
|  4 | 杭州市2    | c02      |
|  5 | 拱墅区1    | z01      |
|  6 | 拱墅区2    | z02      |
+----+------------+----------+
6 rows in set (0.00 sec)


存储过程:

CREATE FUNCTION func_get_split_string(
f_string varchar(1000),f_delimiter varchar(5),f_order int) RETURNS varchar(255) CHARSET utf8
BEGIN
  declare result varchar(255) default '';
  set result = reverse(substring_index(reverse(substring_index(f_string,f_delimiter,f_order)),f_delimiter,1));
  return result;
END

CREATE PROCEDURE split_data()
BEGIN
    DECLARE tid int DEFAULT 0;    
    DECLARE address_name VARCHAR(200) DEFAULT "";
    DECLARE province_name VARCHAR(200) DEFAULT "";
    DECLARE city_name VARCHAR(200) DEFAULT "";
    DECLARE zone_name VARCHAR(200) DEFAULT "";
    
    DECLARE province_id VARCHAR(200) DEFAULT "";
    DECLARE city_id VARCHAR(200) DEFAULT "";
    DECLARE zone_id VARCHAR(200) DEFAULT "";
    
    DECLARE done INT DEFAULT 0;

    
    DECLARE cur CURSOR FOR SELECT id,address FROM t1;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    
    
    OPEN cur;
    address_lb:LOOP
       FETCH cur INTO tid,address_name;
       SELECT func_get_split_string(address_name,' ',2) INTO province_name;
       SELECT func_get_split_string(address_name,' ',3) INTO city_name;
       SELECT func_get_split_string(address_name,' ',4) INTO zone_name;
       
       SELECT parentld INTO province_id FROM t2 WHERE name = province_name;
       SELECT parentld INTO city_id FROM t2 WHERE name = city_name;
       SELECT parentld INTO zone_id FROM t2 WHERE name = zone_name;
       
       UPDATE t1
          SET province   = province_name,
              city       = city_name,
              ZONE       = zone_name,
              provinceid = province_id,
              cityid     = city_id,
              zoneid     = zone_id
        WHERE id = tid;
        
       IF done = 1 THEN
           LEAVE address_lb;
       END IF;
    END LOOP address_lb;
    
    CLOSE cur;
    commit;
END


执行:
mysql> call split_data();
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t1;
+----+------------+--------+--------+----------+------------+------------+-------------------------------------------+
| id | provinceid | cityid | zoneid | province | city       | zone       | address                                   |
+----+------------+--------+--------+----------+------------+------------+-------------------------------------------+
|  1 | p01        | c01    | z01    | 浙江1    | 杭州市1    | 拱墅区1    | 中国 浙江1 杭州市1 拱墅区1 2路            |
|  2 | p02        | c02    | z02    | 浙江2    | 杭州市2    | 拱墅区2    | 中国 浙江2 杭州市2 拱墅区2 2路            |
+----+------------+--------+--------+----------+------------+------------+-------------------------------------------+
2 rows in set (0.00 sec)

2012年3月13日 09:15
0 0

做关联呀,做关系表就行

2012年3月12日 12:29
0 0

考虑效率的话,最好写mysql 存储过程,说下思路:
1.遍历T1表。
2.取出address字段,根据空格解析address(详细地址),不会的话搜索下:mysql split。
3.根据2解析的数据,更新T1表。

2012年3月12日 12:27
0 0
0 0

http://topic.csdn.net/t/20060922/14/5041077.html

2012年3月12日 12:25
0 0

什么数据库?你想sql实现?还是java后台实现?

2012年3月12日 11:03

相关推荐

    微服务:如何拆分共享数据库?

    在分解单体应用程序到微服务体系架构时,重点考虑独立数据库拆分是很重要的。您需要想出一个可靠的策略,将您的数据库分割为多个与应用程序对齐的小型数据库。简而言之,您需要将您的应用程序/服务从使用单一的共享...

    Access中利用拆分后端数据库保存不同数据

    数据库拆分是指将一个大型数据库拆分成多个小型数据库,每个小型数据库保存特定的数据集。这样可以减少数据库的大小,提高数据的存储和检索效率。在 Access 中,我们可以通过将数据库拆分成多个文件,每个文件保存...

    拆分数据库中某列某行的数据,大量处理

    本文将深入探讨如何在三层架构中拆分数据库中的某列某行数据,并根据任意字符进行拆分和更新,以实现高效的数据处理。 首先,让我们理解什么是三层架构。三层架构是一种常见的软件设计模式,它将应用分为三个主要...

    关于数据库表拆分.docx

    为了解决这个问题,又拍网采用了数据库拆分策略。数据库拆分分为垂直拆分和水平拆分。垂直拆分是根据功能模块将表分布到不同数据库,例如将群组相关表与照片相关表分开,这种方式简单但可能无法完全解决问题。相比之...

    一分钟掌握数据库垂直拆分

    其中,数据库拆分是常用的一种手段,它能够有效减轻单一数据库的压力。本文将详细介绍“一分钟掌握数据库垂直拆分”的相关内容,帮助读者快速了解垂直拆分的基本概念、应用场景及其实现原理。 #### 二、水平拆分与...

    MySQL迁移、拆分技巧.pptx

    MySQL迁移与拆分是数据库管理中非常重要的技能,通过合理的设计和实现可以有效提升系统的性能和可用性。本文档详细介绍了迁移的分类、步骤以及拆分的方法和技巧,希望能为从事MySQL管理工作的技术人员提供帮助。在...

    基于mybatis框架,数据库垂直、水平拆分及读写分离实现

    总结来说,基于MyBatis的数据库拆分和读写分离实现,涉及到对MyBatis框架的深入理解和扩展,包括对SqlSessionTemplate的改造、数据库拆分策略的设计(如垂直拆分和水平拆分的一致性哈希)、以及读写分离的路由机制。...

    MYSQL数据库数据拆分之分库分表总结

    MySQL数据库在面对大规模数据存储时,常常需要采取数据拆分策略,即分库分表,以应对性能瓶颈和存储限制。本文将详细讲解这一过程及其相关的知识点。 首先,单库单表是最基础的数据库设计模式,但随着用户数量的...

    数据库+分表分库+垂直拆分与水平拆分

    分表分库是指将一个大的数据表或数据库拆分成多个较小的数据表或数据库的过程。这种做法能够有效提升数据库的扩展性,并通过降低单个表的大小来提高查询效率。分表分库通常有两种方式:垂直拆分和水平拆分。 #### ...

    MDB数据库编辑器2012汉化版

    首先,MDB是Microsoft Access的默认数据库文件格式,用于存储结构化的数据,包括表、查询、窗体、报表、宏和模块等元素。MDB数据库编辑器2012汉化版提供了一个直观的界面,让用户无需深入掌握复杂的SQL语言,也能...

    数据库概论数据库存储.pptx

    数据库存储是数据库系统的核心组成部分,它涉及到数据的物理存储、访问效率和数据安全。本篇主要探讨了数据库存储中的几个关键概念,包括物理存储介质、RAID技术、缓冲区管理、存储结构、索引以及大数据存储。 首先...

    数据库分库分表存储分析思路

    数据库分库分表存储分析思路 在大数据量存储时,如何解决常见问题和实施合理的解决方案是非常重要的。数据库分库分表存储是解决大数据量存储的有效方法之一,但是它也存在一些问题,例如join操作问题、事务问题、...

    示例3 如何曝露数据库存储过程

    1. **模块化设计**:将复杂业务逻辑拆分为多个小型存储过程,便于维护和测试。 2. **异常处理**:在存储过程中添加异常处理机制,确保在出现错误时能正确处理。 3. **文档记录**:清晰记录每个存储过程的功能、参数...

    gdb数据库批量裁剪arcgis工具

    `空间规划数据库批量拆分.tbx`是一个Toolbox(工具箱)文件,它包含了一系列相关工具,可能包括用于批量裁剪gdb数据库的脚本或模型。在ArcGIS中,Toolbox可以组织和分类不同的geoprocessing工具,方便用户查找和执行...

    SQLServer数据库设计和实现

    《SQLServer数据库设计和实现》一书由赵士山撰写,深入探讨了SQL脚本编程,包括存储过程和触发器的使用。在数据库设计中,规范化的范式理论是核心内容,它指导我们如何构建高效、稳定的数据库结构。 首先,第一范式...

    K3数据库工具.rar

    再者,分离数据库功能允许我们将一个正在使用的数据库拆分成两个部分,即数据文件和日志文件。这样做的好处在于,可以在不影响数据库服务的情况下,单独备份或移动某个数据库的部分组件。这对于数据库的迁移、升级或...

    Oracle数据库对象管理及备份与恢复.pdf

    分区是Oracle数据库提供的一种将表或索引拆分成更小部分的机制,有助于改善性能和可管理性。分区类型包括散列分区、列表分区、范围分区、组合分区等。管理分区表包括增加分区、交换分区、修改分区表名称和重组分区等...

Global site tag (gtag.js) - Google Analytics