RDBMSからRedisに何かを移植するときは、リレーショナルモデルに固執しないようにするのが最善のアドバイスだと思います。モデルを超えて、重要な違いは、データアクセスパスとデータ構造に焦点を当てることです。
Redisにはクエリ言語が含まれていないため(むしろmemcachedをコマンドします)、したがって任意のクエリに応答することはできません。データへのアクセスパスがデータ構造の一部でない場合、データを効率的に取得することはできません。
任意のクエリをサポートすることになると、Redisは最高のNoSQLストアではありません。たとえば、MongoDBのようなものの方が適しています。
さて、本当にRedisを使って自分のものを実装したいのであれば、タグ付けエンジンと同様の戦略を試してみることができます。レコードはハッシュオブジェクトに保存できます。サポートする必要のある任意のクエリの各列部分について、セットを使用して逆インデックスを作成します。
例:
# Set up the records: one hash object per record
hmset user:1 name Bilbo type Hobbit job None
hmset user:2 name Frodo type Hobbit job None
hmset user:3 name Gandalf type Maiar job Wizard
hmset user:4 name Aragorn type Human job King
hmset user:5 name Boromir type Human job Warrior
# Set up the indexes: one set per value per field
sadd name:Bilbo 1
sadd name:Frodo 2
sadd name:Gandalf 3
sadd name:Aragorn 4
sadd name:Boromir 5
sadd type:Hobbit 1 2
sadd type:Maiar 3
sadd type:Human 4 5
sadd job:None 1 2
sadd job:Wizard 3
sadd job:King 4
sadd job:Warrior 5
# Perform a query: we want the humans who happen to be a king
# We just have to calculate the intersection of the corresponding sets
sinterstore tmp type:Human job:King
sort tmp by nosort get user:*->name get user:*->job get user:*->type
1) "Aragorn"
2) "King"
3) "Human"
和集合、共通部分、差を組み合わせることにより、より複雑なクエリを実装できます。非離散値の場合、または範囲ベースのクエリの場合は、順序集合(zset)を使用する必要があります(通常の集合と組み合わせることができます)。
値が十分に判別可能である場合、この方法は通常非常に高速です。ただし、RDBMSの柔軟性がないことに注意してください(正規表現、接頭辞付き検索、範囲クエリは扱いにくいなど)