【问题标题】:Storing two way relational data in Redis在 Redis 中存储双向关系数据
【发布时间】:2013-12-09 08:24:42
【问题描述】:

在过去的几天里,我一直在为自己(和其他一些人)开发一个非常简单的 Web 服务,它可以让我跟踪我阅读过的书籍以及阅读它们的时间。虽然存储用户和书籍(标题 + 作者 + 未来可能会有更多数据)相对简单,因为它们可以存储为带有键 user:usernamebook:uniqueID 的哈希值,分别存储哪些用户阅读了哪些书籍以及何时被证明是有点挑战。

我最初的计划是为用户 (user:username:readbooks) 设置一个排序集,该用户使用时间戳作为分数(用于用户阅读图书的时间)并将每本书的唯一 ID 作为值。这种方法的问题是我不能存储用户已经读过一本书两次(因为你不能在一组中有重复的值)。这也意味着为了跟踪一本书的读者,我必须将它们添加到第二组readersof:bookID

我目前的方法不是直接将书籍 ID 存储在集合 user:username:readbooks 中,而是以 uniqueReadingEventId.bookId 的形式存储一个值,但是这样做的问题是,如果我删除一本书(而不是唯一的阅读事件)我必须遍历集合readersof:bookID 中的每个用户,遍历user:username:readbooks 中的每个值并删除与x.bookId 匹配的值,这似乎有点低效。此外,我可能希望找到同时阅读过两本书或更多书的用户。

因此,我的问题有两个方面:是否有一种更简单的方法可以在 Redis 中构建我的数据,或者我的数据是否可以更好地构建到不同的 NoSQL 系统?我真的很想继续使用 Redis,因为我喜欢它的 API,但是因为它是一个个人项目,所以我使用什么并不重要。

【问题讨论】:

    标签: nosql redis


    【解决方案1】:

    除非您出于某种原因需要非常高的吞吐量,否则 Redis 听起来并不是正确的选择。听起来您想要存储大量文档级别的信息,而高吞吐量和数据结构对您来说都不是一个大问题。对我来说,只使用 SQL 就尖叫起来。您的数据非常示意性 - 从您所说的来看,SQL 确实没有理由不能最好并且最简单地适合您的用例。如果您接受使用 NoSQL 的想法,那么像 Mongo 这样更通用的用例数据库之一也可以很好地发挥作用。

    Redis 作为持久性数据库专门用于需要高吞吐量、数据结构有用并且不介意支付将所有内容保存在内存中而不是成本低得多的 HD 空间的额外成本的情况。 Redis 非常适合的场景有很多,但你的不是其中之一。

    【讨论】:

    • 感谢您的反馈。这主要是作为 NoSQL 系统的实验完成的(我以前在数据库方面的主要经验是 MySQL 和 SQLite),Redis 最初似乎是一个很好的解决方案,但也许 Mongo 会是一个更好的解决方案。请您解释一下“原理图数据”和“结构化数据”之间的区别吗?
    • 我所说的数据结构只是指在 Redis 中实现的计算机科学理论中的典型数据结构:哈希、列表、集合等......其中一些具有您想要使用的很好的属性(就像你知道你只需要一个哈希并且永远不需要排序等等......),这在 Redis 中很容易做到和理解,而不是你在其他数据库中可以访问的东西。原理图数据是指符合严格的预定义模式的数据。这与单个表中的不同文档具有不同属性的数据形成对比。您的数据非常简略。
    • 感谢@Eli 的澄清