2010-09-15 42 views
1

我有7個MySQL表,其中包含大約17000行中的部分重疊和冗餘數據。所有表格都包含學校的名稱和地址。有時候同一所學校的名字略有不同,有時同一所學校會出現在多個表格中,同樣的名稱或地址也會有細微差別。幫助正常化數據庫的建議和工具

我的任務是創建一個帶有ID,名稱和城鎮/城市ID字段的表,其中將包含來自7個表的數據。將有一個單獨的表爲id和名稱字段的城鎮。

由於原始表格沒有用於城市的單獨字段這一事實使其變得複雜,因此必須從具有非常不同格式的數據的地址字段中提取。

我意識到這些大部分都必須手動完成,我已經硬化了我的靈魂,並且我已經準備好處理這將給我帶來的活生生的地獄。我的問題是:

  • 你將如何開始這樣的任務?什麼是智能策略儘可能多地實現自動化?
  • 有沒有可以提高速度的工具?比如可以比較字符串的東西,確定他們的「相似性」並提出可能的重複?

謝謝!

回答

2

雖然使用Oracle而不是MySQL,但我曾經這樣做過一次。 17000條記錄是一個可管理的記錄數量,但足以使它成爲值得構建的工具。

維基百科有lists of schools pretty much all over the world,但唉,不適用於匈牙利。這很遺憾,因爲最好是在系統中擁有應該擁有的數據列表,而不是試圖從斷開的數據庫中重建它。如果你能得到這樣的清單,那麼你可以比較你的記錄而不是相互比較,這將是有用的。即使你可以掌握仍然有用的郵政編碼和城市名稱列表。

說到模糊匹配字符串,有一些統計技巧可用。常見的是Levenshtein距離。這給出指示兩個字符串之間的相似性的分數,表示爲從字符串A到字符串B(AKA編輯距離)獲得的變化的數量。 Code Janitor有一個針對MySQL的實現,但這僅僅是Google的熱門應用,並且沒有我的保證。 Find it here。 Jaro Winkler是另一種匹配算法,但在互聯網上似乎有更少的實現。

一般加工暗示

  • 提取所有的學校名稱和地址到一個表,其中表明各行的出處(數據庫,表,主鍵)的元數據。
  • 添加列以保存搜索字符串,用於學校名稱和地址。例如,有一列刪除了標點和數字(在一些匹配算法中,THMAS比TH0MAS更接近THOMAS)。
  • 在另一列允許常見拼寫錯誤(在英國地址中,字符串SW!^很可能代表SW16,即Streatham的郵編)。
  • 在這些搜索列上構建FullText索引,以幫助挑選城市名稱等常見詞的出現。
  • 如果您擁有大量的數據和耐心,建立一個詞庫來識別Rd,St,Blvd等常見的宮縮可能是一個有用的練習,但它可能不值得17000行。
  • 使用正則表達式來匹配模式,如郵政編碼。
+0

謝謝你的出色建議!我寫了一個快速perl腳本從教育部網站下載所有匈牙利學校的列表,並從數據中生成sql插入語句。這爲我節省了大約2周的時間。再次感謝!! – neo2862 2010-09-16 10:03:35