Nosql 在Redis中存储双向关系数据

Nosql 在Redis中存储双向关系数据,nosql,redis,Nosql,Redis,在过去的几天里,我一直在为自己(和其他一些人)开发一个非常简单的web服务,它允许我跟踪我读过的书和我读过的书的时间。虽然存储用户和书籍(标题+作者+未来可能会有更多数据)相对简单,因为它们可以存储为散列,键为user:username和book:uniqueID,分别存储哪些用户读了哪些书以及什么时候证明更具挑战性 我最初的计划是为一个用户(user:username:readbooks)设置一个排序集,该用户使用时间戳作为分数(表示用户何时阅读该书),并使用每本书的唯一ID作为值。这种方法的

在过去的几天里,我一直在为自己(和其他一些人)开发一个非常简单的web服务,它允许我跟踪我读过的书和我读过的书的时间。虽然存储用户和书籍(标题+作者+未来可能会有更多数据)相对简单,因为它们可以存储为散列,键为
user:username
book:uniqueID
,分别存储哪些用户读了哪些书以及什么时候证明更具挑战性

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

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


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

除非您出于某种原因需要非常高的吞吐量,否则Redis听起来不是正确的选择。听起来您需要存储大量文档级别的信息,而高吞吐量和数据结构都不是您所关心的问题。对我来说,仅仅是使用SQL就让我大吃一惊。您的数据是非常示意性的——从您所说的来看,SQL没有理由不适合您的用例。如果您已经接受了使用NoSQL的想法,那么像Mongo这样更通用的用例数据库也可以很好地使用


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

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