0

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

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只是一种方式,所以这里唯一的危险是我无法倒退,但我不确定这是否有风险,所以我实际上可能只是走这条路。你们有什么感想?

谢谢!

4

2 回答 2

1

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

可能重要的是键名加上您添加的任何 cookie 是否足够大以导致 HTTP GET 请求溢出到另一个 TCP/IP 数据包中,因为这会影响连接速度较慢的用户。

于 2013-10-29T05:39:30.530 回答
0

问题 #1) 绝对使用密钥查找。如果您想缩短 UUID,请参阅这个可能重复的问题

问题 #2) 你可以使用祖先查询吗?使用复合键存储和检索您的记录:

key = ndb.Key(userData, uuId, otherTable, otKey)
response = responses(parent=key)
qry = responses.query(ancestor=key)

模型构造函数在此处描述。

于 2013-11-05T02:37:33.797 回答