一个星期以来一直试图解决这个问题,但在我的所有研究中都找不到任何解决方案,所以我想我会问大家。
我有一个“Product”表和一个“productSent”表,这里有一个快速的方案来帮助解释:
class Product(ndb.Model):
name = ndb.StringProperty();
rating = ndb.IntegerProperty
class productSent(ndb.Model): <--- the key name here is md5(Product Key+UUID)
pId = ndb.KeyProperty(kind=Product)
uuId = ndb.KeyProperty(kind=userData)
action = ndb.StringProperty()
date = ndb.DateTimeProperty(auto_now_add=True)
我的目标是向用户展示他们以前从未见过的评分最高的产品——快速。因此,为了跟踪用户看到的产品,我使用 productSent 表。我创建了这个表而不是使用光标,因为每次评级顺序发生变化时,光标都有可能跳过新的更高排名的产品。一个例子:假设用户在数据库中看到了产品 1-24。接下来,有 5 个用户喜欢产品 #25,使其成为数据库中的 #10 产品——我担心该产品将永远不会再次显示给用户(并且可能会在更大范围内搞砸)。
我现在这样做的问题是,一旦用户超过了前 1,000 个产品,它就真的开始降低查询性能。因为我实际上是在提取 1,000 多个结果,通过查询 productSent 表(执行 keyName 查找以加快处理速度)检查它们是否已发送,并遍历循环直到检测到 15 个新结果。
我想到的一个解决方案是在所有看过产品的用户的产品表中添加一个重复属性(listProperty)。或者,如果我不想使用不等式过滤器,我可以将所有未看过产品的用户的重复属性放在一起。这样,当我查询时,我可以动态地将它们取出。但我担心当我有 1,000 多个用户时会发生什么:
a) 我将在一个实体中重复属性的限制上一探究竟。b) 索引大小会增加大小成本
以前有没有人处理过这个问题(我相信有人有!)关于构建它的最佳方法的任何提示?
更新 好的,所以有另一个想法。为了最大限度地减少评分(喜欢的数量)发生变化时发生的变化,我可以有一个只有 3 个可能值的辅助列:正面、中性、负面。并按此排序?当然,对于评分为 0 并获得“喜欢”(使它们成为正面)的项目,仍然有可能出现故障或被光标跳过——但可能性较小。大家觉得呢?