在类似Redis的键值数据库中对数据进行分组

3

我正在尝试在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和键/值数据库存储都很陌生,因此我对自己的方法并不自信。这个模型长期来看能行吗?还有更好/替代的方法需要我知道吗?我担心的一个问题是保持名称“同步”。例如,如果我将顶级类别从“Books”更改为“Literature”(我知道这是一个糟糕的例子),则所有“引用”书籍的子类别的键都应该被更新。

1个回答

6
让我们倒推问题的答案。
将产品存储在哈希表中是一个好主意。通常,您希望在哈希表中存储实体。
更改类别名称时,应为每个类别使用内部标识符。然后,像存储产品一样,在哈希表中存储类别显示名称。这种间接性很有用,因为它允许您为类别存储附加信息。例如,如果以后决定为每个类别显示“最受欢迎的产品”,则此架构将非常有用。
您可以创建类似于category:books:products的键,然后存储每个产品的ID。这可以是列表、集或排序集-具体取决于您想要执行的数据操作。
如果产品有内在顺序(例如最近添加的产品),则使用列表是有意义的。通过这种方式,列表中的第一个元素是最近的产品。
如果您希望根据某些标准对产品进行排序,例如“下载次数最多”或“查看次数最多”,则应使用排序集。
如果类别中没有其他关系,则使用集。
使用Set或SortedSet可以执行交集。当您想要子集项(例如“由O'Reilly出版”的书籍)时,这些功能非常方便。为此,您将需要维护另一个包含书籍ID的集合“publisher: preilly”。
现在,您建议使用SortedSet,这是一种可能的解决方案。但是,如果类别的顺序不会动态更改,则也可以使用列表。例如,如果您始终希望按升序显示类别,则列表就足够了。
如果要动态更改顺序,则SortedSet非常有用。例如,如果您想根据每个类别中的产品数量显示类别,则将它们存储在SortedSet中是一个好主意。
此外,请记住,您可以使用多个列表或排序集-每个集合可以表示不同的用例。假设您不想向海外客户销售图书。在这种情况下,您可以拥有另一个键categories:overseas并存储要显示的类别。

非常好的回答。非常详细和清晰。非常感谢。 - senfo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接