使用 MongoDB 与 MySQL 与大量 JSON 字段?

2024-02-26

有一种微博类型的应用程序。两个主要的基本数据库存储是: MySQL 或 MongoDB。

我计划对大量数据进行非规范化,即对帖子进行的投票存储在投票表中,并且主帖子表中的计数也会增加。该帖子还涉及其他操作(例如点赞、投票否决)。

如果我使用 MySQL,一些数据更适合 JSON,而不是固定模式,以便更快地查找。

E.g.

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 blob 在某些表(如主帖子)中是静态的,但在其他一些表(如帖子投票和点赞)中会大量更新。

关于 MongoDB:

  1. 更适合将无模式数据存储为文档。
  2. 可以在稍后阶段避免缓存。
  3. 有时应用程序可能会变得写入密集型,在不安全写入不存在问题的情况下,MongoDB 可以表现得更好。
  4. 不确定稳定性和可靠性。
  5. 不确定备份和恢复有多容易。

问题:

  1. 如果一半数据是无模式的,如果使用 MySQL 则存储为 JSON,我们是否应该选择 MongoDB?
  2. 一些数据(例如主要帖子)至关重要,因此将使用安全写入、计数器等来保存 将使用不安全写入来保存。该策略基于数据的重要性和写入强度是否正确?

  3. 与 MySQL 相比,监控、备份和恢复 MongoDB 容易吗?我们需要计划定期备份(比如每天),并在发生灾难时轻松恢复它们。我对 MongoDB 有哪些最佳选择,使其成为应用程序的安全选择。

稳定性、备份、快照、恢复、更广泛的采用(即数据库持久性)是我关注的原因 使用 MySQL 作为 RDBMS+NoSql,尽管 NoSQL 文档存储可以更好地满足我的目的。

请考虑我所考虑的数据库设计,集中讨论 MySQL 和 MongoDB 之间的选择。我知道可能有更好的方法来使用 RDBMS 或 MongoDB 文档来规划数据库设计。但这不是我当前问题的焦点。

UPDATE:从 MySQL 5.7 开始,MySQL 支持丰富的原生 JSON 数据类型它提供了数据灵活性以及丰富的 JSON 查询。

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


所以,直接回答问题...

如果一半数据是无模式的,如果使用 MySQL 则存储为 JSON,我们是否应该选择 mongodb?

无模式存储无疑是使用 MongoDB 的一个令人信服的理由,但正如您所指出的,在 RDBMS 中存储 JSON 也相当容易。 MongoDB 背后的力量在于针对无模式存储的丰富查询。

如果我可以指出图中有关更新 JSON 字段的一个小缺陷,那么它不仅仅是获取当前值、更新文档然后将其推回到数据库的问题。该过程必须全部包装在事务中。事务往往相当简单,直到您开始对数据库进行非规范化。然后,像记录赞成票这样简单的事情就可以锁定整个架构中的表。

对于 MongoDB,没有事务。但操作几乎总是可以以允许原子更新的方式构建。这通常涉及 SQL 范式的一些巨大转变,但在我看来,一旦您停止尝试将对象强制放入表中,这些转变就相当明显。至少,许多其他人也遇到过与您面临的相同问题,并且 Mongo 社区往往相当开放并直言不讳地谈论他们所克服的挑战。

一些数据(例如主要帖子)至关重要,因此将使用安全写入来保存,计数器等将使用不安全写入来保存。该策略基于数据的重要性和写入强度是否正确?

我认为“安全写入”是指在每次写入后打开自动“getLastError()”的选项。我们在 DBCollection 上有一个非常薄的包装,它允许我们对何时调用 getLastError() 进行细粒度控制。然而,我们的策略不是基于数据的“重要”程度,而是基于查询后面的代码是否期望任何修改在接下来的读取中立即可见。

一般来说,这仍然是一个糟糕的指标,我们已经迁移到 findAndModify() 来实现相同的行为。当我们仍然显式调用 getLastError() 时,数据库可能会拒绝写入,例如当我们使用可能重复的 _id 进行 insert() 时。

与 mysql 相比,Mongodb 的监控、备份和恢复容易吗?我们需要计划定期备份(例如每天),并在发生灾难时轻松恢复它们。为了使其成为应用程序的安全选择,我对 mongoDb 有哪些最佳选择?

恐怕我无法谈论我们的备份/恢复策略是否有效,因为我们还没有进行恢复。我们遵循 MongoDB 建议进行备份; @mark-hillick 做了很好的总结。我们正在使用副本集,并且我们已经迁移了 MongoDB 版本并引入了新的副本成员。到目前为止,我们还没有停工,所以我不确定我能否很好地表达这一点。

稳定性、备份、快照、恢复、更广泛的采用(即数据库持久性)是我使用 MySQL 作为 RDBMS+NoSql 的原因,尽管 NoSQL 文档存储可以更好地满足我的目的。

因此,根据我的经验,MongoDB 提供了无模式数据的存储,以及一组足够丰富的查询原语,事务通常可以被原子操作取代。忘记 10 多年的 SQL 经验是很困难的,但我遇到的每个问题都已由社区或 10gen 直接解决。据我所知,我们没有丢失数据,也没有发生过任何停机情况。

简而言之,MongoDB 在查询、维护、可扩展性和可靠性方面无疑是我使用过的最好的数据存储生态系统。除非我的应用程序具有如此明显的关系,以至于我凭良心不能使用 SQL 以外的任何东西,否则我会尽一切努力使用 MongoDB。

我不为 10gen 工作,但我非常感谢为 10gen 工作的人们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 MongoDB 与 MySQL 与大量 JSON 字段? 的相关文章

随机推荐

  • 为什么 TypeScript 接口不支持索引签名,而类型别名却支持? [复制]

    这个问题在这里已经有答案了 我有一个带有字符串索引签名的类型 declare var result key string number 将接口分配给该类型失败 interface IData a number b number declar
  • 使用 ?attr/selectableItemBackground 作为背景时如何修改波纹颜色?

    我见过一些 SO 问题 他们给出了一些可能的方法来实现我想要的 例如 Use colorControlHighlightstyles xml 中的属性 这是我的 styles v21 xml 还有我的小部件
  • 两个不相等的浮点数相减是否可以得到0?

    在下面的例子中是否可以除以 0 或无穷大 public double calculation double a double b if a b return 0 else return 2 a b 当然 在正常情况下不会 但如果a and
  • 无法在 Ubuntu 中使用 setup.py 中的 Github Actions 安装 Tensorflow 2.2.0rc0

    当我尝试安装时tensorflow gt 2 2 0rc0 from setup py跑步python setup py install从 Github Actions 工作流程中 输出向我发送以下内容 Searching for tens
  • MongoError:不允许用户执行操作

    我使用 MongoDB Atlas 作为我的数据库 我使用 angular4 和环回作为 api 我的应用程序可以正常连接到我的数据库 但是 当我尝试获取数据时 出现此错误 我已将我的 dbname 替换为 dbname MongoErro
  • R/LaTeX 表创建包的建议

    我一直在使用xtable很长一段时间以来 并期待着用 R 编写我的第一个包 所以我认为 如果我有一些值得实施的 酷 想法 那么很有可能有人在我之前到达那里 我对专门用于 LaTeX 表创建的函数 包感兴趣 当然是通过 R 我撞上了quant
  • 如何复制 Google 工作表并保留其项目触发器和脚本?

    我目前有一个 Google 表格 用作主模板 也就是说 我会为每个请求制作该模板的副本 我想向我的主模板添加一个 Google 应用程序脚本 当工作表完成后 它会在编辑时发布到我的服务器 该脚本将被复制并为此模板的每个副本运行 我已经尝试从
  • 是否应该确保 IDisposable.Dispose() 可以安全地多次调用?

    应实施IDisposable make Dispose 多次拨打安全吗 或者相反 大多数 NET Framework 类采用什么方法 具体来说 打电话安全吗 System Data Linq DataContext Dispose 多次 我
  • 建立 iTunes 商店的联属链接而不进行重定向?

    苹果公司在 从 iPhone 应用程序启动 App Store http developer apple com library ios qa qa1629 index html 如何建立一个到应用商店的联属链接并在后台处理重定向 这样就不
  • LLDB GUI 的文档

    我最近一直在研究 LLDB 的 GUI 功能 有关此功能的 stackoverflow 链接有描述here https stackoverflow com questions 19820247 is there a tui mode for
  • MongoDB 3.2 身份验证失败

    我使用以下命令集创建一个用户 这应该在两者中创建用户admin数据库以及我的目标数据库 c2d mongo 127 0 0 1 27017 MongoDB shell version 3 2 6 29 g5c19788 connecting
  • 使用epplus创建.xlsm文件

    我正在尝试让网站导出 xlsm 文件 但似乎找不到任何有帮助的内容 这是我用来测试构建 xlsx 文件 有效 的一个简单示例 using OfficeOpenXml div Change file extension to xlsm to
  • 如何在 PHP 中解析日期字符串?

    日期字符串为Apr 30 2010 我怎样才能将字符串解析为2010 04 30使用 PHP 使用 DateTime API 需要 PHP 5 3 dateTime DateTime createFromFormat F d Y Apr 3
  • 表达请求 .query.xyz 作为字符串 |细绳[]

    我正在尝试为我的变量分配一个类型 该变量从express 请求查询中获取其值 req query 的类型为 QueryString ParsedQs 例如 req query accountId 的类型为 string QueryStrin
  • 是否有一个玩笑配置会导致 console.warn 测试失败?

    如何配置笑话测试以因警告而失败 console warn stuff fail test 您可以使用这个简单的覆盖 let error console error console error function message error a
  • R 的 xtsum 命令?

    我们正在处理面板数据 Stata中有一个命令 xtsum 这给出了数据集中变量的内部方差和方差之间 R 是否有类似的命令可以产生干净的输出 我用了一个小函数来做到这一点 函数 XTSUM 接受三个输入 数据 数据集varname xtsum
  • C# 嵌套 Try Catch 语句或方法?

    简单的最佳实践问题 应该嵌套 try catch 语句还是只使用方法 例如 如果您有一个打开文件的方法确实有效并关闭该文件 那么您将在 try catch 之外进行打开和关闭 或者更确切地说 在 finally 块中进行关闭 现在 如果您的
  • 如何为 'a:before' 和 'a:after' 编写 ':hover' 条件?

    我怎样才能写 hover and visited的条件a before 我想a before hover 但它不起作用 这取决于您实际想要做什么 如果您只是想将样式应用到 before伪元素 当a元素匹配一个伪类 你需要写a hover b
  • 将结构体转换为数组是否合法?

    考虑以下 Just a sequence of adjacent fields of same the type repr C derive Debug struct S
  • 使用 MongoDB 与 MySQL 与大量 JSON 字段?

    有一种微博类型的应用程序 两个主要的基本数据库存储是 MySQL 或 MongoDB 我计划对大量数据进行非规范化 即对帖子进行的投票存储在投票表中 并且主帖子表中的计数也会增加 该帖子还涉及其他操作 例如点赞 投票否决 如果我使用 MyS