sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点

我是 NoSQL 世界的新手,正在考虑将我的 MS Sql Server 数据库替换为 MongoDB。我的应用程序(用 .Net C# 编写)与 IP 摄像机交互,并将来自摄像机的每个图像的元数据记录到 MS SQL 数据库中。平均而言,我每天为每个相机插入大约 86400 条记录,并且在当前数据库模式中,我为单独的相机图像创建了单独的表,例如Camera_1_Images、Camera_2_Images ... Camera_N_Images。单个图像记录由简单的元数据信息组成。像 AutoId、FilePath、CreationDate。为了添加更多细节,我的应用程序为每个摄像头启动单独的进程 (.exe),每个进程每秒在数据库的相关表中插入 1 条记录。

我需要 (MongoDB) 专家就以下问题提出建议:

  1. 判断 MongoDB 是否适合保存此类数据,这些数据最终将根据时间范围进行查询(例如,在指定小时内检索特定相机的所有图像)?关于我的案例基于文档的架构设计有什么建议吗?

  2. 服务器的规范应该是什么(CPU、RAM、磁盘)?有什么建议吗?

  3. 我是否应该在这种情况下考虑分片/复制(同时考虑写入同步副本集的性能)?

  4. 在同一台机器上使用多个数据库有什么好处,这样一个数据库将保存所有相机的当天图像,而第二个数据库将用于存档前一天的图像?我正在考虑在单独的数据库上拆分读取和写入。因为所有读取请求都可能由第二个数据库提供服务并写入第一个数据库。它会受益还是没有?如果是,那么任何确保两个数据库始终同步的想法。

欢迎提出其他建议。

最佳答案

我自己是 NoSQL 数据库的初学者。所以我以潜在的反对票为代价来回答这个问题,但这对我来说将是一次很棒的学习经历。

Before trying my best to answer your questions I should say that if MS SQL Server is working well for you then stick with it. You have not mentioned any valid reason WHY you want to use MongoDB except the fact that you learnt about it as a document oriented db. Moreover I see that you have almost the same set of meta-data you are capturing for each camera i.e. your schema is dynamic.

  • 判断 MongoDB 是否适合保存此类数据,这些数据最终将根据时间范围进行查询(例如,检索指定时间之间特定相机的所有图像)?关于我的案例基于文档的架构设计有什么建议吗?

MongoDB 是一个面向文档的数据库,擅长查询 within 聚合(您称其为文档)。由于您已经将每个摄像头的数据存储在其自己的表中,因此在 MongoDB 中,您将为每个摄像头创建一个单独的 collection。 Here is how您执行日期范围查询。

  • 服务器的规范应该是什么(CPU、RAM、磁盘)?有什么建议吗?

所有 NoSQL 数据库都是为在商用硬件上横向扩展而构建的。但按照您提出问题的方式,您可能正在考虑通过扩大规模来提高性能。您可以从一台合理的机器开始,随着负载的增加,您可以继续添加更多服务器(横向扩展)。您无需计划和购买高端服务器。

  • 我是否应该在这种情况下考虑分片/复制(同时考虑写入同步副本集的性能)?

MongoDB locks the entire db用于单次写入(但会产生其他操作),并且适用于读取多于写入的系统。所以这取决于你的系统是怎样的。有多种分片方式,并且应该是特定于域的。一个通用的答案是不可能的。但是可以给出一些示例,例如按地理、按分支等进行分片。

另请阅读 A plain english introduction to CAP Theorem

更新了对分片评论的回答

根据他们的documentation , 你应该考虑部署一个分片集群,如果:

  • your data set approaches or exceeds the storage capacity of a single node in your system.
  • the size of your system’s active working set will soon exceed the capacity of the maximum amount of RAM for your system.
  • your system has a large amount of write activity, a single MongoDB instance cannot write data fast enough to meet demand, and all other approaches have not reduced contention.

所以根据最后一点,是的。自动分片功能旨在扩展写入。在这种情况下,每个 shard 都有一个写锁,而不是每个 database。但我的答案是理论上的。我建议您从 10gen.com 小组咨询。

https://stackoverflow.com/questions/13190468/

相关文章:

mongodb - 如何在mongodb中找到最小值

mongodb - 如果存在如何更新,否则插入新文档?

mongodb - mongodump 忽略一些指定的集合

java - MongoDB 是关系 db + lucene 的有效替代品吗?

mongodb - 如何在不丢失数据的情况下调整 mongodb 上限集合的大小?

javascript - Node.js - 等待多个异步调用

mongodb - 如何在mongodb中将字符串转换为数值

c# - MongoDB C# 驱动程序 : Ignore Property on Insert

mongodb - 来自远程服务器的 Mongodump

php - 安装 PHP 7 MongoDB 客户端/驱动程序?