2011-12-09 9 views
2

記事と著者を持つアプリがあるとします。そのデータはRedisベースで維持されます。Redisのオブジェクト/ハッシュ間の関係を照会して表現する方法

また
{ "title" : "My title", "content" : "This is a content", "authorId" : 1} 

が、私の著者は、ハッシュで表現されています:

{ "name": "John Smith", "username" : "jsmith", "password" : "secret", "id" : 1} 

質問は、あなたが与えられたすべての記事を検索する方法を記事は、以下のJSONの構文で表されるものとして、ハッシュとして格納されています著者IDですか?レディスにそれをする命令がありますか?それらを手動で取得してフィルタリングしますか?または、この関係に欠陥があると表現する私の方法はありますか?何をお勧めしますか?

答えて

5

Redisには、選択基準としてフィールド値を使用してハッシュを直接検索する方法はありません。現在のデータモデルでは、すべての記事ハッシュを取得して一致しないハッシュを破棄するだけですが、効率的ではありません。

実際、インデックスは自分で管理する必要があります。あなたはハッシュの中にセットを持つことができないので、私は作者の記事のIDを含む別々のセットを持つことでこれを行います。このマッピングのため

author_1: { "name": "John Smith", ... "id": 1 } 
author_2: { "name": "Jane Doe", ... "id": 2 } 

そしてセット:こうすることで、あなたは著者のハッシュを持っています

author_1_articles: [1, 3] 
author_2_articles: [2] 

そして、それはこれらの記事にマップ:お好きな時に、今

article_1: { "title": "My title", ... "authorId": 1 } 
article_2: { "title": "Another one", ... "authorId": 2 } 
article_3: { "title": "What a story", ... "authorId": 3 } 

著者Xの記事を取得するには、SMEMBERS author_X_articlesが表示され、記事IDのリストが表示されます。

私は、著者が同じ記事を複数回追加すると、Redisはそれを無視するだけなので、セットを使用します。あなたが得る記事のリストは決して重複することはありません。記事がすでにセットに入っているかどうか最初にチェックすることなくSADDを使うことができます。

これは多くの作業のように聞こえるかもしれません。データモデルが複雑で、すばやく必要なアクセスパターンがたくさんある場合にはそうです。あなたがやることは、独自のインデックスを維持することです。そのためには、データを複製して最新の状態に保つ必要があります。これはNoSQLのトレードオフです...

関連する問題