对以下场景进行建模的最佳方法是什么?用户有多个投资组合,每个投资组合都有多个股票。
我想出了以下几点:
股票将以散列的形式出现,如下所示
stk:1 {名称:A,股票代码:val,扇区:val ..}
stk:2 {名称:B,股票代码:val,扇区:val ..}
用户可以是一个散列,如下所示:(将用户的投资组合作为一个集合单独存储是不是更好?)
用户:1 {k1:val1,k2:val2,portfolios:"value|growth|short term"}
用户:2 {k1:val3,k2:val4,portfolios:"value|defensive|penny"}
可以设置投资组合中的股票
用户:1:值(1,3)
用户:2:值(2,3,4)
用户:1:短期(1,5)
用户:2:penny (4)
要为用户添加/删除文件夹,需要“HGET user:n portfolios”,后跟HSET
随着用户和投资组合数量的增长,这是一种好的建模方式吗?
发布于 2012-10-25 02:11:09
如果用户可以有多个投资组合类型,那么最好将它们划分到自己的集合中。
sadd user:1:portfolios value growth "short term"
这使得从用户中删除项目组合就像在集合上调用srem user:1:portfolios value
一样简单(当然还有删除" user :ID:TYPE“集合)。
当您想要根据投资组合类型为用户查找股票时,可以使用sunionstore
和sort
命令(例如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-24 20:30:34
没有最好的方法来建模:这完全取决于您的访问路径。
例如,如果您从用户的角度系统地访问数据,那么您的建议将很好地发挥作用。如果你想知道哪些用户在他们的投资组合中有特定的股票,这将是非常糟糕的。因此,我的建议是列出所有预期的访问路径,并检查它们是否包含在数据结构中。
假设您只需要用户视角,我宁愿将投资组合物化为一个单独的集合,而不是将序列化列表存储在用户散列中:它们将更容易维护。因为您可以使用流水线(或脚本)在一次往返中运行多个命令,所以没有实际的开销。
https://stackoverflow.com/questions/13038842
复制相似问题