确定 PostgreSQL 中关系之间路径的存在

Determine the existence of a path between relations in PostgreSQL

我有一个 PostgreSQL 9.4 数据库存储组织和人员 table。 有一个 organization_person table 将组织与人联系起来。 组织有多个人,人可能属于多个人 组织。

我希望能够有效地回答查询:对于给定的 组织 X,在该组织之间是否存在路径,通过 至多一个人,对集合 S 中的任何组织,组织集合 将某个布尔字段设置为 true?

只需要找到通过人的两跳连接。 不需要查找 X -- Person -- Y -- Person -- s。

集合 S 大约有 10,000 个条目。大多数组织不在 S 中。 这是为了在线查询目的,而不是离线分析或其他批处理。 S 的更新较少;每天大约添加 150 次,删除一些。

我愿意使用 PostgreSQL 的高级功能或扩展,或者 其他数据库技术,如果它们更适合该任务。 我只需要知道这样一条路径是否存在,而不是它的成员。我是 愿意在 PostgreSQL 中使用一定量的非规范化来做到这一点, 但我不确定如何整合更改,例如对 S的成员资格,以一种理智和高效的方式 方式。

如果我没理解错的话,你要找一个在组织 X 中的人和一个在 S 中的组织。这可以表示为 SQL 查询:

select 1
from s join
     organization_person op
     on op.organzation_id = s.organization_id join
     organization_person opx
     on opx.organization_id = 'x' and
        opx.person_id = op.person_id
limit 1;

这将受益于 organization_person(organization_id, person_id)organization_person(person_id, organization_id) 上的索引。