0

次のシナリオをモデル化する最良の方法は何ですか? ユーザーには複数のポートフォリオがあり、それぞれに複数の株式があります。

私は次のことを思いつきました:

株式は以下のようにハッシュ化されます

stk:1 {名前:A、ティッカー:val、セクター:val ..}
stk:2 {名前:B、ティッカー:val、セクター:val ..}

ユーザーは以下のようにハッシュ化できます: (ユーザーのポートフォリオをセットとして別々に保存する方が良いですか?)

ユーザー:1 {k1:val1, k2:val2, ポートフォリオ:"値|成長|短期"}
ユーザー:2 {k1:val3, k2:val4, ポートフォリオ:"値|防御|ペニー"}

ポートフォリオの株式は、
ユーザー:1:値 (1,3)
ユーザー:2:値 (2,3,4)
ユーザー:1:短期 (1,5)
ユーザー:2:ペニー (4) を設定できます。

ユーザーのポートフォリオを追加/削除するには、「HGET ユーザー:n ポートフォリオ」に続いて HSET が必要です。

これは、ユーザーとポートフォリオの数が増えるにつれてモデル化するのに適した方法ですか?

4

2 に答える 2

4

ユーザーが複数のポートフォリオ タイプを持つことができる場合は、それらを独自のセットに分けるのが最善です。

sadd user:1:portfolios value growth "short term"

これにより、セットを呼び出すのと同じくらい簡単にユーザーからポートフォリオを削除できますsrem user:1:portfolios value(もちろん、"user:ID:TYPE" セットを削除します)。

ポートフォリオ タイプに基づいてユーザーの株式を検索する場合は、sunionstoreandsortコマンドを使用して実行できます (Ruby の例)。

keys = redis.smembers('user:1:portfolios').map do |type|
  "user:1:#{type}"
end

redis.multi do |r|
  r.sunionstore "user:1:stocks:_tmp", *keys
  r.sort "user:1:stocks:_tmp", get: ["stk:*->name", "stk:*->ticket"]
  r.del "user:1:stocks:_tmp"
end

stk:*->nameのハッシュ値のみを返しますname。ハッシュ内のすべてのエントリを取得する場合は、'KEY->HASHKEY' 構文を使用してそれぞれを指定します。

http://redis.io/commands/sort

于 2012-10-24T18:11:09.227 に答える
2

何かをモデル化する最善の方法はありません。すべてはアクセス パスに依存します。

たとえば、ユーザーの視点から体系的にデータにアクセスすると、提案はうまく機能します。どのユーザーがポートフォリオに特定の株を持っているかを知りたい場合、それは非常に貧弱です。したがって、私の提案は、予想されるすべてのアクセス パスをリストし、それらがデータ構造でカバーされていることを確認することです。

ユーザーの視点だけが必要だとすると、シリアル化されたリストをユーザー ハッシュに格納するのではなく、ポートフォリオを個別のセットとして具体化することをお勧めします。ポートフォリオは維持しやすくなります。パイプライン (またはスクリプト) を使用して複数のコマンドを 1 回のラウンドトリップで実行できるため、実際のオーバーヘッドはありません。

于 2012-10-24T12:30:34.440 に答える