【问题标题】:many-to-many-to-many, incl alignment of data from diff sources多对多对多,包括来自不同来源的数据对齐
【发布时间】:2011-02-25 08:34:06
【问题描述】:

重构 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 都有从其自己的来源(第一方|第三方)报告的每日数据点。

在我们的 UI 和应用程序中,我们提供了工具来对齐这些,然后我们希望将它们保存到最干净的架构中以供查询,使我们能够区分报告的每日数据点,并执行其他每日计算(我们将还可以存储在 dbase 中,幸运的是,一旦我们确定了这一点,那应该是小菜一碟)。

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

我正在考虑两个选项,std has_many,通过 x2 --或者-- 可能(可怕的)ubermasterjoin 表

选项A:

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

=> 我们依靠 join 来存储 first|third order 和 line_items 的所有映射
=> raw_* 的键启用这些订单和 line_item 详细信息的查找
=> 担心循环引用和/或缺乏正确的映射逻辑,例如
订单-->line_item-->raw_line_items
对比
订单-->raw_order-->raw_line_items

选项B:

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 表写入一条记录
=>“理论上”查询简单/快速/灵活/性感

最后,我的问题:
a) 从痛苦的第一手经验中学到的任何关于如何最好地实施/调整/优化多对多对多关系的经验
b) 在铁轨上?
c) 有什么痛苦的陷阱(循环引用、慢查询、意大利面条怪物)需要注意吗?
d) Rails3 中的任何快乐和善良使这变得神奇而快乐?
e) 有人写过“如何在 Rails 中实现多对多模式并让它变得又快又性感?”我不知何故找不到的教程?如果没有,我会跟进我们的学习,希望对您有所帮助..

提前致谢-
--杰夫

【问题讨论】:

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


    【解决方案1】:

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

    当我们考虑迁移到 NoSQL 存储时,我们将在未来再次评估 OptionB。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-05
      • 2016-01-10
      • 1970-01-01
      • 2014-01-08
      • 2014-09-12
      相关资源
      最近更新 更多