对不起,如果我有点数学的话:
我有两个集合,X 和 Y,以及多对多关系ℜ⊆ X✗Y。
- 对于所有 x ∈ X,令 xℜ = { y | (x,y) ∈ ℜ } ⊆ Y,Y 的子集与 x 关联 ℜ。
- 对于所有 y ∈ Y,令 ℜy = { x | (x,y) ∈ ℜ } ⊆ X,X 的子集与 y 通过 ℜ 关联。
将查询定义为 Y 的一组子集,Q ⊆ ℘(Y)。
让查询的图像是 Q 中子集的并集:
图像(Q) = U q∈Q q假设 X x 的一个元素满足查询 Q 如果对于所有 q ∈ Q,q ∩ xℜ ≠ ∅,即如果 Q 中的所有子集与 Y 的与 x 关联的子集重叠。
定义满足查询 Q 的元素 x 的证据,使得:
证据(x,Q) = xℜ ∩ 图像(Q)也就是说,Y 中与 x 相关联并用于匹配 Q 的某些部分的部分。这可以用来验证 x 是否满足 Q。
我的问题是我应该如何存储我的关系 ℜ 以便我可以有效地报告哪些 x∈X 满足查询,并且最好报告满足的证据?
这种关系并不太大,因为 csv 它只有大约 6GB。我有几个想法,但都不是我特别满意的:
- 我可以存储 { (x, xℜ) | ∀ x∈X } 只是在一个平面文件中,然后做 O(|X||Q||Y|) 工作检查每个 x 以查看它是否满足查询。这可以并行化,但感觉不对。
- 我可以将ℜ存储在以 Y 为索引的数据库表中,检索 { (y, ℜy) | ∀ y∈image(Q) },然后将其反转得到 { (x, evidence(x,Q)) | ∀ x st evidence(x,Q) ≠ ∅ },然后仅检查以找到满足 Q 的 x 和证据。这似乎好一点,但我觉得自己倒置它可能会做一些我可以要求我的 RDBMS 做的事情。
我怎么能做得更好?