我正在为应用程序中的一些关系数据建模。 我主要想知道如何处理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相关的所有Echoes,如下所示:

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

这本质上是相同的蛮力方法,似乎必须有更好的方法。

所以我的问题是:

  1. 像这样的遥远关系写查询的更好方法是什么?

  2. 对表示这种遥远关系的模式设计是否进行了更改?

在我看来,我可以在echoes上创建一个alpha_id列,并使用它直接查询,然后,如果中间关系发生变化,我将依靠应用程序始终更新该列。 在我看来,这是一个坏主意,但是在这种情况下,它肯定会使查询效率更高。

我很想听听一些SQL专家的意见,当您需要经常查询的遥远相关数据时,您会怎么做?

  ask by Andrew translate from so

本文未有回复,本站智能推荐:

1回复

如何在不运行查询本身的情况下找到postgresql查询返回的列?

给定一个凌乱的 postgres 查询(例如有很多子查询),有没有办法在不运行查询本身的情况下找出查询将返回哪些列? 如果我理解正确,Sequel 的Dataset#columns方法( Documentation )调用带有LIMIT 1的查询。 这对于一个简单的查询来说很好,但是如果涉及到子查询
2回复

Postgres和Ruby的续集:where子句中的空数组被转换为慢查询

我使用了出色的Sequel ORM,并在某个时候生成了一个ID数组,并试图检索具有这些ID的用户。 例如 但是有时候,用户列表是空的,而我实际上得到的是: 结果是正确的(即没有返回任何行),但是查询要慢两个数量级。 在具有数百万行的表上,可能需要花费几秒钟的时间才能返回。 我很
1回复

无法查询与Sequelgem的one_to_many关系?

我在 Postgres 数据库上使用 Sequel gem(使用 Ruby)。 我在“Home”类和“Person”类之间有一个one_to_many关系。 所以,很多人都在一个家里。 我的类模式定义如下: 我选择了一些人( p = Person.where(:age => 20) ),现在我
1回复

多对多关系中的数据

我想在Sequel和 Postgres 中以多对多关系存储额外数据,类似于这个 Django 示例。 在我的例子中,每个人都有一个他们工作的地方,以及他们在那里工作的时间。 每个人可以在同一个地方工作不同的时间。 例如... 我想知道如何设置表格和模型以使其尽可能不尴尬。 目前我有一个这样的模式。
2回复

SEQUELPostgres联接查询

我正在努力使用postgres和SEQUEL与ruby进行简单的联接查询。 我有带有列的表1(短列表):id,shortname 和表2(shortmembers),其列为:id,short_id(对shortlists ID的引用) 我要选择短成员ID和短列表短名称。 因此,在常
1回复

续集,将值传递给pg_array查询

我正在寻找一种将数组参数传递给pg_array查询的方法( https://www.postgresql.org/docs/8.2/static/functions-array.html )。 就像是: && - 交叠 ids = [2,3] array_col是包含整数的数组,例
2回复

ruby续集gem-如何使用pg_array扩展名查询数组

我正在使用pg_array扩展和后续版本4.1.1。 我添加了这样的扩展名: 我创建了这样的一列: 我可以将数组加载和检索到postgress数组列中,就像使用普通数组一样。 从上面的链接尚不清楚的是如何根据此数组列中的值执行查询。 例如,如果电子邮件表中的一行在引用列中包含
1回复

在具有n:m关系的表中为每个用户创建唯一约束

刚才我问了一个问题,为每个用户创建唯一的约束 ,答案非常简单。 为了在一个列上创建一个唯一索引,但基于每个用户,我要做的就是: 但是,用户表和引用user_id的表之间的关系是1:n(用户到位置),因此我在location表中有一个foreign_key ,它引用了user_id 。