我问another question关于在 GAE 中进行大型查询,答案几乎是不可能的。
我想要做的是:从 iOS 设备中,我获取所有用户的联系人电话号码。现在我有一个包含 250 个电话号码的列表。我想将这些电话号码发送回服务器并检查这些电话号码中哪些属于用户帐户。
所以我需要进行查询:query = User.query(User.phone.IN(phones_list))
但是,对于 GAE,这是一个相当昂贵的查询。仅此一个查询就需要 250 次读取,我希望经常执行这种类型的查询。
所以我想出了一个疯狂的主意。为什么我不将电话号码托管在另一个主机、另一个数据库上,因为这种类型的查询更便宜。然后我可以让 GAE 向我的其他服务器发送 HTTP 请求以获取所需的信息。
所以我有两个问题:
- 有没有更简化的数据库来处理这些类型的 查询,哪一个会更便宜?或者这一切都会是 和GAE一样吗?
- 这太过分了吗?这是不是一个好主意?我应该忍气吞声并付出代价吗?
最佳答案
GAE 的数据存储应该足以满足您的服务需求。因为您的应用程序看起来可以很好地并行化。
1。使用电话号码作为用户
的key_name
。
由于将User的key_name设置为number,下面的代码将提高查询速度并减少读取操作。
memcache.get_multi([phone_number1, phone_number2 ... ])
db.get([number1_not_found_in_memcache, number2_not_found_in_memcache])
memcache.set_multi("all_number_found_in_db")
2。在一个数据存储中存储多个号码。
GAE的运营成本与实体规模没有直接关系。因此,大型实体存储多数据将是节省运营成本的另一种方式。
例如,将多个具有相同number_prefix的电话号码存储在一起。
class Number(db.Model):
number_prefix = db.StringProperty()
numbers = db.StringListProperty(indexed = False)
# check number 01234567, 032123124
numbers = Number.get(["01", "03'])
# check 01234567 in number[0].numbers ?
# check 032123124 in number[1].numbers ?
此方法可以通过 memcache 进一步改进。
关于python - 除了 Google App Engine 之外还托管一个小型数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13033048/