KeyProperty 中的 App Engine NDB 密钥是否计入 1MB 存储限制?

Does App Engine NDB keys in KeyProperty count against 1MB storage limit?

我正在 Google App Engine 中创建达到 1MB 大小限制的 NDB 模型实例。它与长度为 10-20k 的重复 StringProperty 有关。

这是一个例子:

class MyModel(ndb.Model):
    items = ndb.StringProperty(repeated=True)

instance = MyModel()
instance.items = []
For item in largeDataset:
    instance.items.append(item)

instance.put()
# Instance is >1MB Error

我的问题是解决这个问题,我可以改用 ndb keyproperties 和其他模型吗?密钥是否计入 1MB 限制?

它会是这样的:

class ItemModel(ndb.Model):
    item = ndb.StringProperty()

class MyModel(ndb.Model):
    items = ndb.KeyProperty(ItemModel, repeated=True)

instance = MyModel()
instance.items = []
For item in largeDataset:
    instance.items.append(
        ItemModel(item=item).put()
    )

instance.put()
# Same problems?

我还会得到相对相同的错误吗?项目字符串的长度不是那么长(~60 个字符),但数量是可变的 (20,000+),我更喜欢一种不会达到实例大小限制的方法。

那么密钥是否计入 1MB 的限制?如果是这样,NDB keyProperty 的相对大小是多少?

是的,属性的键值会占用实体存储空间 space。键使用的 space 的数量与等效字符串成正比,例如:ParentKind:name/ChildKind:other_id。实际使用的 space 取决于内部编码,但这非常接近。

如果原始值很小,您怀疑键可能与原始值一样多 space 是正确的。如果您处于困境并且确定数据大小不会进一步增长,那么可能值得一试,以节省少量费用。