1

我问了另一个关于在 GAE 中进行大型查询的问题,答案几乎是不可能的。

我想要做的是:从 iOS 设备,我得到所有用户的联系人电话号码。所以现在我有一个包含 250 个电话号码的列表。我想将这些电话号码发送回服务器并检查这些电话号码中的哪些属于用户帐户。

所以我需要做一个查询:query = User.query(User.phone.IN(phones_list))

然而,对于 GAE,这是一个相当昂贵的查询。仅此一个查询将花费 250 次读取,我希望经常执行此类查询。

所以我想出了一个疯狂的想法。为什么我不将电话号码托管在另一个主机上,另一个数据库上,这种类型的查询更便宜。然后我可以让 GAE 向我的其他服务器发送 HTTP 请求以获取所需的信息。

所以我有两个问题:

  1. 有没有更精简的数据库来处理这些类型的查询,并且这样做会更便宜?还是和GAE一样?
  2. 这是矫枉过正吗?这是个好主意吗?我应该把它吸起来并支付费用吗?
4

2 回答 2

1

GAE 的数据存储应该足以满足您的服务需求。由于您的应用程序看起来可以很好地并行化。

1.使用电话号码key_nameUser

当您将 number 设置为 User 的 key_name 时,以下代码将提高查询速度并减少读取操作。

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 进一步改进。

于 2012-10-23T15:50:08.620 回答
0

稍微概括提供的其他想法...假设您的所有搜索键对于单个用户都是唯一的(例如电子邮件、电话、推特句柄等)

在用户写入时,您可以生成一组 SearchIndex(...) 并将其持久化。每个 SearchIndex 都有用户的键。然后在搜索时,您可以为任何 SearchIndex 构造键并执行两个 ndb.get_multi_async 调用。第一个获取匹配的 SearchIndex 实体,第二个获取与这些索引实体关联的用户。

于 2012-10-23T21:37:17.137 回答