database-design - 在像 Redis 这样的键/值数据库中对数据进行分组

标签 database-design nosql redis methodology

我正在尝试在 Redis 数据库中对类似于 amazon.com 类别(例如书籍、电影、电子产品等)的数据进行建模。当它们呈现在 HTML 页面上时,顺序对我来说很重要,以便为用户呈现一致的用户界面。因此,我将类别存储在 Sorted Set 中:

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

然后我为每个子类别创建了另一个 Sorted Set。

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

最佳答案

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

Storing Products in a Hash

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

Changing Category Names

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

Storing Products in Category

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

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

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

Storing a collection of Categories

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

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

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

关于database-design - 在像 Redis 这样的键/值数据库中对数据进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12031071/

相关文章:

c# - mongo C# 通过id删除多条记录

redis - Redis官网的查询教程在哪里?

redis - 有没有办法从哈希返回排序的键列表?

mysql - 这种关系的最佳数据结构

java - Cassandra:分区键只支持 EQ 和 IN 关系(除非你使用 token() 函数)

database - 只向表中添加一列而不是执行连接操作是否更好?

nosql - Cassandra 中的一对多等价物和数据模型优化

Laravel 为 Redis 分离读/写操作?

ms-access - MS Access 中的一对一关系

database-design - 为什么单主键比复合键好?