1

考虑以下两种选择。

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 还是整个键)。

前动画,亚历山大·英灵

4

3 回答 3

2

Key 基本上只是一组属性的包装器:种类、ID/名称、父键、命名空间。

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

OTOH,密钥分配确实需要成本,因为这会创建一个具有唯一 ID 的密钥,并且这需要在后台查询数据存储。

于 2012-08-23T08:34:53.897 回答
2

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

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

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

于 2012-08-23T14:55:27.660 回答
0

如前所述,创建密钥几乎没有成本;因此,您会选择存储 ID,这样可以节省一些存储成本。存储密钥的好处是它被键入到 id 实际指向的内容,并且可以防止代码中可能出现的错误。例如,如果您存储了 ID,则可以检索该 ID,然后在代码中为错误的实体创建密钥,如果您存储了密钥,则无需担心该错误。并且以数据存储为代价,存储 ID 和 Key 的差异可能可以忽略不计,您花在思考上的时间更有价值。

于 2012-08-30T21:42:51.587 回答