我正在权衡从关系SQL数据库迁移到mongodb以获取Web应用程序的优缺点。这是性能问题*。
在对象本身中存储所有对象依赖项允许快速"读取" 以向用户显示数据。另一方面,一些数据呈现在不同的集合中(例如,用户名集合在用户集合中,但也在评论集合中)。我想知道如何处理此重复数据的更新,以便快速"写入" 。
我希望避免处理这些重复的更新同步。
您有什么异步更新选项?有没有好的做法?
我对此的看法是依赖于特定的mongodb机制(我不知道)或在memcache / redis / zeromq引擎中堆叠所需的更新,以便由异步进程异步播放。
(*)我的问题不是关于如何优化连接,索引和sql数据库引擎,SO上的其他帖子处理它。
答案 0 :(得分:0)
基本上你有3个选择:
只需存储userId
,然后单独获取用户。这样,您始终可以在新数据方面获得最佳结果。但当然它更慢。这基本上是关系数据库的作用。 SQL DB只需查看外键并按id获取数据。
使用过期数据。在评论中存储用户名的副本。有时这是期望的行为,因为这样您可以完全按照存储时的方式表示数据。这意味着:如果John创建了一条评论,之后他的用户名更新为Paul,您仍然可以看到,这是作为John创建的。 (这对于发票来说特别有用,当你在那里引用一个人并且地址发生变化时,你不想更新旧发票的地址)
更新用户名时,更新包含用户名的所有内容。这也不错,因为用户名通常不会改变。所以读取总是很快,因为名称存储在注释中。如果名称发生变化,您必须更新用户所涉及的所有内容。这当然是一项缓慢的任务,但因为它不应该每分钟发生,所以它是可以容忍的。
3.1您可以优化事物:如果用户名更改,则会将其存储在某处并在午夜应用。这样,您可以收集多个名称更改并同时更新所有内容。
如您所见: NoSQL是关于选择的。您可以做最适合您数据的事情。当然,这总是一个权衡:更慢/更快,更多/更少的代码编写,更容易/更难维护。
总结一下: