В нашем проекте мы использовали иерархические ключи следующим образом: Первая часть ключа — это что-то вроде имени таблицы из СУБД: users
— представляет «таблицу»
Тогда у каждого пользователя есть свой идентификатор в примере:
users:1
- "представляет одного пользователя"
Мы использовали ':', потому что я думаю, что это выглядит лучше, чем другие разделители. Вы можете использовать любой разделитель, который вам нравится.
Если вы хотите использовать последовательные индексы, такие как id
в предыдущем примере, вам нужно получить их из некоторого ключа, поэтому:
users:counter
— ключ, который содержит «последний идентификатор пользователя» (он действует как автоинкремент)
Если вам нужно сохранить некоторый «подраздел» для учетной записи пользователя, вы можете сохранить его:
users:<user's id>:subsection
.
Более сложный пример
users:1:avatars:1:url
- означает, что по этому ключу мы получим URL-адрес аватара пользователя 1, но если пользователь хочет хранить много аватаров, они будут идти под users:1:avatars:X:url
, где X будет значением ключа users:1:avatars:counter
.
Мы использовали эту стратегию для всех документов, которые хранят только одно значение, JSON или даже двоичные данные.
Так что именно для вашего примера я выберу:
a:123-20140117:counter
- это будет означать, что у нас есть (говоря на языке СУБД) таблица с именем "a", в таблице "a" у нас есть запись с id (или что-то еще) "123-20140117" с полем "cntrx".
UPD: О размере ключа. На самом деле это не имеет значения. Да, ключи ограничены в размере, но есть много способов его уменьшить. Один из них - использовать хэши, но я думаю, что это плохой способ, потому что ключи будут длинными и потреблять больше памяти. В нашем проекте мы использовали «короткие» ключи для ведра memcached. У нас было перечисление (которое также можно хранить в Couchbase), представляющее понятное человеку имя ключа и его сокращенное значение.
Пример: у нас есть некоторый набор записей: список пользователей, у которых более 30 фотографий. Итак, у нас есть пара ключ-значение:
usersByPhotosCount - k:ubpc:{0}
а для 30 фото ключ будет k:ubpc:30
.
Но такие оптимизации лучше делать только на продакшене. В разработке лучше иметь понятные ключи в приложении и базе данных (т.е. вы можете создать два набора пар k-v: обычные для разработки, укороченные и запутанные для производства и загружать их в зависимости от вашей среды).
17.01.2014