2010-05-28 52 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。