【发布时间】: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