存储此关系的好方法是什么,以便我可以有效地回答此表单的查询?

时间:2013-04-24 01:41:17

标签: database language-agnostic

对不起,如果我得到一点点肮脏的话:

  

我有两个,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中子集的并集:

image(Q) = Uq∈Q q

     

假设X x 的元素满足查询Q如果对于所有q∈Q,q∩xℜ≠∅,即如果Q中的所有子集与与x相关联的Y的子集重叠。

     

定义证据满足查询Q的元素x,以便:

evidence(x,Q) = xℜ ∩ image(Q)
  也就是说,与x相关联的Y部分用于匹配Q的某些部分。这可用于验证x是否满足Q.

我的问题是我应该如何存储我的关系?这样我才能有效地报告哪些x∈X满足查询,并最好报告满意的证据?

关系不是太大,因为csv只有6GB左右。我有几个想法,我都不满意:

  1. 我可以存储{(x,xℜ)| ∀x∈X}只是在一个平面文件中,然后执行O(| X || Q || Y |)工作检查每个x以查看它是否满足查询。这可以并行化,但感觉不对。
  2. 我可以将store存储在Y上索引的数据库表中,检索{(y,ℜy)| ∀y∈image(Q)},然后将其反转得到{(x,evidence(x,Q))| ∀xs.t.证据(x,Q)≠∅},然后检查,找到满足Q和证据的x。这看起来好一点,但我觉得自己可能正在做一些我可以要求我的RDBMS做的事情。
  3. 我怎么能做得更好?

1 个答案:

答案 0 :(得分:1)

我认为#2是要走的路。此外,如果Q可以在CNF中表示,您可以使用多个查询和INTERSECT来使RDBMS执行一些繁重的工作。 (与DNF和UNION类似。)

这看起来有点像你想要的“反向索引”,这是一些RDBMS所支持的。 X =文档集,Y =单词集,q =与glob“a * c”匹配的单词集。

HTH