有一种微博类型的应用程序。两个主要的基本数据库存储是:
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 字段,顺序是:
在 python 脚本中读取 JSON。
更新 JSON
将 JSON 存储回 MySQL。
这将是 MongoDB 中的单个操作,具有原子操作,例如$push
,$inc
,$pull
等等还有
MongoDB 的文档结构非常适合我的数据。
我选择数据存储时的考虑因素。
关于MySQL:
- 稳定且熟悉。
- 备份和恢复很容易。
- 使用某些字段作为无模式 JSON 可以避免未来的一些模式更改。
- 可能必须尽早使用 memcached 层。
- JSON blob 在某些表(如主帖子)中是静态的,但在其他一些表(如帖子投票和点赞)中会大量更新。
关于 MongoDB:
- 更适合将无模式数据存储为文档。
- 可以在稍后阶段避免缓存。
- 有时应用程序可能会变得写入密集型,在不安全写入不存在问题的情况下,MongoDB 可以表现得更好。
- 不确定稳定性和可靠性。
- 不确定备份和恢复有多容易。
问题:
- 如果一半数据是无模式的,如果使用 MySQL 则存储为 JSON,我们是否应该选择 MongoDB?
一些数据(例如主要帖子)至关重要,因此将使用安全写入、计数器等来保存
将使用不安全写入来保存。该策略基于数据的重要性和写入强度是否正确?
与 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