数据存储实体 key_name 可以有多长(最大字符数)?拥有很长的 key_names 是否很糟糕?

Posted

技术标签:

【中文标题】数据存储实体 key_name 可以有多长(最大字符数)?拥有很长的 key_names 是否很糟糕?【英文标题】:How long (max characters) can a datastore entity key_name be? Is it bad to haver very long key_names?数据存储实体 key_name 可以有多长(最大字符数)?拥有很长的 key_names 是不是很糟糕? 【发布时间】:2011-02-03 04:45:31 【问题描述】:

可用于定义数据存储实体的 key_name 的最大字符数是多少?

key_name 很长是不是很糟糕?

例如: 假设我们使用 170 个字符的 key_names,即 Twitter 消息的长度 140 加上 10 个数字字符表示纬度,10 个数字表示经度,10 个表示时间戳

(这样一个key_name的推理:所以通过使用这样一个key_name,我们可以轻松快速地确保没有重复的帖子,因为同一条消息不应该来自同一个地方和时间多次。)

【问题讨论】:

我可以添加另一个使用长键名的原因。我的一种数据类型表示其他两个实体(任何类型)之间的关系,我的实体的键名是中间带有下划线的两个编码键。如果实体有父母(和祖父母等),则密钥可能会很长。 【参考方案1】:

实际上,键名限制为 500 个字符,就像字符串属性值一样。参见例如Key.to_path(),它调用ValidateString()

http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/api/datastore_types.py#413

默认max_len_MAX_STRING_LENGTH,即500:

http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/api/datastore_types.py#87

【讨论】:

ndb 是这样吗? java和go呢?我怀疑 Nick 的答案在后端是正确的 - 只是施加此限制的软件。 iirc 后端强制执行相同的限制。 (我写了很多,但那是不久前的事了,我无法再访问代码了。:P)无论如何,签入 ndb、go 等都很容易。 只是在目前确认一下,@ryan 所说的对于后端的验证仍然是正确的。 @PatrickCostello 我对键名限制有几个更深入的问题,并决定将它们作为一个新问题发布。如果您对这些有任何见解,我很想请您快速浏览一下:***.com/questions/33044281/… 谢谢。【参考方案2】:

没有硬性最大值 - 密钥名称的最大长度是密钥的最大长度,减去一些开销,并且密钥可以变得很长。

但是,使用很长的键名是不好的:除了存储和检索它之外,每个索引条目都包含它所引用的键名,因此更长的键名意味着更高的索引开销。如果您想确保大文本的唯一性,最好的选择是将密钥名称设置为输入的 MD5 或 SHA1 和,这样可以确保唯一性和短(-ish)密钥名称。

【讨论】:

嗯,通常没有散列——MD5 和 SHA1 也不能确保唯一性。实际上 - 太阳会在你得到这些哈希冲突之前爆炸:) ? arstechnica.com/information-technology/2020/01/…

以上是关于数据存储实体 key_name 可以有多长(最大字符数)?拥有很长的 key_names 是否很糟糕?的主要内容,如果未能解决你的问题,请参考以下文章

数据库的标识符可以有多长

超链接可以多长?

java数据库连接池最大连接数最小连接数怎么设置

java数据库连接池最大连接数最小连接数怎么设置

Java整型数组的最大长度到底有多长?

在Google App Engine中,Python DataStore模型是get_by_key_name的结果( )以与输入相同的顺序?