在Mongodb上选择MYSQL

Dan*_*iel 2 mysql relational-database mongodb nosql

来自mongoDB文档:

什么时候MySQL会更合适?

一个具体的例子是旅行预订系统背后的预订引擎,它通常也涉及复杂的交易.虽然核心预订引擎可能在MySQL上运行,但应用程序中与用户互动的那些部分 - 提供内容,与社交网络集成,管理会话 - 将更好地放置在MongoDB中

在这个(甚至不是一点点)具体的例子中我不理解的两件事:

  • 什么样的查询足够复杂,更适合MYSQL(这种查询的具体示例有很大帮助)?

  • 从" 与用户互动的应用程序部分 " 中分离出" 核心预订引擎 " 的界限在哪里?

我的关注不是理论上的,因为我们在我们的应用程序中同时使用MYSQL和MongoDB,更好地理解上述内容将真正帮助我们设计用于未来功能的数据库模型.

JLB*_*JLB 9

MySQL符合ACID(假设您正在使用INNODB或类似产品),MogoDB不是.在这里阅读有关原子性的MongoDB文档:

MongoDB原子性

考虑去杂货店结账,POS系统正在使用MySQL.单笔交易可能会采取哪些步骤?

  • 扫描物品,检索价格
  • 库存已更新,库存数量减1
  • 部门指标已更新(添加金额,数量,项目类型等)
  • 该商品是否有售?显示客户在收据上保存了多少钱
  • 客户使用优惠券,请确保我们通知供应商,以便我们获得报销
  • 将收据总计发送到会计,更新月/年/周统计

现在是时候付钱了.OOPS!顾客把钱包留在家里,并说他会晚点回来.我们已经对许多数据库表进行了所有这些更改,现在我们该怎么办?如果我们使用MySQL并在单个事务中拥有所有这些更新,我们可以回滚一个事务并且不会造成任何损害.所有更改将自动恢复,并按正确顺序.

在非事务性数据库中执行此操作意味着编写代码以按正确的顺序回溯所有这些更改.

MongoDB适用于文档存储和检索.这不是我一次创建一小块文档的首选,您希望在单独的地方存储一些信息.

我们如何在杂货店示例中使用MongoDB?我们可以将它用作库存系统的一部分.

我们的MySQL库存可能有我们绝对必须拥有的模式 - SKU,价格,部门.但是,我们不一定要通过添加诸如'Easter_2016_Promotion'之类的列来混淆我们通常不需要知道的事情.在MongoDB中,由于我们没有一个完整的架构,这不是问题.

就像是

db.inventory.update(
   { _id: 1 },
   { $set: { "Easter_2016": "y" } }
)
Run Code Online (Sandbox Code Playgroud)

可以将"Easter_2016"字段添加到单个库存项目而不影响任何其他库存项目.在MySQL中,通过添加单个列来影响表中的每一行 - 在MongoDB中不是这样.此外,在查询Mongo时,您可以在所有记录(文档)中搜索可能或可能不存在的字段.在MySQL中,字段存在或不存在.

MongoDB是为流畅,动态且(可能)有些未知的模式而构建的.它的速度部分依赖于这样一个事实,即它可能不必撤消整体事务,并且部分地说在插入时没有一个模式可以不断地进行验证.

需要从我们的POS系统分析100,000个收据JSON文件?只需运行mongoimport并开始查询您想要的内容.

需要为少数库存项目添加一些特殊数据,或者将少数客户标记为"特殊处理"?MongoDB也是如此.

需要从20个不同的状态导入和查询纳税申报表(想想:不同的字段名称,不同的字段数,有几个重叠)?Mongo在这里赢得胜利.

任何具有几个已知的,具体步骤必须工作的东西,并且在适当的情况下工作(然而(想想:ATM机))和MySQL是更合适的.