10 個の bar_entities を持つ foo レコードが与えられ、これらの 10 個のエンティティのうち少なくとも 2 個を持つすべての foo レコードを探すと、45 の可能な等価値 10!/(2!*(10-2)!)=45 が得られます。
これは、10_C_(2-1)=10 回の読み取りで推測できます。
SELECT * from table WHERE bar="1" AND bar in ["2", "3", "4", "5", "6", "7", "8", "9", "0"]
SELECT * from table WHERE bar="2" AND bar in ["3", "4", "5", "6", "7", "8", "9", "0"]
SELECT * from table WHERE bar="3" AND bar in ["4", "5", "6", "7", "8", "9", "0"]
etc.
これを 1 回の読み取りに減らすには、foo レコードが追加されたときに、特定のレコードの 2 つの組み合わせすべてを含む別のテーブルを作成する必要があります。
Say you had
foo_table
foo1 [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
foo2 [1, 3, 4]
foo3 [1, 2, a]
foo4 [b, 6, c]
foo_combo_2_table
Parent Combination
foo1 12
foo1 13
... and all 45 foo1 combinations each in its own row
foo2 13
foo2 14
foo2 34
foo3 12
foo3 1a
foo3 2a
etc.
Now you can do a
indexes = SELECT __KEY__ from foo_combo_2_table WHERE combination IN [12, 13, 14, 15, ... all 45]
keys = [k.parent() for k in indexes] # you would need to filter for duplicates
このようにして、爆発的なインデックスの問題に巻き込まれることはありません。
これらのそれぞれよりも任意の 3 つまたは任意の 4 つのエンティティを実行したい場合は、foo_combo_n_table を作成するか、10_C_(n-1) 回の読み取りを実行する必要があります。