多对多,包括来自差异源的数据对齐

时间:2010-05-28 23:06:26

标签: ruby-on-rails database-design schema ruby-on-rails-3

重新分解dbase以支持许多:很多:很多。在第二和第三级,我们需要保留最终用户的“映射”或对齐来自不同来源的数据,例如。

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都有自己的源(Firstparty | Thirdparty)报告的每日数据点。

在我们的UI& app我们提供工具来对齐这些,然后我们想将它们保存到最干净的查询模式中,使我们能够区分报告的每日数据点,并执行其他日常计算(幸运的是,我们也将存储在dbase中,幸运的是一旦我们钉了这个,那应该是蛋糕。

我们需要映射具有各自数据点的相关[firstparty | thirdparty] line_items。我们将使用该关联来拉取每个line_items数据点集合,以进行汇总和差异计算。

我正在考虑两个选项,std 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

=&GT;我们依靠join来存储第一个和第三个订单的所有映射。 line_items
=&GT;关键字raw_ *启用查找这些订单&amp; line_item详细信息
=&GT;关于循环引用和/或缺乏正确的映射逻辑的担忧,例如   顺序 - &GT; LINE_ITEM - &GT; raw_line_items
  与
  顺序 - &GT; raw_order - &GT; 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]

=&GT; FP_line_item + TP_line_item的每个组合都将记录写入join_master表
=&GT; “理论上”查询简单/快速/灵活/性感的

最后,我的问题:
a)任何关于如何最好地实施/调整/优化多对多关系的痛苦的第一手经验的任何学习 b)在轨道上?
c)要注意的任何痛苦的陷阱(循环引用,慢查询,意大利面条怪物)? d)任何快乐和Rails3中的优点使得这个神奇的容易和快乐?
e)有人写过“如何在Rails中做多对多的架构并使其快速和性感?”我以某种方式找不到的教程?如果没有,我会跟进我们的学习,希望它有用..

提前致谢 -
--Jeff

1 个答案:

答案 0 :(得分:1)

我们的解决方案: 我们选择实施选项A,到目前为止一切都很好。享受Rails3的新查询和范围语法,我们已经广泛使用它来实现我们在方法中经常使用的范围的简单调用。

我们考虑迁移到NoSQL商店时,我们将来会再次评估OptionB。