MongoDB数据建模:使用大量数据库有什么缺点吗?

3

我最近将Web应用程序的后台部分迁移到了MongoDB,该Web应用程序本身是一个验证工具,工作流程如下:

  • 用户上传文件(通常包含数十万行)
  • 检查器检查并输出大量消息(可能每行输出一个以上)
  • ...最后提供一些统计信息

我对我的应用程序进行了建模,使每个用户都有自己的数据库,其中包含:

  • 文件(通过GridFS保存)
  • 包含消息的集合(在某些情况下可能超过一百万行)
  • 包含统计信息的集合

我们有几百个用户,因此MongoDB最终将拥有数百个数据库

当然,我可以将所有数据存储在同一个数据库中,使用命名空间来区分不同用户的数据。但是,我觉得将数据库发送到连接URI中很方便,并且发出“删除数据库”语句以清除用户数据比在大数据库中搜索和删除用户数据更直观。

我对MongoDB还不太熟悉,所以我的问题是:在同一个MongoDB实例中拥有多个数据库是否有任何缺点?或者我应该考虑什么特殊问题?


据我的了解,最大数据库数量可以设置为24000个,但是这个数字可以增加。根据这个数字,几百个数据库应该不会有问题。 - ppeterka
@ppeterka - 我可能错了,但我认为这个数字是每个对象的最大命名空间数,因此拥有单独的数据库实际上使我能够存储比如果我有一个每个用户3个命名空间(userA.messagesuserA.statistics等)的单个数据库更多的数据...但也许我误解了文档? - mac
@ppeterka,每个数据库命名空间文件都有限制,MongoDB在其数据库数量上没有明确的限制。 - Sammaye
我能想到一个问题:文件计数和打开文件数量,所有操作系统通常都有某种限制来限制您可以拥有多少个打开文件,如果一个服务器上有许多数据库,则可能会达到该限制,然后你将会看到问题。我能想到的其他问题都可以通过将数据库作为完全独立的实体来解决。 - Sammaye
在Ubuntu/Debian上将ulimit设置为高数字,如64000,可能会防止您达到打开文件限制。 - Hans N. Hjort
2
这种方法的一个缺点,可能不会影响你,就是要对多个用户运行统计分析会更加困难,你需要从每个用户那里提取数据,然后以某种方式将它们结合起来。 - Hans N. Hjort
1个回答

0

我对MongoDB并不熟悉。一般来说,打开数据库连接是一个相对较慢的操作,并且会占用系统资源。无法确定这在你的情况下是否足够重要。

为每个用户拥有不同的数据库将使得难以执行访问多个用户数据的查询。也许你没有这个需求。

尽管如此,我认为通常情况下只需在每个记录中放置一个用户ID比创建单独的数据库要简单得多。分离数据库的好处是什么?好吧,删除一个用户意味着说“删除数据库”。但是从单个数据库中删除用户应该意味着对于每个相关表格,都需要说“delete from tableX where user=?; delete from tableY where user=?”等等。我想象不出这可能是数百行代码,对吧?也许只有半打左右的代码?


嗨Jay。我会期望像Mongo这样没有模式的数据存储比关系型数据库在打开数据库方面更高效...但也许我对这个问题完全错了?关于你的第二段:在我的场景中,不允许混合来自不同用户的数据是一个优点。此外,由于MongoDB URI的工作方式[主机:端口/数据库名],每个用户拥有一个数据库的好处之一是我可以通过URI传递信息(特别适用于进程间通信)。但是是的:如果优势是压倒性的,我就不会在一开始就麻烦询问了! :) - mac
关于多个用户的数据:我在想,你可能会想要运行查询来回答一些问题,比如,“我们从所有用户那里上传了多少文件?”“最常见的验证消息是什么?我们有没有使用过的验证消息?”“哪些用户在过去的一周内上传了文件?”等等。也许你并不关心这些事情,永远也不会关心,但如果可能的话,使用单个数据库会更容易实现。 - Jay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接