在我们的项目中,我们以如下所述的方式使用分层键:键的第一部分类似于 RDBMS 中的表名:
users
- 表示“表”
然后每个用户都有自己的 id,例如:
users:1
- “代表一个用户”
我们使用了 ':',因为我认为它看起来比其他分隔符更好。您可以使用任何您喜欢的分隔符。
如果你想像id
前面的例子一样使用顺序索引,你需要从某个键中获取它们,所以:
users:counter
- 保存“最后一个用户 ID”的键(它的作用类似于自动增量)
如果您需要为用户帐户存储一些“小节”,您可以存储它:
users:<user's id>:subsection
.
更复杂的例子
users:1:avatars:1:url
- 表示通过此键我们将获得用户 1 的头像 url,但如果用户想要存储许多头像,他们将进入users:1:avatars:X:url
,其中 X 将是users:1:avatars:counter
键的值。
我们对所有文档都使用了这种策略,它们只存储一个值、JSON 甚至二进制数据。
因此,对于您的示例,我将选择:
a:123-20140117:counter
- 这将意味着我们有(以 RDBMS 语言说话)名为“a”的表,在表“a”中,我们有 ID(或其他)“123-20140117”的记录,其字段为“cntrx”。
UPD:
关于密钥大小。其实没关系。是的,密钥的大小是有限的,但是有很多方法可以减小它。其中之一 - 使用哈希,但我认为这是不好的方法,因为键会很长并且会消耗更多内存。在我们的项目中,我们为 memcached 存储桶使用了“短”键。我们有一个枚举(也可以存储在 couchbase 中),它代表人类可以理解的键名,它是缩短值。
示例:我们有一些记录:拥有超过 30 张照片的用户列表。所以我们有一个键值对:
usersByPhotosCount - k:ubpc:{0}
30 张照片的关键是k:ubpc:30
.
但最好只在生产中进行此类优化。在开发中,最好在应用程序和数据库中使用可理解的密钥(即,您可以创建两组 kv 对:正常用于开发,缩短和混淆用于生产,并根据您的环境加载它们)。