每年評教都會遇到數據導入的一系列問題。從中收獲頗豐。
這兩天別人總在問我,你們基礎出了什麼問題,為什麼總在導數據。數據沒問題,為了做足准備,我們需要將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$ 也是秒秒鐘的事。
好玩的故事很多,下節繼續~