0

私のオブジェクトテーブルに私が持っている

id | type | parent | order | created

そして、私のデータテーブルには

object_id | key | value

可能な限り最適な方法で、キー 'y' === 'z' であるタイプ 'x' のオブジェクトを取得したいと考えています。

すなわち。slug === 'jonny' でユーザーを取得

簡単なテストとしてmysqlでこれを行っているため、現在結合で行っています。しかし、私はredisまたは同様のキー/値ストレージシステムに移行するので、明らかにそれは機能しません.

4

1 に答える 1

1

リレーショナル モデルをキー バリュー ストアに適応または変換することはできません。用語または構造、およびアクセス パスの観点から、データ モデルを再考する必要があります。

あなたの例では、redisを使用して、次を使用します。

  • 静的 (type、parent、order、created) および動的 (データ テーブルに保存したもの) プロパティの両方を含むオブジェクトごとに 1 つのハッシュ

  • オブジェクト タイプにインデックスを付けるために、オブジェクト タイプごとに 1 セット

  • 検索する必要があるプロパティ値ごとに 1 つのセット

スキーマのないキーと値のストアを使用すると、MySQL の場合のように静的プロパティと動的プロパティを分離する必要がなくなります。

検索は、セットを交差させることで実行できます。セットは手動で維持する必要があります (つまり、オブジェクトを追加/削除するたびに、対応するセットを更新する必要があります)。

検索結果が得られたら、いくつかの hgetall コマンドをパイプライン処理するか、sort コマンドを使用して、対応するオブジェクト プロパティを取得できます。

例:

# Add 3 objects and their properties
hmset obj:1 type user parent nil order 1 created 20120901 key_slug jonny key_tag dummy key_author Bob
hmset obj:2 type user parent nil order 2 created 20120901 key_slug jonny key_tag not_dummy key_author Dan
hmset obj:3 type admin parent nil order 3 created 20120901

# Add type index
sadd type:user 1 2
sadd type:admin 3

# Add dynamic properties indexes
sadd key_slug:jonny 1 2
sadd key_tag:dummy 1
sadd key_tag:not_dummy 2
sadd key_author:Bob 1
sadd key_author:Dan 2

# Find objects whose type is user, author is Bob and slug is jonny
sinter type:user key_author:Bob key_slug:jonny

# Find properties of object 1
hgetall obj:1
于 2012-09-04T12:07:00.140 に答える