我有一个存储组织和个人表的PostgreSQL 9.4数据库。 有一个organization_person表将组织与人员联系起来。 组织有多个人,人可能属于多个人 组织。
我希望能够有效地回答查询:对于给定的 组织X,该组织之间是否存在通路 最多一个人,组S中的任何组织,组织 将某个布尔字段设置为true?
只需找到人们的两跳连接。 寻找X - 人 - Y - 人 - 不是必需的。
集合S有大约10,000个条目。大多数组织都不在S. 这用于在线查询,而不是脱机分析或其他批处理。对S的更新很少见;每天约150次添加,少量删除。
我愿意使用PostgreSQL的高级功能或扩展,或者 其他数据库技术,如果它们更适合于任务。 我只需要知道这样的路径是否存在,而不是其成员。我'米 愿意在PostgreSQL中进行一定程度的非规范化, 但我不确定如何整合变更,例如变更 S的成员资格,理智而高效 方式。
答案 0 :(得分:1)
如果我理解正确,您正在寻找组织X中的人员和S中的组织。这可以表示为SQL查询:
Controller
这将受益于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)
上的索引。