0

为以下场景建模的最佳方法是什么?用户有多个投资组合,每个投资组合都有多只股票。

我想出了以下几点:

股票将如下所示

stk:1 {名称:A,股票代码:val,扇区:val ..}
stk:2 {名称:B,股票代码:val,扇区:val ..}

用户可以是如下哈希:(将用户的投资组合单独存储为一组更好吗?)

用户:1 {k1:val1,k2:val2,投资组合:“价值|增长|短期”}
用户:2 {k1:val3,k2:val4,投资组合:“价值|防御|便士”}

投资组合中的股票可以设置
user:1:value (1,3)
user:2:value (2,3,4)
user:1:short term (1,5)
user:2:penny (4)

为了为用户添加/删除投资组合,它需要'HGET user: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

没有最好的建模方法:这完全取决于您的访问路径。

例如,如果您从用户的角度系统地访问数据,您的提案将很有效。如果你想知道哪些用户在他们的投资组合中有特定的股票,那将是非常糟糕的。所以我的建议是列出所有预期的访问路径并检查它们是否被数据结构覆盖。

假设您只需要用户视角,我宁愿将投资组合物化为单独的集合,而不是将序列化列表存储在用户哈希中:它们将更易于维护。因为您可以使用流水线(或脚本)在一次往返中运行多个命令,所以没有真正的开销。

于 2012-10-24T12:30:34.440 回答