MongoDB是社区网站的正确数据库吗?

Xom*_*mby 6 mongoose mongodb node.js

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

  1. 我已经读过如果你只在一台机器上使用它而你可能会遇到数据丢失,那么MongoDB是不可靠的.是对的吗?该项目并不是那么大,我可以负担得起另一台服务器和数据丢失是完全不行!想象一下,一些论坛帖子就消失了.但我想如果发生这种情况,人们就不会使用它.

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

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

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

  5. 你如何处理猫鼬的竞争状况?您从db加载文档,编辑并稍后保存.但也许它已经在同一时间发生了变化.

mne*_*syn 8

分别解决每个问题:

  1. 不,那不再是真的了.较旧版本的MongoDB没有日记功能,但是当前版本没有日志功能,而且从第2版开始,默认情况下会激活它.但是,您应该SafeMode在驱动程序级别使用a ,以确保驱动程序和数据库之间的通信成功.

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

    a)通常,我们只想在给定线程中获取站点范围内的最新注释或n个最新注释,这两个注释都无法使用嵌入式文档完成.

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

    c)正如Joe指出的那样,你必须在不同的系统中处理全文搜索.

  3. 如果您有大量更新,嵌入式文档就不太适合,因为容器(包含嵌入对象的集合项)将会增长.当它增长时,MongoDB将不得不重新分配它,这可能需要更长的时间并分割数据.

    图3(a).对于朋友的状态更新,使用扇出策略是有道理的.我昨天回答了类似的问题.

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

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