使用MongoDB的VS的MySQL有很多JSON领域?(Using MongoDB vs MySQ

2019-08-01 13:45发布

目前应用的微博类型。 在归零的两个主要基本数据库存储有:MySQL或MongoDB中。

我打算反规范化大量的数据,即在后所做的一项投票存储在表决表,也算在主要岗位表递增。 有与岗位涉及了其他行动(例如像,否决)。

如果我使用MySQL,一些数据更适合作为JSON不是固定的模式,更快的查找。

POST_ID   |  activity_data

213423424 | { 'likes': {'count':213,'recent_likers' :
             ['john','jack',..fixed list of recent N users]} , 'smiles' : 
             {'count':345,'recent_smilers' :
             ['mary','jack',..fixed list of recent N users]}  }

有应用程序的其他组件,其中被提出JSON的使用。 因此,更新JSON领域,顺序是:

  1. 阅读python脚本的JSON。

  2. 更新JSON

  3. 存储JSON回的MySQL。

这本来是MongoDB中单次操作与像原子操作$push$inc $pull等。此外文档结构的MongoDB的适合我的数据很好。

我的考虑而选择的数据存储。

关于MySQL的:

  1. 稳定和熟悉的。
  2. 备份和恢复是很容易。
  3. 可以使用一些领域无模式JSON避免一些未来架构更改。
  4. 可能有早期使用的memcached层。
  5. JSON斑点会像帖主的一些表静态的,但是很多会像中邮票和喜欢一些其他表进行更新。

关于MongoDB的:

  1. 更适合于存储架构作为少文档中的数据。
  2. 可能避免,直到后面的阶段缓存。
  3. 有时,应用程序可能会写密集,MongoDB的可以在那些不安全写是不是一个问题点有更好的表现。
  4. 不知道的稳定性和可靠性。
  5. 不知道这是备份和恢复多么容易。

问题:

  1. 我们要选择的MongoDB如果数据的一半是无模式,如果使用MySQL被存储为JSON?
  2. 有的像帖主数据是至关重要的,所以它会使用安全写入保存,计数器等会使用不安全的写操作进行保存。 正是基于这一政策上的数据的重要性,并写密集正确吗?

  3. 有多容易监控,备份和恢复的MongoDB相比,MySQL的? 我们需要计划定期备份(每天说的),并在发生灾难时轻松恢复他们。 什么是最好的选择我有MongoDB中,使之成为应用一个安全的赌注。

稳定性,备份,快照,恢复,更广泛的应用Iedatabase耐久性指着我使用MySQL作为RDBMS +的NoSql即使NoSQL的文档存储可以成为我的目的更好的原因。

请重点关注的MySQL和MongoDB之间的选择考虑了数据库的设计,我心里有你的看法。 我知道有可能是更好的方式来规划数据库的设计与任何RDBMS或MongoDB的文档。 但是,这不是我的问题的当前焦点。

更新 :从MySQL 5.7起,MySQL支持丰富的原生JSON数据类型提供数据的灵活性以及丰富的JSON查询。

https://dev.mysql.com/doc/refman/5.7/en/json.html

Answer 1:

因此,要直接回答问题...

我们要选择的MongoDB如果数据的一半是无模式,如果使用MySQL被存储为JSON?

无模式存储无疑是一个令人信服的理由去与MongoDB的,但正如你指出,这是相当容易储存JSON在RDBMS为好。 MongoDB的背后力量是反对无架构存储丰富的查询。

如果我可以在大约更新JSON场插图指出一个小瑕疵,它不是简单地获取当前值,更新文档,然后将它推回数据库的问题。 该过程必须全部包裹在一个事务。 交易往往是非常简单的,直到你开始非规范化数据库。 然后,作为东西录制给予好评可以锁定表都在你的模式一样简单。

随着MongoDB中,有没有交易。 但操作几乎总是能够在某种程度上允许原子更新的结构。 这通常涉及到从SQL范式一些戏剧性的变化,但在我看来,他们是相当明显的,一旦你停止试图迫使对象到表中。 最起码,很多其他人都碰上你将面临同样的问题,和蒙戈社区往往是相当开放和声音,他们已经克服的挑战。

有的像帖主数据是至关重要的,所以它会使用安全写入保存,计数器等会使用不安全的写操作进行保存。 正是基于这一政策上的数据的重要性,并写密集正确吗?

通过“安全写”我想你的意思是每次写入之后才开启自动“GetLastError函数()”的选项。 我们有一个超过DBCollection,让我们在GetLastError函数()被调用了细粒度的控制非常薄的包装。 然而,我们的政策不是基于以下查询的代码数据有多“重”是的,而是是否期望任何修改,立即显示在下面的读取。

一般来说,这仍然是一个贫穷的指标,我们已经不是迁移到findAndModify()用于相同的行为。 值此,我们依然明确调用GetLastError(),它是当数据库很可能会拒绝写,比如当我们插入()与_id可能重复。

有多容易监控,备份和恢复的MongoDB相比,MySQL的? 我们需要计划定期备份(每天说的),并在发生灾难时轻松恢复他们。 什么是最好的选择我有MongoDB中,使之成为应用一个安全的赌注?

我怕我不能给我们的备份/恢复策略是否有效,因为我们还没有对尚未恢复说话。 我们下面来备份MongoDB的建议; @标记hillick做了总结这些伟大的工作。 我们使用副本集,我们已经迁移的MongoDB的版本,以及引入了新的副本成员。 到目前为止,我们已经没有停机时间,所以我不知道我能讲好这一点。

稳定性,备份,快照,恢复,更广泛的应用iedatabase耐久性指着我使用MySQL作为RDBMS +的NoSql即使NoSQL的文档存储可以成为我的目的更好的原因。

所以,在我的经验,MongoDB的无模式提供数据的存储与一组查询原语不够丰富的事务往往可以通过原子操作来代替的。 它已经很难忘掉10年以上的身价SQL的经验,但我遇到的每一个问题已经直接由社区或10gen的解决。 我们没有数据丢失或有,我可以记得任何停机时间。

简单地说,MongoDB是下最佳的数据存储环境我在的查询,维护,可扩展性和可靠性方面曾经使用双手。 除非我有如此明确的关系,我不能凭良心使用以外的任何其他SQL的应用程序,我将尽一切努力来使用MongoDB的。

我不为10gen的工作,但我是谁做的人非常感激。



Answer 2:

我不打算在比较(我的工作10gen的,不觉得这是适合我这样做),但是,我会回答具体问题的MongoDB评论,这样就可以更好地做决定。

备份

文档这里是非常彻底的,涵盖了许多方面的内容:

  • 块级方法(LVM使得它很容易和相当多的人做到这一点)
  • 有/无日志
  • EBS快照
  • 一般快照
  • 复制(技术上没有备份,但是,很多人用副本集的冗余和备份 - 不建议这一点,但它完成)

直到最近,有没有MongoDB的等效mylvmbackup但一个好人写一个:)在他的词

建国初期至今:这只是一个华而不实的shell脚本,需要更多的方式错误检查。 但它已经为我工作,我想我会分享喜悦。 错误报告,补丁和建议表示欢迎。

从让自己的副本在这里 。

还原

  • 格式等。

mongodump被完全记录在这里和mongorestore是在这里 。

mongodump将不包含索引,但不包含system.indexes集合,以便mongorestore可以重建索引,当你恢复BSON文件。 该BSON文件,而实际的数据mongoexport/mongoimport是不是类型安全的,因此它可以是任何东西(techically说):)

监控

记录在这里 。

我喜欢仙人掌,但据我所知,仙人掌模板未与MongoDB中的变化跟上等依靠旧的语法,以便发布2.0.4,相信有问题。

Nagios的效果很好,但它的Nagios让你无论是爱还是恨它。 很多人都使用Nagios的,它似乎为他们提供了极大的可视性。

我听说一些人在看Zappix的,但我从来没有使用过它,不能发表评论。

此外,还可以使用MMS,它是免费的,外部托管。 您的MongoDB实例运行代理和这些试剂的一个进行通信(使用Python代码)通过HTTPS mms.10gen.com。 我们使用彩信查看MongoDB的情况下,所有性能统计数据,这是从一个高层次的宽视野非常有益的,以及提供向下钻取的能力。 它安装简单,你不必跑这方面的任何硬件。 许多客户都运行它,有的用仙人掌/ Nagios的恭维。

MMS的帮助信息,可以发现这里 (这是一个非常详细的,包容性的文件)。



Answer 3:

一个存储JSON一个MySQL解决方案的缺点是,你将无法在JSON数据有效地搜索。 如果这一切存储在MongoDB中,你可以创建你所有的数据,包括JSON的索引和/或查询。

蒙戈的写入工作得很好,真的失去了你的mysql VS的唯一事情是事务支持,从而回滚多节省的能力。 但是,如果你能犯的原子操作的更改,那么就没有数据安全问题。 如果你被复制,蒙戈提供了一个“最终一致”的承诺,使得奴隶终将镜像主。

MongoDB中不提供原生的执法或某些数据库结构,例如外键的级联,所以你必须要管理那些自己(如既可以通过组成,这是蒙戈的长处之一),或通过使用的DBREFS。

如果你真的需要交易的支持和强大的“安全”写的,但仍然希望通过NoSQL的所提供的灵活性,你可能会考虑一个混合解决方案。 这将允许你使用MySQL作为你的主贴店,然后使用MongoDB的为你的“无模式”店。 下面是对文档的链接讨论混合蒙戈/ RDBMS解决方案: http://www.10gen.com/events/hybrid-applications这篇文章是由10gen公司的网站,但你完全可以做一个快速谷歌搜索找到其他例子。

更新2019年5月28日

该在这里已经有一些改变MySQL和MongoDB的,因为这个答案被张贴的,所以利弊/它们之间的利弊也变得更加模糊。 此更新并没有真正与原来的问题有所帮助,但我这样做,以确保任何新的读者有更多的最新信息。

现在的MongoDB支持事务: https://docs.mongodb.com/manual/core/transactions/

MySQL的现在支持索引和搜索JSON字段: https://dev.mysql.com/doc/refman/5.7/en/json.html



文章来源: Using MongoDB vs MySQL with lots of JSON fields?