【问题标题】:Grouping Data in a Key/Value Database Like Redis在 Redis 等键/值数据库中对数据进行分组
【发布时间】:2012-08-15 09:27:50
【问题描述】:

我正在尝试在 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 数据库存储都非常陌生,因此我对自己的方法毫无信心。这个模型对我有用吗?有没有我应该注意的更好/替代方法?我担心的一个问题是保持名称“同步”。例如,如果我将顶级类别从“书籍”更改为“文学”(可怕的例子,我知道)“参考”书籍的子类别的所有键应该更新了。

【问题讨论】:

    标签: database-design nosql redis methodology


    【解决方案1】:

    让我们倒过来回答你的问题。

    在哈希中存储产品

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

    更改类别名称

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

    在类别中存储产品

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

    1. 如果产品有内在顺序,例如最近添加的产品,那么使用列表是有意义的。这样,列表中的第一个元素就是最新的产品。
    2. 如果您希望根据“下载次数最多”或“浏览次数最多”等标准对产品进行排序,则应使用排序集。
    3. 如果类别中的产品之间没有其他关系,请使用 Set。

    使用SetSortedSet 可让您执行交叉。当您需要项目的子集时,这些会派上用场,例如“O'Reilly 出版的图书”。为此,您必须维护另一个包含图书 ID 的集合“publisher:preilly”。

    存储类别集合

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

    如果顺序会动态变化,SortedSet 会很有用。例如,如果您想根据每个类别中的产品数量来显示类别 - 那么将它们存储在 SortedSet 中是一个好主意。

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

    【讨论】:

    • 很好的答案。非常翔实和清晰。非常感谢。
    猜你喜欢
    • 2012-12-16
    • 2020-12-09
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 2011-05-26
    • 1970-01-01
    相关资源
    最近更新 更多