像Redis一样在键/值数据库中对数据进行分组

时间:2012-08-20 00:32:43

标签: database-design nosql redis methodology

我正在尝试在Redis数据库中对类似于amazon.com类别(例如,书籍,电影,电子产品等)的数据进行建模。订单在HTML页面上呈现时对我很重要,因此向用户呈现一致的用户界面。因此,我将类别存储在排序集中:

ZADD categories 0 "Books"
ZADD categories 1 "Movies"
ZADD categories 2 "Electronics"

然后,我为每个子类别创建了另一个排序集。

ZADD categories:books 0 "Fiction"
ZADD categories:books 1 "Non-Fiction"
ZADD categories:movies 0 "Horror"
[...]

从这里开始,我想我可以用Hash存储产品。

HMSET product:1000 category 0 subcategory 0 title "Redis Cookbook"
HMSET product:1001 category 1 subcategory 0 title "Nightmare on Elm Street"
[...]

我对Redis和Key / Value数据库商店都很陌生,所以我对自己的方法充满信心。这种模式对我来说是长期的吗?我应该注意更好/替代的方法吗?我担心的一个问题是保持名称“同步”。例如,如果我将顶级类别从“书籍”更改为“文献”(可怕的例子,我知道),“参考”书籍的子类别的所有键也应更新。

1 个答案:

答案 0 :(得分:6)

让我们向后回答你的问题。

  
    

将产品存放在哈希

中   

这是一个好主意。通常,您希望将实体存储在散列映射中。

  
    

更改类别名称

  

您应该为每个类别使用内部标识符。然后将类别显示名称存储在散列映射中,就像存储产品一样。这种间接是有用的 - 因为它允许您存储类别的附加信息。例如,如果您稍后决定为每个类别显示“最受欢迎产品”,则此类架构将非常有用。

  
    

将产品存储在类别中

  

您可以创建category:books:products之类的密钥,然后存储每个产品的ID。这可以是列表,集合或排序集 - 取决于您要对数据执行的操作。

  1. 如果产品有固有的订单,例如最近添加的产品,那么使用List是有意义的。这样,列表中的第一个元素就是最新的产品。
  2. 如果您希望按照某些条件(例如“已下载最多”或“查看次数最多”)对产品进行排序,则应使用有序集。
  3. 如果某个类别中的产品之间没有其他关系,请使用Set。
  4. 使用SetSortedSet可以执行交叉点。当你想要一个项目的子集时,这些就派上用场了,例如“O'Reilly出版的书籍”。要做到这一点,你必须维护另一套包含书籍ID的“publisher:preilly”。

      
        

    存储类别集合

      

    现在,您建议使用SortedSet,这是一种可能的解决方案。但如果类别的顺序不会动态变化,您也可以使用列表。例如,如果您总是希望按升序显示类别,则列表就足够了。

    如果订单会动态更改,则SortedSet会很有用。例如,如果要根据每个类别中的产品数显示类别 - 那么将它们存储在SortedSet中是个好主意。

    另外,请记住,您可以使用多个列表或排序集 - 每个集合可以表示不同的用例。让我们假设你不想向海外客户出售书籍。在这种情况下,您可以使用另一个键categories:overseas并存储要显示的类别。