mongodb - MongoDB 是社区站点的正确数据库吗?

我正在使用 Node.JS 和 Express 创建一个社区站点,几乎所有快速教程或示例都使用 MongoDB,所以我检查了它。到目前为止,我使用的唯一数据库是 MySQL,但我对它不太熟悉,所以读 MongoDB 不会打扰我。 Mongo 看起来很不错,文档模型可能是有益的。有了 Mongoose ,它很容易使用。但是我有一些问题,所以如果 MongoDB 根本不适合我,我不会花很多时间学习使用它:

  1. 我听说如果你只在一台机器上使用 MongoDB 是不可靠的,你可能会遇到数据丢失的情况。那正确吗?这个项目并没有那么大,我买不起另一台服务器,数据丢失是绝对不行的!想象一下,一些论坛帖子消失了。但我想如果发生这种情况人们不会使用它。

  2. 该站点将包含一个自建论坛,我不确定关系数据库是否会更好。但是,您可以使用嵌入式帖子等保存线程。但是不知道如何搜索,因为 Mongo 不支持全文搜索。你怎么看?

  3. 什么时候在 Mongo 中使用嵌入文档?示例:用户可以在 Twitter 上发布状态更新。您会将这些更新保存在用户文档中吗?可以更新很多。还是每次更新的文档并将其链接到用户 ID? 3.1 以及如何跨多个文档进行查询?您想获取 friend 的最近 10 次状态更新。您可以使用 MySQL 中的 JOIN 来做到这一点。

  4. 有没有办法像 MySQL 那样对文档使用自动增量 ID?例如,用户应该有一个唯一的整数键,但我不想要像 Mongo 那样的随机数,以保持用户 ID 较小。

  5. 你如何处理 Mongoose 中的竞争条件?您从数据库加载文档,编辑某些内容并稍后保存。但也许同时它已经改变了。

最佳答案

分别解决每个问题:

  1. 不,这不再是真的了。旧版本的 MongoDB 没有日志,但当前版本有,并且从 v. 2 开始,它默认被激活。但是,您应该在驱动程序级别使用 SafeMode,以确保驱动程序和数据库之间的通信成功。

  2. 嵌入式帖子和线程可能不是最佳选择。我们构建了一个类似的东西,我们使用一个平面集合,每个帖子都存储 ParentId 和 ParentThreadId。嵌入有利有弊,但我们决定的论据是:

    a) 通常,我们只想获取站点范围内的最新评论或给定线程中的n 个最新评论,这两者都不能真正使用嵌入式文档来完成。

    b) 如果你有很多人同时写同一个主题,你需要小心并发。这可以解决,但我们觉得使用不会真正干扰的不同对象更安全,即使你犯了错误

    c) 正如 Joe 所指出的,您必须在不同的系统中处理全文搜索。

  3. 如果你有很多更新,嵌入文档就不太适合,因为容器(包含嵌入对象的集合项)会增长。当它增长时,MongoDB 将不得不重新分配它,这可能需要更长的时间和碎片数据。

    3(a)。对于 friend 的状态更新,使用扇出策略是有意义的。我 answered a similar question yesterday .

  4. 不要使用自动递增的数字。默认情况下,这是一个有缺陷的设计,因为它在分布式环境中并不能很好地工作。对于数据库,它是存储一个值为 0x00000001int 还是一个值为 0xfa9ac7335 的值都没有区别。保持数字很小是没有意义的。我会选择 Mongo ObjectIdGuid/UUID。前者还包含一个时间戳。

  5. 我没用过mongoose,但总的来说,有悲观锁和乐观锁的典型策略。

https://stackoverflow.com/questions/8182464/

相关文章:

node.js - Mongoose 更新 : $inc is not working in ups

mongodb - Mongotemplate - 根据大于(gt)或小于(lt)运算符查询Obje

node.js - Mongoose 得到 `TypeError: user.save is not

node.js - 我可以使用 MongoDb 驱动程序从 node.js 调用 rs.initia

sql - NoSQL 数据库

python - 如何摆脱 mongodb 中的光标 id 错误?

java - 如何在 Morphia/MongoDB Java 中创建复合唯一索引?

c# - 从 2.0 MongoDb c# 驱动程序获取结果

php - MongoDB - PHP - MongoCursorException 'Cursor

sql - rails : mixing NOSQL & SQL Databases