我试图完成工作时遇到了这样的问题。
给定数据集,对于每个项目,都有 D 维度,并且可以设置 C 值每个维度。
例如,数据集 THINGS(ID,所有者,颜色,重量) , ID 是主键
所有者属性可以是 alice,jack,zuck ;
颜色属性可以是红色,黄色,绿色;
weight 属性可以高,中,低;
在该数据集中,D = 3,C = 3
现在我想做很多次查询,例如:
“有没有所有者=红色和颜色=红色的数据”?
“有没有重量=低的数据”?
“有没有所有者=红色,颜色=红色,重量=高”的数据?
我只需要“是或否”来回答此问题。
我原本需要这样做,我的意思是没有数据库 在PC中,我尝试位图和反向索引来完成要求,但数据集的大小将为百万,维度将为8~18,基数将为5〜15。结果,效率不够好。
你可以给我任何建议,使它更有效率吗? 提前谢谢!
答案 0 :(得分:2)
您可能希望每个维度都有一个排序字典,其中KEY是维度的可能元素,而VALUE是ID列表。
OWNER_DICTIONARY = {
Bob: [1,5],
Jim: [2],
Sally: [3,4],
Will: []
}
COLOR_DICTIONARY = {
Blue: [5],
Green: [2],
Red: [],
Yellow: [1,3,4]
}
WEIGHT_DICTIONARY = {
Low: [1,2,4],
High: [3,5]
}
然后,您可以简单地在词典的VALUES(ID列表)上使用INTERSECT。如果交叉点大小大于0,则表示您具有正匹配。
Owner=Bob AND Weight=High
([1,5] UNION [3,5]) = [5]
如果您的标准(或之前的一个INTERSECTIONs)之一的值为[]为空,则可以立即短路(返回false),而无需进一步评估。
在数据库术语中,您将在每个字段/列上放置一个非聚集索引。并且正在做
EXISTS(SELECT ID FROM Table WHERE Col1=@Val1 AND Col2=@Val2 AND Col3=@Val3)
编辑 UNION - > INTERSECTION好抓@ElKamina