确定 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)
上的索引。
我有一个 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)
上的索引。