创建数据存储的成本。键:在结构中存储密钥与ID,并从数据存储中获取

时间:2012-08-23 08:12:13

标签: google-app-engine google-cloud-datastore go

考虑以下两种选择。

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

3 个答案:

答案 0 :(得分:2)

Key基本上只是一组属性的包装:kind,id / name,parent key(s),namespace。

因此,从类型和ID创建密钥不需要任何费用,因为这是本地操作(不需要数据存储区)。

OTOH,密钥分配会产生成本,因为这会创建一个具有唯一ID的密钥,这需要查询数据存储区。

答案 1 :(得分:2)

我认为彼得给出了一个很好的答案,但这里涉及两件事:

  1. 您似乎在询问从ID生成密钥并存储ID以节省存储成本或存储实际密钥是否更便宜。从ID生成密钥是一个非常简单的哈希,几乎可以忽略不计 - 您可能需要担心许多更重要的事情。我不知道它的成本是多少,但你可以做一个非常简单的实验并循环几十万次并估算成本。它可能比存储便宜,但我怀疑它是否非常重要。

  2. 困难的部分是生成您在问题中未包含的唯一ID。为此,可能更容易获得保证唯一的数据存储密钥。

答案 2 :(得分:0)

如前所述,创造关键成本几乎为零;因此,您可以选择存储ID,这样可以节省一些存储成本。存储密钥的好处是它可以根据id实际指向的内容进行分类,并防止代码中出现可能的错误。例如,如果您存储ID,则可以检索该ID,然后在代码中为错误的实体创建密钥,如果存储密钥,则无需担心该错误。以数据存储为代价,存储ID和密钥的差异可能微不足道,您花在思考它上面的时间更有价值。