选择 MYSQL 而不是 Mongodb
Choosing MYSQL over Mongodb
来自mongoDB docs:
When would MySQL be a better fit?
A concrete example would be the booking engine behind a travel
reservation system, which also typically involves complex
transactions. While the core booking engine might run on MySQL, those
parts of the app that engage with users – serving up content,
integrating with social networks, managing sessions – would be better
placed in MongoDB
在这个具体例子中有两件事我不明白(一点也不明白):
什么样的查询足够复杂更适合MYSQL
(这样查询的具体例子会有很大帮助)?
将“核心预订引擎”与
“与用户互动的应用程序部分”?
我的担忧不是理论上的,因为我们在我们的应用程序中同时使用了 MYSQL 和 MongoDB,更好地理解上述内容将真正帮助我们为未来的功能设计我们的数据库模型。
MySQL 是 ACID 兼容的(假设您使用的是 INNODB 或类似的),MogoDB 不是。在此处阅读有关原子性的 MongoDB 文档:
想想去杂货店结账,POS 系统正在使用 MySQL。单笔交易可能会发生哪些步骤?
- 已扫描商品,检索到价格
- 库存已更新,现有数量减 1
- 部门指标已更新(添加金额、数量、项目
类型等)
- 商品打折吗?显示客户节省了多少钱
收据
- 客户使用了优惠券,确保我们通知供应商以便我们获得
报销
- 将收据总数发送到会计,更新月/年/周统计数据
现在该付款了。糟糕!顾客把钱包落在家里,说他稍后会回来。我们已经对许多数据库 table 进行了所有这些更改,现在我们要做什么?如果我们使用 MySQL 并在单个事务中进行所有这些更新,我们可以只回滚该事务而不会造成任何伤害。所有更改都将自动还原,并以正确的顺序进行。
在非事务性数据库中执行此操作意味着编写代码以正确的顺序回溯所有这些更改。
MongoDB 适合文档存储和检索。一次创建一小段文档并不是我的首选,因为您希望将零碎的信息存储在不同的地方。
我们如何在我们的杂货店示例中使用 MongoDB?我们可以将它用作库存系统的一部分。
我们的 MySQL 库存可以包含我们绝对必须拥有的东西的模式 --- SKU、价格、部门。但是,我们不一定希望通过添加 'Easter_2016_Promotion' 等列来将我们通常不需要知道的内容弄得一团糟。在 MongoDB 中,因为我们没有固定的模式,所以这不是问题。
类似于
db.inventory.update(
{ _id: 1 },
{ $set: { "Easter_2016": "y" } }
)
可以将 "Easter_2016" 字段添加到单个库存项目而不影响任何其他项目。在 MySQL 中,您可以通过添加单个列来影响 table 中的每一行 --- 在 MongoDB 中并非如此。此外,在查询 Mongo 时,您可以在所有记录(文档)中搜索可能存在或可能不存在的字段。在 MySQL 中,该字段存在或不存在。
MongoDB 是为流动的、动态的和(可能)有些未知的模式构建的。它的速度部分取决于这样一个事实,即没有可能必须撤消的整体事务,部分取决于插入时没有不断验证的架构。
需要从我们的 POS 系统分析 100,000 个收据 JSON 文件?只需 运行 mongoimport 并开始查询您想要的内容。
需要为少数库存项目添加一些特殊数据或将少数客户标记为 'special handing'? Mongo数据库也是如此。
需要从 20 个不同的州导入和查询税收 returns(想想:不同的字段名称,不同的字段数量,有一些重叠)? Mongo 在这里获胜,毫无疑问。
任何有几个已知的、具体的步骤必须起作用,并且在正确的顺序中起作用的东西(想想:ATM 机),MySQL 更合适。
具有多个联接的查询将是一个很好的例子。这一点背后的主要思想是,在关系数据库中 m:n
关系是对称的,而在面向文档的数据库中,它们不是。从 v3.2 开始,MongDB $lookup 在一定程度上解决了这个问题。
核心预订引擎和表示引擎之间的界线由CAP theorem. The core part must be consistent, while the client-facing part can be implemented with eventual consistency. A recommended workaround for lack of atomic transactions in MongoDB should shed some light to this statement. Alternatively your core booking part can use event sourcing绘制,以保持状态一致而无需事务。
来自mongoDB docs:
When would MySQL be a better fit?
A concrete example would be the booking engine behind a travel reservation system, which also typically involves complex transactions. While the core booking engine might run on MySQL, those parts of the app that engage with users – serving up content, integrating with social networks, managing sessions – would be better placed in MongoDB
在这个具体例子中有两件事我不明白(一点也不明白):
什么样的查询足够复杂更适合MYSQL (这样查询的具体例子会有很大帮助)?
将“核心预订引擎”与 “与用户互动的应用程序部分”?
我的担忧不是理论上的,因为我们在我们的应用程序中同时使用了 MYSQL 和 MongoDB,更好地理解上述内容将真正帮助我们为未来的功能设计我们的数据库模型。
MySQL 是 ACID 兼容的(假设您使用的是 INNODB 或类似的),MogoDB 不是。在此处阅读有关原子性的 MongoDB 文档:
想想去杂货店结账,POS 系统正在使用 MySQL。单笔交易可能会发生哪些步骤?
- 已扫描商品,检索到价格
- 库存已更新,现有数量减 1
- 部门指标已更新(添加金额、数量、项目 类型等)
- 商品打折吗?显示客户节省了多少钱 收据
- 客户使用了优惠券,确保我们通知供应商以便我们获得 报销
- 将收据总数发送到会计,更新月/年/周统计数据
现在该付款了。糟糕!顾客把钱包落在家里,说他稍后会回来。我们已经对许多数据库 table 进行了所有这些更改,现在我们要做什么?如果我们使用 MySQL 并在单个事务中进行所有这些更新,我们可以只回滚该事务而不会造成任何伤害。所有更改都将自动还原,并以正确的顺序进行。
在非事务性数据库中执行此操作意味着编写代码以正确的顺序回溯所有这些更改。
MongoDB 适合文档存储和检索。一次创建一小段文档并不是我的首选,因为您希望将零碎的信息存储在不同的地方。
我们如何在我们的杂货店示例中使用 MongoDB?我们可以将它用作库存系统的一部分。
我们的 MySQL 库存可以包含我们绝对必须拥有的东西的模式 --- SKU、价格、部门。但是,我们不一定希望通过添加 'Easter_2016_Promotion' 等列来将我们通常不需要知道的内容弄得一团糟。在 MongoDB 中,因为我们没有固定的模式,所以这不是问题。
类似于
db.inventory.update(
{ _id: 1 },
{ $set: { "Easter_2016": "y" } }
)
可以将 "Easter_2016" 字段添加到单个库存项目而不影响任何其他项目。在 MySQL 中,您可以通过添加单个列来影响 table 中的每一行 --- 在 MongoDB 中并非如此。此外,在查询 Mongo 时,您可以在所有记录(文档)中搜索可能存在或可能不存在的字段。在 MySQL 中,该字段存在或不存在。
MongoDB 是为流动的、动态的和(可能)有些未知的模式构建的。它的速度部分取决于这样一个事实,即没有可能必须撤消的整体事务,部分取决于插入时没有不断验证的架构。
需要从我们的 POS 系统分析 100,000 个收据 JSON 文件?只需 运行 mongoimport 并开始查询您想要的内容。
需要为少数库存项目添加一些特殊数据或将少数客户标记为 'special handing'? Mongo数据库也是如此。
需要从 20 个不同的州导入和查询税收 returns(想想:不同的字段名称,不同的字段数量,有一些重叠)? Mongo 在这里获胜,毫无疑问。
任何有几个已知的、具体的步骤必须起作用,并且在正确的顺序中起作用的东西(想想:ATM 机),MySQL 更合适。
具有多个联接的查询将是一个很好的例子。这一点背后的主要思想是,在关系数据库中 m:n
关系是对称的,而在面向文档的数据库中,它们不是。从 v3.2 开始,MongDB $lookup 在一定程度上解决了这个问题。
核心预订引擎和表示引擎之间的界线由CAP theorem. The core part must be consistent, while the client-facing part can be implemented with eventual consistency. A recommended workaround for lack of atomic transactions in MongoDB should shed some light to this statement. Alternatively your core booking part can use event sourcing绘制,以保持状态一致而无需事务。