Database design 在键/值数据库(如Redis)中分组数据

Database design 在键/值数据库(如Redis)中分组数据,database-design,nosql,redis,methodology,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" ZA

我正在尝试在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"
[...]
从这里开始,我想我可以把产品储存在散列中

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数据库存储都很陌生,所以我对自己的方法一点也不自信。这种模式对我来说长期有效吗?我是否应该知道有更好的/替代方法?我关心的一个问题是保持名称“同步”。例如,如果我将顶级类别从“书籍”更改为“文学”(我知道这是一个糟糕的例子),那么“参考”书籍子类别的所有键也应该更新。

让我们反向回答您的问题

将产品存储在散列中

这是个好主意。通常,您希望在hashmap中存储实体

更改类别名称

您应该为每个类别使用一个内部标识符。然后将类别显示名称存储在hashmap中,就像存储产品一样。这种间接方式很有用,因为它允许您存储类别的附加信息。例如,如果您以后决定为每个类别显示“最受欢迎的产品”,那么这样的模式将非常有用

分类存储产品

您可以创建一个键,如
category:books:products
,然后存储每个产品的ID。这可以是列表、集合或分类数据集,具体取决于您对数据的处理方式

  • 如果产品有内在的顺序,例如最近添加的产品,那么使用列表是有意义的。这样,列表中的第一个元素就是最新的产品
  • 如果您希望根据某些标准(如“下载次数最多”或“浏览次数最多”)对产品进行排序,则应使用排序集
  • 如果类别中的产品之间没有其他关系,请使用集合
  • 使用
    集合
    分类集合
    可以执行交叉。当您需要项目的子集(如“O'Reilly出版的图书”)时,这些工具非常有用。为此,您必须维护另一个包含图书ID的集“publisher:preilly”

    存储类别集合

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

    如果订单将动态更改,则SortedSet将非常有用。例如,如果您希望根据每个类别中的产品数量显示类别,则将其存储在SortedSet中是一个好主意


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

    回答得很好。信息丰富且清晰。谢谢非常感谢。