2010-05-28 77 views
0

重構數據庫以支持許多:許多:許多。在第二級和第三級,我們需要保留最終用戶的「映射」或對齊來自不同來源的數據,例如,多對多,包括來自不同來源的數據對齊

Order 17 
FirstpartyOrderID => aha 
    LineItem_for_BigShinyThingy => AA-1 # maps to 77-a 
    LineItem_for_BigShinyThingy => AA-2 # maps to 77-b, 77-c 
    LineItem_for_LittleWidget => AA-x # maps to 77-zulu, 77-alpha, 99-foxtrot 
    LineItem_for_LittleWidget => AA-y # maps to 77-zulu, 99-foxtrot 
    LineItem_for_LittleWidget => AA-z # maps to 77-alpha 

ThirdpartyOrderID => foo 
    LineItem_for_BigShinyThingy => 77-a 
    LineItem_for_BigShinyThingy => 77-b 
    LineItem_for_BigShinyThingy => 77-c 
    LineItem_for_LittleWidget => 77-zulu 
    LineItem_for_LittleWidget => 77-alpha 

ThirdpartyOrderID => bar 
    LineItem_for_LittleWidget => 99-foxtrot 

每個LineItem具有從其源(第一方|第三方)報告的每日數據點。

在我們的UI &應用,我們提供的工具來調整這些,那麼我們希望把它們保存到最清潔的模式進行查詢,使我們能夠在diff的每日報告數據點,並執行其他日常計算(這是我們」我們也將在dbase中存儲,幸運的是,一旦我們確定了這一點,應該是蛋糕)。

我們需要映射具有各自數據點的相關[第一方|第三方] line_items。我們將使用該關聯來拉取每個line_items數據點集合以進行彙總和差異計算。

我考慮兩種選擇,標準的has_many,通過X2 - 或 - 可能(恐怖)ubermasterjoin表

OptionA:

order<<-->> 
     order_join_table[id,order_id,firstparty_order_id,thirdparty_order_id] 
    <<-->>line_item 
order_join_table[firstparty_order_id]-->raw_order[id] 
order_join_table[thirdparty_order_id]-->raw_order[id] 
raw_order-->raw_line_items[raw_order_id] 

line_item<<-->> 
      line_item_join[id,LI_join_id,firstparty_LI,thirdparty_LI 
     <<-->>raw_line_items 
line_item_join[firstparty_LI]-->raw_line_item[id] 
line_item_join[thirdparty_LI]-->raw_line_item[id] 

raw_line_item<<-->>datapoints 

=>我們依靠加盟來存儲第一的所有映射|第三會& line_items
=>鍵raw_ *使這些順序& LINE_ITEM細節查找
=>約循環引用和/或缺乏ö關切˚F正確映射邏輯,例如
順序 - > LINE_ITEM - > raw_line_items

順序 - > raw_order - > raw_line_items

OptionB:

order<<-->> 
     join_master[id,order_id,FP_order_id,TP_order_id,FP_line_item_id,TP_line_item_id] 
join_master[FP_order_id & TP_order_id]-->raw_order[id] 
join_master[FP_line_item_id & TP_line_item_id]-->raw_line_item[id] 

=> FP_line_item + TP_line_item的每個組合寫入join_master表中的記錄
=>「理論上」查詢容易/快速/靈活/性感

終於,我的問題:
一)從痛苦的親身經歷有關如何最好地執行/調整任何學習收穫/優化多到許多一對多在軌關係
B)?
c)任何痛苦的陷阱(循環引用,慢速查詢,意大利麪條怪獸)要注意什麼?
d)任何歡樂&善良Rails3,這使得這個神奇的容易&歡樂? e)任何人都寫了「如何在Rails中實現多對多的模式,並使其性能更快?」&教程,我不知何故找不到?如果沒有,我會跟進我們的希望是有幫助的學習收穫..

感謝高級 -
--Jeff

回答

1

我們的解決方案: 我們選擇實施方案A,因此到目前爲止一切都很好。享受Rails3的新查詢和範圍語法,我們已經廣泛使用Rails3來實現對我們在方法中經常使用的範圍的簡單調用。

當我們考慮遷移到NoSQL存儲時,我們會再次評估OptionB。