使用长键名与密集查询的权衡

时间:2013-10-29 04:12:28

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

我目前有以下模型结构(只有下面粘贴的相关模型):

class userData(ndb.Model): 
    uuId = ndb.StringProperty()
    fId = ndb.IntegerProperty()
    name = ndb.StringProperty()
    email = ndb.StringProperty()
    gender = ndb.BooleanProperty()
    age = ndb.StringProperty()
    created = ndb.DateTimeProperty(auto_now_add=True)
    lastUpdate = ndb.DateTimeProperty()

class responses(ndb.Model):
    pId = ndb.KeyProperty(kind=shoes2)
    uuId = ndb.KeyProperty(kind=userData)
    act = ndb.StringProperty()
    date = ndb.DateTimeProperty(auto_now_add=True)

问题#1

每个用户都由iOS应用程序提供的唯一代码(例如:AAAAAAAA-AAAA-AAAA-AAAA-000000000000)唯一标识,该代码进入uuId实体属性。目前我还将其设置为“userData”类的键名。这个想法是,在未来的查询中,iOS会向我发送UUID,而我所需要的只是通过Key查询超快速。但这里的折衷是索引大小上升,因为我的keyName大约是appengine生成的大小的两倍。

所以我想我的第一个问题是,在这种情况下,最有效的方法是什么?用一把大钥匙?或者使用较慢的读取查询?

问题#2 响应表中出现类似的权衡。目前我正在连接userData uuId&来自另一个表的另一个键,为响应实体形成一个双倍大小的keyName,如下所示:

AAAAAAAA-AAAA-AAAA-AAAA-000000000000agtzfnNmYmFja2VuZHINCxIGc2hvZXMyGI56DA

我这样做是因为我知道我会运行很多查询,我会问:“哪里有pID == x& uuID == y”,所以我想我会做很多事情其中,不妨将它浓缩成一个。

你们觉得怎么样?大键是否合理地决定快速读取?我的阅读会更快吗?

更新 我正在考虑的另一件事是以下代码:

import md5
m=md5.new()
lKey = "AAAAAAAA-AAAA-AAAA-AAAA-000000000000agtzfnNmYmFja2VuZHINCxIGc2hvZXMyGI56DA"
m.update(lKey)
print m.hexdigest()

返回较短的唯一ID:“569e1b8c6e469d703c8e7c2a739c5812”。我知道MD5只是一种方式,所以这里唯一的危险就是我无法倒退,但我不确定这是否存在风险,所以我实际上可能只是走这条路。你们觉得怎么样?

谢谢!

2 个答案:

答案 0 :(得分:1)

与编程时间相比,ID和名称之间的存储成本差异微不足道。我怀疑查询时间的差异是可以衡量的。构建数据以便可以有效地查询数据很重要,但这不是关键名称问题。

可能重要的是,密钥名称加上您添加的任何cookie都足以导致HTTP GET请求泄漏到另一个TCP / IP数据包中,因为这会影响连接速度较慢的用户。 / p>

答案 1 :(得分:0)

问题#1)绝对使用密钥查找。如果您想缩短UUID,请参阅此possibly duplicate question

问题#2)你能使用ancestor query吗?使用compound key

存储和检索记录
key = ndb.Key(userData, uuId, otherTable, otKey)
response = responses(parent=key)
qry = responses.query(ancestor=key)

模型构造函数描述为here