私たちのプロジェクトでは、以下に説明する方法で階層キーを使用しました: キーの最初の部分は、RDBMS のテーブル名のようなものです:
users
- 「テーブル」を表します
次に、各ユーザーには、例の独自の ID があります。
users:1
- 「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
キーの値になります。
この戦略は、1 つの値、JSON、またはバイナリ データのみを格納するすべてのドキュメントに使用されました。
まさにあなたの例のために、私は選択します:
a:123-20140117:counter
- これは、(RDBMS 言語で言えば) "a" という名前のテーブルがあることを意味します。テーブル "a" には、フィールド "cntrx" を持つ ID (または他の何か) "123-20140117" を持つレコードがあります。
UPD:
キーサイズについて。実際、それは問題ではありません。はい、キーのサイズは制限されていますが、サイズを小さくする方法はたくさんあります。それらの1つ-ハッシュを使用しますが、キーが長くなり、より多くのメモリを消費するため、それは悪い方法だと思います。私たちのプロジェクトでは、memcached バケットに「短い」キーを使用しました。人間が理解できるキー名と短縮値を表す列挙型 (couchbase にも格納できます) がありました。
例: レコードのセットがあります: 30 枚以上の写真を持っているユーザーのリスト。したがって、キーと値のペアがあります。
usersByPhotosCount - k:ubpc:{0}
30枚の写真のキーは になりますk:ubpc:30
。
ただし、このような最適化は本番環境でのみ行うことをお勧めします。開発では、アプリとデータベースにわかりやすいキーを用意することをお勧めします (つまり、開発用の通常の kv ペア、本番用の短縮および難読化の 2 セットの kv ペアを作成し、環境に応じてそれらをロードできます)。