我正在为应用中的某些关系数据建模。我主要想知道如何处理SQL中的远程关系,但对于上下文而言,它是一个Ruby应用程序,我使用Sequel作为ORM。
一个示例关系如下所示:
alphas one-to-many bravos
bravos many-to-one charlies
charlies one-to-many deltas
deltas one-to-many echoes
所以,使用ORM并在Ruby中完成工作我可能会天真地查询与Alpha相关的所有回声,如下所示:
a = Alpha.where id: 1
echoes = []
a.bravos.each do |bravo|
bravo.charlie.deltas.each do |delta|
echoes << delta.echoes
end
end
echoes.flatten
这可行,但无法利用数据库,而是完成应用程序层中的大部分工作。在丑陋的psuedo-sql子查询中表达相同的想法,它看起来像:
SELECT * FROM echoes WHERE delta_id IN
SELECT delta_id FROM charlies WHERE charlie_id IN
SELECT charlie_id FROM bravos WHERE bravo_id IN
SELECT id FROM bravos WHERE alpha_id = 1
这基本上是相同的蛮力方法,似乎必须有更好的方法。
所以我的问题是:
为这样的远程关系编写查询的更好方法是什么?
是否应该对架构设计进行更改以表示这种远距离关系?
我发现我可以在alpha_id
上创建一个echoes
列并使用它来直接查询,然后我会依赖应用程序在中间关系发生变化时始终更新该列。在我看来,这似乎是个坏主意,但在这种情况下肯定会提高查询效率。
我很想听听一些SQL专家的意见,当你有经常查询的远距离相关数据时,你会怎么做?