何时使用MongoDB

dez*_*dez 47 mysql database database-design relational-database mongodb

我正在编写一个不一定需要扩展能力的应用程序,因为它不会在开始时收集大量数据.(但是,如果我很幸运,我可能会在路上行驶.)

我将在同一个盒子上运行我的Web服务器和数据库(现在).

话虽如此,我正在寻找性能和效率.

我的应用程序的主要部分将是加载博客文章.使用RDBMS(MySQL)我将进行6次查询(其中2个查询是连接),只是为了加载一个博客文章页面.

select blog
select blog_album
select blog_tags
select blog_notes
select blog_comments (join with users)
select blog_author_participants (join with users)
Run Code Online (Sandbox Code Playgroud)

但是,使用MongoDB,我可以对6个表进行反规范化并将其展平为仅2个表/集合,并将我的查询最小化为可能只有一个查询,

users
blogs
    ->blog_album
    ->blog_tags        
    ->blog_notes
    ->blog_comments
    ->blog_author_participants
Run Code Online (Sandbox Code Playgroud)

现在,使用MongoDB架构,将会有一些数据冗余.但是,硬盘空间比CPU /服务器便宜.

1.)这是一个使用MongoDB的好方案吗?

2.)在扩展到单个服务器之外时,您是否只在使用MongoDB时获益?

3.)使用MongoDB是否存在任何持久性风险?我听说在执行插入时可能会丢失数据 - 因为insert首先写入内存,然后写入数据库.

4.)这是否会阻止我在生产中使用MongoDB?

Dan*_*man 32

当您拥有与其优势相匹配的用例时,您将使用MongoDB.

您是否需要无架构的文档存储?不,你有一个稳定的架构.

你需要自动分片吗?不,您没有非常的数据需求或横向扩展硬件的预算.

您需要地图/减少数据处理吗?不适合像博客这样的东西.

那你为什么还在考虑呢?

  • 我很欣赏答案,Dan.我考虑使用mongodb有三个原因:是的,mongodb看起来很迷人,在看到一些基准测试,教程,文章数量后,我开始质疑,"为什么不使用mongodb?" 1.)效率 - 减少查询数量,减少表格数量和维护代码.2.)它的灵活性 - 能够动态改变它的数据结构 - 然而,这种灵活性让我害怕冒着错误地写数据的风险 (2认同)

MDa*_*ubs 22

但是,使用MongoDB,我可以对6个表进行去规范化并将其展平为2个表/集合,并将查询最小化为可能只有1个查询

但是,通过一个精心设计的SQL语句,您可以轻松地在MySQL中查询与单个博文相关的6个表的信息.

但硬盘空间比CPU /服务器便宜.

如果性能和扩展是一个优先级,那么您将关注拥有足够的RAM以使所有内容适合主内存和足够的CPU内核来运行查询.企业级RAID 10阵列是必需的,不要误会我的意思,但是一旦你的数据库软件(MongoDB或MySQL)需要扫描一个不能适合主内存的索引,你就会进入一个世界假设一个大的活动数据库的痛苦.:)

我喜欢MongoDB,但在我看来它的强大之处在于map/reduce和它的面向文档.您既不需要这些功能.MySQL在大规模部署中经过时间考验并支持分区(但我认为你的数据库必须大约为50-100 GB才能实现分区与单个(加上被动备份)服务器的大量收益.吨(64 GB +)的RAM.我还会争辩说,如果性能确实是一个问题,那么MySQL会更好,因为你可以对索引拥有最高的控制权.

这并不是说MongoDB不是高性能,但它的位置可能不是为博客提供服务.您对插入的关注也是有效的.MongoDB不是ACID系统.谷歌交易在两个系统中进行比较.


gus*_*idd 12

这是一个很好的解释:http://mod.erni.st/nosql-if-only-it-was-that-easy/

最后一段总结了它:

我打算如何构建我的下一个应用程序?可能是Postgres.我会使用NoSQL吗?也许.我也可以使用Hadoop和Hive.我可能会把所有内容保存在平面文件 也许我会开始攻击磁悬浮.我将使用最适合这份工作的东西.如果我需要报告,我将不会使用任何NoSQL.如果我需要缓存,我可能会使用Tokyo Tyrant.如果我需要ACIDity,我不会使用NoSQL.如果我需要大量的计数器,我会使用Redis.如果我需要交易,我会使用Postgres.如果我有一大堆单一类型的文件,我可能会使用Mongo.如果我每天需要写10亿件物品,我可能会使用Voldemort.如果我需要全文搜索,我可能会使用Solr.如果我需要对volatile数据进行全文搜索,我可能会使用Sphinx.


Wol*_*lph 7

NoSQL与RDBMS:苹果和橘子?

在你决定是否可以使用之前,我建议你先阅读一下NoSQL是什么以及它做了什么.您无法将普通数据库转换为NoSQL,就像那样.处理数据的方式完全不同.

NoSQL绝对有其用途.但它绝对不是一切的答案.NoSQL的主要优点是易于更改的数据模型.


Rav*_*abu 5

使用mongodb的优点(根据文章Moshe Kaplan发表)dzone

  1. 无架构设计
  2. 管理Tera字节数据的可扩展性
  3. 具有高可用性功能的快速replicaSet
  4. 分片可以在没有预算的情况下实现线性和扩展增长
  5. 支持高写入负载
  6. 使用数据位置进行查询处理

MongoDB的满足ConsistencyPartitioning要求,CAP理论(一致性,可用性和分区)

相关的SE问题:

与关系数据库相比,使用像MongoDB这样的无模式数据库有什么好处?

什么时候去Redis?什么时候到MongoDB?