2013-02-20 131 views
4

我有一個學區數據庫(約15,000人和增長)以及退休計劃/福利可用於每個員工。該數據是相當不錯標準化:反規範化的建議

  • A區記錄與
  • A區記錄與相關0或ñ退休計劃選項(其中ñ < 10鋪開3連接表)關聯0或n好處(其中n從1個連接的表格更接近於40)
  • 區域還與其他關聯數量相似的其他事物相關聯。

現在客戶想報告。而且他們希望以非常動態的方式進行報告(想想一下iTunes智能播放列表,您可以在任何地區,計劃或優惠的任何地方添加/刪除規則)。我需要讓他們查詢某個地區的任何財產,其退休計劃或其利益,並返回的一切。爲了讓事情變得簡單(現在)並避免重複的數據,我設置了幾個視圖(噓,我知道),它允許我以任何1區記錄的方式訪問數據與all_retirement_plans視圖和all_benefits_plans視圖具有一對一的關係,並與all_benefits_plans視圖具有一對一的關係。這給了我一套乾淨的連接,導致了一個統一的結果集,但顯然帶有它自己的問題,我打算早點擊,而不是晚點...

也就是說,它會得到可笑地隨着更多數據的添加而變慢。

我在尋找有關反規範化的建議。我曾想過一個報告表,它可以完成視圖的工作,但可以編入索引。我也想過把這整個區域數據轉儲到MongoDB(或類似的)。我相信還有其他的選擇,但我會玩試驗和錯誤遊戲,所以我希望這裏的某個人能夠以一種合理的解決方案讓我參與進來。

底線是我需要能夠存儲〜15,000(和增長)的區域記錄以及大量額外的元數據,然後以非常細化的級別報告這些數據。除了我自己的想法帶給我的任何地方之外,任何人有任何想法或建議嗎我試圖提前知道我所知道的問題。

+0

*」我已經設置了幾個視圖(噓,我知道)......「*視圖是SQL數據庫管理系統的基本特徵。當你必須緊挨着使用* views *和* shhh *時,你應該考慮切換到不同的dbms。 – 2013-02-20 19:29:49

+0

我在那裏有點愚蠢,但事實是,對於這種特殊需求,意見可能不是合適的平臺。考慮到數據的大小(特別是一旦非規範化的列數),這些觀點就像我預期的那樣緩慢。我不知道有什麼方法來優化它們,但我很想錯。 – 2013-02-20 19:41:44

+0

獲得更好性能的一種方法是切換到具有更好查詢優化器的dbms。 – 2013-02-20 20:01:48

回答

0

我希望這可以幫助,因爲我最近在將數據從關係轉移到面向文檔(反規範化)方面做了大量工作。

與數據移動到Mongo的一些選項:

  1. 您可以輕鬆地只寫從MySQL數據蒙戈並保持你的關係表。沒有轉換,只需將數據直接移動即可。 Mongo具有可輸出到新集合的map/reduce。雖然速度很慢。 =(如果你直接移動一個視圖,Mongo有一個非常強大的聚合框架來生成新文檔。

  2. 理想情況下,你會在MySQL中編寫你的「文檔」,然後移動它們。使文檔變得非常平坦,你可以通過使用group_concat創意來添加結構,基本上可以將一些數據和手動JSON字符串group_concat在一起。(醜,但它的作品)

  3. 蒙哥是很好在與文件的工作。真的,真的很棒。如果您想使用非規格化數據,我強烈建議使用它。

  4. 這可能是矯枉過正,但我​​們使用Mule ESB將數據從MySQL移動到Mongo。你可以在那裏做更復雜/棘手的轉換,但是有一條學習曲線。

  5. 在SQL Server中,您可以將查詢輸出爲XML。如果你可以在MySQL中找到一個庫來做到這一點,那麼這是從XML到JSON的簡單跳轉。我們已經能夠在SQL Server中運行超過10萬條記錄的查詢並且非常快速地輸出XML。

讓我知道你是否想要更多關於任何點的細節。 =「

+0

謝謝,瑞恩。我首先想確定的是,如果我轉移到Mongo,我仍然可以執行非常詳細的查詢。一個MongoDB「文檔」將代表一個區域(包括其所有退休計劃/福利數據),因此我可以將這些文件作爲嵌套組件包含在內,或者如您所述將所有內容扁平化。聽起來像平板更快?我得看看'group_concat'。 – 2013-02-22 22:09:20

+0

Flat更容易從MySQL遷移到Mongo。 Mongo具有非常豐富的查詢語言。語法可能需要一些習慣,但你絕對可以完成很多。 group_concat可以創建數組或子文檔。 – ryan1234 2013-02-22 22:18:44

+0

最後看看'group_concat'。這不完全是我的。我沒有像拼合記錄那樣拼接字段值。如果一個地區可能有3個可能的福利記錄(每個記錄都有一個ID和一個提供者),我將每個福利記錄平鋪到視圖中,這樣一個地區現在有1個福利記錄,帶有前綴以區分的字段。例如'accident_insurance_id','accident_insurance_provider','dental_id','dental_provider'等。現在我的'區域'表與這個視圖有一對一的關係。 – 2013-02-25 13:45:33