考虑以下两种选择。
A)在结构中存储密钥。
type Point struct {
Place *datastore.Key
Lat float64
Lon float64
}
然后使用密钥获取:
place := new(Place)
if err := datastore.Get(c, k, point.Place); err != nil {
return err
}
B)存储id
type Point struct {
Place int64
Lat float64
Lon float64
}
然后在创建密钥后获取。
k := datastore.NewKey(c, "Place", "", point.Place, nil)
place := new(Place)
if err := datastore.Get(c, k, place); err != nil {
return err
}
存储密钥而不是id会占用更多空间。为了看到权衡,能够了解创建密钥需要多少资源。换句话说,创建密钥真的很便宜,或者创建密钥并存储它是否更好?
使用单个键,它可能没什么关系,但是让我说我获取一个点列表,并且我想要检索每个点的位置(即循环通过点来构建一个键数组,并获取它们。)
编辑:我不考虑在这里分配ID或密钥,只使用它们(即所有的点和位置都在数据存储区中,问题只是存储id还是整个密钥)。
Ex animo, Alexander Yngling
答案 0 :(得分:2)
Key基本上只是一组属性的包装:kind,id / name,parent key(s),namespace。
因此,从类型和ID创建密钥不需要任何费用,因为这是本地操作(不需要数据存储区)。
OTOH,密钥分配会产生成本,因为这会创建一个具有唯一ID的密钥,这需要查询数据存储区。
答案 1 :(得分:2)
我认为彼得给出了一个很好的答案,但这里涉及两件事:
您似乎在询问从ID生成密钥并存储ID以节省存储成本或存储实际密钥是否更便宜。从ID生成密钥是一个非常简单的哈希,几乎可以忽略不计 - 您可能需要担心许多更重要的事情。我不知道它的成本是多少,但你可以做一个非常简单的实验并循环几十万次并估算成本。它可能比存储便宜,但我怀疑它是否非常重要。
困难的部分是生成您在问题中未包含的唯一ID。为此,可能更容易获得保证唯一的数据存储密钥。
答案 2 :(得分:0)
如前所述,创造关键成本几乎为零;因此,您可以选择存储ID,这样可以节省一些存储成本。存储密钥的好处是它可以根据id实际指向的内容进行分类,并防止代码中出现可能的错误。例如,如果您存储ID,则可以检索该ID,然后在代码中为错误的实体创建密钥,如果存储密钥,则无需担心该错误。以数据存储为代价,存储ID和密钥的差异可能微不足道,您花在思考它上面的时间更有价值。