数据库 拆分存储

问题描述

现在我有两张表 T1为 company表 address(详细地址) PS: 中国 浙江 杭州市 拱墅区...路...号....provinceId;//省IdcityId;//市IdzoneId;//区Idprovince;//省city;//市zone;//区T2表为 省市区地址及IDname 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 写道

解决方案

表结构和数据: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 utf8BEGIN declare result varchar(255) default ''; set result = reverse(substring_index(reverse(substring_index(f_string,f_delimiter,f_order)),f_delimiter,1)); return result;ENDCREATE 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)
解决方案二:
做关联呀,做关系表就行
解决方案三:
考虑效率的话,最好写mysql 存储过程,说下思路:1.遍历T1表。2.取出address字段,根据空格解析address(详细地址),不会的话搜索下:mysql split。3.根据2解析的数据,更新T1表。
解决方案四:
http://topic.csdn.net/t/20060922/14/5041077.html
解决方案五:
http://topic.csdn.net/t/20060922/14/5041077.html
解决方案六:
什么数据库?你想sql实现?还是java后台实现?

时间: 2024-11-01 21:39:23

数据库 拆分存储的相关文章

分布式数据库的存储设计改进

  分布式数据库的存储设计改进       目录 背景... 4 核心思想... 5 负载情况... 5 数据分布规则... 7 基本均衡策略... 8 列表... 8 范围... 9 取余(节点数为除数,即除以节点数取余数) 9 基本均衡策略的分析... 10 基本均衡策略下的数据重新分布... 11 组合均衡策略... 13 两个基本均衡策略的组合... 13 三个基本均衡策略的组合... 15 数据动态重新分布... 19 场景... 19 业务影响分析... 20 如何处理数据重新分布.

关于图片或者文件在数据库的存储方式归纳

商品图片,用户上传的头像,其他方面的图片.目前业界存储图片有两种做法: 1.  把图片直接以二进制形式存储在数据库中 一般数据库提供一个二进制字段来存储二进制数据.比如mysql中有个blob字段.oracle数据库中是blob或bfile类型   2.  图片存储在磁盘上,数据库字段中保存的是图片的路径.   一.图片以二进制形式直接存储在数据库中   第一种存储实现(php语言): 大体思路: 1.将读取到的图片用php程序转化成二进制形式.再结合insert into 语句插入数据表中的b

MySQL更改数据库数据存储目录

MySQL数据库默认的数据库文件位于/var/lib/mysql下,有时候由于存储规划等原因,需要更改MySQL数据库的数据存储目录.下文总结整理了实践过程的操作步骤.   1:确认MySQL数据库存储目录 [root@DB-Server tmp]# mysqladmin -u root -p variables | grep datadir   Enter password:   | datadir | /var/lib/mysql/     2:关闭MySQL服务 在更改MySQL的数据目录

Access数据库的存储上限

access|数据|数据库   Access数据库的存储上限Access 规格Microsoft Access 数据库规格Access 数据库 属性 最大值Microsoft Access 数据库 (.mdb) 文件大小 2G 字节减去系统对象所需的空间.数据库中的对象个数 32,768模块(包括"内含模块"属性为"是"的窗体和报表) 1,000对象名称中的字符数 64密码的字符个数 14用户名或组名的字符个数 20并发用户的个数 255 表 属性 最大值表名的字符

用ASP.NET 2.0在数据库中存储二进制文件

一.引言 在构建数据驱动的应用程序时,经常需要捕获文本和二进制数据.这样的程 序可能需要存储图像,PDF,Word文件或其它二进制数据.能够使用两种方式来 存储这些二进制数据:存储在web服务器的文件系统上并添加一个对数据库中相 应文件的引用:或直接存储在数据库本身. 文本数据,例如字符串,数字,日期,GUID,货币值,等等-在数据库系统中 都有适当的和相应的数据类型定义.例如,在Microsoft SQL Server中,你可以 使用int数据类型来存储一个整数值:而为了存储一个字符串值,你可

【ANDROID游戏开发十三】(保存游戏数据 [下文])详解SQLITE存储方式,并把SQLITE的数据库文件存储在SD卡中!!!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/329.html ----------------------- 『很多童鞋说我的代码运行后,点击home或者back后会程序异常,如果你也这样遇到过,那么你肯定没有仔细读完Himi的博文,第十九篇Himi专门写了关于这些错误的原因和解决方法,这里我在博客都补充说明下,省的童鞋们总疑惑这一块:请点击下面联系进入阅读:

数据库中存储大量图片设计

1.图像的存储策略 在数据库的 开发过程中,经常需要在数据库中存储一些备注信息,而这些备注信息的内容一般较大,格式多样-如有可能是语音文件.视频文件.图片文件.文本文件等,怎样 实现这些格式不同的备注文件的存取及预览,一直是开发人员比较关心的一个问题,本文系统的介绍了三种存取备注二进制信息的方法. 对备注二进制信息的存储可以采用以下三种方式: 方法一:文件保存在固定的路径下,数据库中存取文件路径和名称 方法二:数据库中用blob类型或者varbinary类型字段存储备注文件 方法三:在本地用Po

sqlite-使用android的SQLite数据库能存储多大数据

问题描述 使用android的SQLite数据库能存储多大数据 看到网上说SQLite数据库的大小是2TB,但是我觉得这个数据库不应该跟手机内存相联系吗?android上的SQLite数据库真的能容纳下2TB的数据吗??? 解决方案 很明显android上的SQLite数据库是放不下2TB的数据 解决方案二: 一个是sqlite数据库本身最大容量,但是sqlite数据库文件是放在手机上的,所以它也会受到手机存储空间大小限制的.对于android程序,你不能占有太多空间.可以把一些数据放服务器上.

基于分布式数据库的存储和hadoop的分布式计算的分布式sql计算方法

    1.  目录 2.      目录... 1 3.      背景和设计思想... 3 4.      架构... 3 没有代理节点... 4 有代理节点... 4 模块说明... 5 两种架构的区别... 5 5.      应用架构... 5 6.      基本概念说明... 6 7.      增删改操作... 6 8.      查询操作... 7 阶段树... 7 阶段... 7 查询步骤... 8 9.      例子... 8 均衡策略... 8 查询... 10 9..