欢迎投稿

今日深度:

数据库数据处理故事多

数据库数据处理故事多


每年评教都会遇到数据导入的一系列问题。从中收获颇丰。

这两天别人总在问我,你们基础出了什么问题,为什么总在导数据。数据没问题,为了做足准备,我们需要将8期版的最全的数据整理到10期数据库中。

背景介绍:问题在于从8期版基础系统到10期版基础系统在数据库设计方面有了很大的变化,例如10期学生表中存放着班级外键,而8期表中是用第三张表来维护关系的。10期的‘上课班’ 中需要课程和老师的关系,而再8期表中需要多个表才能将其关联起来。 20来张表,各种外键关联,最多的一个表存50多万条数据,怎么做,怎么做快 是摆在我们面前一个迫切需要解决的问题。

故事一:

由于8期表间都是通过第三张表联系起来的。而像1:n的关系10期表基本都是外键之间关联的。

例如,我想在10期表添加学生信息(包括学号,姓名,班级外键等)。我需要先从8期学生表中导出学生信息(不含班级外键)再从班级和学生的第三张表中导出学生和班级的关系,然后一一对比将两个表整合到一张表上去。

这样做是我们最初最天然的想法,当然效率低而且人工核对出错率极高。于是我们改用PlanB。在数据库中建立学生和第三张表的视图,然后将视图导出到excel。

故事二:

建立视图的时候,我们又遇到另一个问题。将两个表联合起来,发现学生总共为22052行,而视图总数为22191 行。如果数据没问题的话,这是不应该出现的。因为按道理来说,学生和班级两个表的n:1关系, 而且表数据无冗余。应该无论做链接还是右链接数据都是一样的。

\


于是我们用了一个查询语句 select ClassID from BasicClassEntities where ClassID not in(select ClassID from BasicStudentEntities) 先原谅我用了这样一条效率低的查询语句。我们查出来有正好139个班级里面没有学生。后来再研究发现原来这里面有100多虚拟行政班( 是为考试留的),也真的有三个班是由于人为失误没有加上关联。利用表和表之间的关系查询,是真的可以检查错误的,此处就不一一列举了。

故事三:

我想到了之前的一道面试题。于是自己建表实践了一下。如题是:A表有5条数据,B表有8条数据。如果两个表有3条公共数据,那么分别用交叉连接,左右连接能得到多少条数据。<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+yrXR6dK7o7rI5828PC9wPgo8cD5zdHVkZW50ILHtwO+1xMr9vt2hoyAgICAgICAgICAgICAgICAgCiAgICAgICB0ZWFjaGVyse3A77XEyv2+3TwvcD4KCjxwPjxpbWcgc3JjPQ=="http://www.2cto.com/uploadfile/Collfiles/20150601/2015060110063584.png" width="260" height="132" alt="\"> \

通过学生表和教师表分别进行右左连接,如图所示。

\

实验二:如图 在此基础上,将3条公共数据 改为不是一一对应,现在是有两个ID一样都和学生同一ID一致。

\

显示结果如下。

\

看!显示内容如下

\

故事四:

第一次将整理好的数据excel 复制到数据库中的时候,我们采取的方法是将excel字段和数据库字段设置成一致的然后之间 ctrl+c 再ctrl +v 。结果2万多学生需要10多分钟才能导入进去。于是我们利用数据库自带的导入excel功能,发现即便是50万数据也能瞬间搞定。只是导入后会新生成这样一个表。


然后从表数据到另一个表上 使用语句 insert into BasicStudentEntities select * from BasicStudentEntities$ 也是秒秒钟的事。

好玩的故事很多,下节继续~


www.htsjk.Com true http://www.htsjk.com/sybase/19726.html NewsArticle 数据库数据处理故事多 每年评教都会遇到数据导入的一系列问题。从中收获颇丰。 这两天别人总在问我,你们基础出了什么问题,为什么总在导数据。数据没问题,为了做足准备,我...
评论暂时关闭