过滤两个属性vs过滤一个计算属性?数据存储谷歌应用引擎

时间:2014-10-16 08:37:06

标签: google-app-engine google-cloud-datastore app-engine-ndb

我想构建一个聊天应用程序,这是我的模型:

class Message(ndb.Model):
  senderId = ndb.IntegerProperty()
  receiverId = ndb.IntegerProperty()
  sender_receiver = ndb.ComputedProperty(lambda self: self.senderId.join('-').join(self.receiverId))
  message = ndb.StringProperty()
  date = ndb.DateTimeProperty(auto_now_add=True)

所以,如果我想使用以下值将消息传递给userId1和userId2:userId1 = 7878,userId2 = 5264。 我将运行以下查询:

qry = Message.query(Message.sender_receiver.IN('7878-5264','5264-7878'));

但没有计算属性:

qry = Message.query(Message.sender.IN(7878,5264) AND Message.receiver.IN(7878,5264));

哪个更好?

2 个答案:

答案 0 :(得分:1)

脱离我的头脑(和Dmitry所说的一样),In是一个昂贵且缓慢的操作,因为它会创建多个查询然后加入结果。

我会使用计算属性,但我甚至不会在其中使用IN。

我会做

 qry = Message.query(Message.sender_receiver = '7878-5264' OR Message.sender_receiver = '5264-7878');

计算属性在执行保存时会花费更多时间,但这是一个正常情况,需要花费更多时间进行保存,以便更快地检索。

答案 1 :(得分:1)

使用重复属性。

sender_receiver = ndb.ComputedProperty(lambda self: [self.senderId, self.receiverId], repeated=True)

qry = Message.query()
qry = qry.filter(Message.sender_receiver == 7878)
qry = qry.filter(Message.sender_receiver == 5264)
# you will get all values where sender or receiver in 7878 or 5264 with a single query