2012-06-06 19 views

答えて

27

Redisでは、リレーションシップは通常セットで表されます。集合は一方向関係を表現するために使用できるので、多対多の関係を表すためにオブジェクトごとに1組が必要です。

リレーショナルデータベースモデルとRedisデータ構造を比較しようとすると、かなり役に立たなくなります。 Redisでは、すべてが非正規化された方法で保存されます。

例:私たちは、このデータ構造を持っていたら

# Here are my categories 
> hmset category:1 name cinema ... more fields ... 
> hmset category:2 name music ... more fields ... 
> hmset category:3 name sports ... more fields ... 
> hmset category:4 name nature ... more fields ... 

# Here are my users 
> hmset user:1 name Jack ... more fields ... 
> hmset user:2 name John ... more fields ... 
> hmset user:3 name Julia ... more fields ... 

# Let's establish the many-to-many relationship 
# Jack likes cinema and sports 
# John likes music and nature 
# Julia likes cinema, music and nature 

# For each category, we keep a set of reference on the users 
> sadd category:1:users 1 3 
> sadd category:2:users 2 3 
> sadd category:3:users 1 
> sadd category:4:users 2 3 

# For each user, we keep a set of reference on the categories 
> sadd user:1:categories 1 3 
> sadd user:2:categories 2 4 
> sadd user:3:categories 1 2 4 

、集合代数を使用してクエリを実行するのは簡単です:

# Categories of Julia 
> smembers user:3:categories 
1) "1" 
2) "2" 
3) "4" 

# Users interested by music 
> smembers category:2:users 
1) "2" 
2) "3" 

# Users interested by both music and cinema 
> sinter category:1:users category:2:users 
1) "3" 
+0

ありがとうございます!私はレディスにとって新しく、それは非常に面白いです:) – starikovs

+0

カテゴリスンバーの名前を取得する方法カテゴリ:2:カテゴリ番号を与えるため、これを持つユーザー – vaibhav

4

IMHO Redisは構造化クエリー(SQL)を作成するためのものではなく、高速アクセス可能なデータ用のものです。 user_idをキーとする「テーブル」を作成します。 。次に、user_idを照会し、必要なものを処理します。これは正規化の反対です。ステータスの更新など、データの順序が重要な場合は、データをプッシュしてリストにポップすることができます。たとえば、テーブル "status"にはuser_idがキーになり、データはリストになります。あなたはデータをlpushし、例えば最後の20要素を照会します。

関連する問題