架构:多个 Mongo 数据库+连接 vs 使用 Express 的多个集合

Posted

技术标签:

【中文标题】架构:多个 Mongo 数据库+连接 vs 使用 Express 的多个集合【英文标题】:Architecture: Multiple Mongo databases+connections vs multiple collections with Express 【发布时间】:2015-08-23 07:32:51 【问题描述】:

我正在构建一个应用程序,用于在 Mongo DB 中存储多个不同客户的敏感数据。每个客户(电子邮件、联系人、会议)的数据模型都是相同的。所有客户端使用相同的 API 和相同的 Express 服务器访问数据。我已经阅读了很多关于使用一个大型集合、多个集合和多个数据库的信息:

Mongoose and multiple database in single node.js project

MongoDB performance - having multiple databases

我喜欢每个客户端使用一个数据库的想法,因为它的安全性和简单的数据隔离。我这样想对吗?

同样在这种情况下,我有点担心在 Express 中管理数据库连接。

我了解连接只应建立一次(例如在启动服务器时),然后保持活动状态。因此,使用多个数据库意味着 Express 会打开多个连接并让它们保持活动状态,未来可能会有数十个或数百个。此外,每次调用 api 时,控制器都应该能够选择从哪个数据库连接进行查询。

值得麻烦吗?

【问题讨论】:

当你说单独的数据库时,你是指单独的mongo实例,还是mongo中的单独数据库。如果您想将每个客户端的数据分开,后者对我来说似乎比前者更合适。 【参考方案1】:

对于像这样的多租户应用程序,我建议将类似的数据存储在所有租户的单个集合中,其中包含某种类型的tenant_id 字段,然后确保所有查询都有正确的选择器。

如果您使用多个集合,或者更糟糕的是,多个数据库,它的可扩展性不会太大。如果您只有少数客户并且不打算拥有数百个或更多客户,那么多收集或多数据库方法可能是可行的。不过估计会很痛Mongo 将为每个集合分配大量磁盘空间,额外的连接将占用更多内存等,对性能的影响不容忽视。

【讨论】:

以上是关于架构:多个 Mongo 数据库+连接 vs 使用 Express 的多个集合的主要内容,如果未能解决你的问题,请参考以下文章

设计/架构:web-socket 单连接 vs 多连接

Mongo change-Stream with Spring resumeAt vs startAfter 以及连接丢失时的容错

使用Mongoose(ORM)将多个应用程序与一个mongo数据库连接

spring-data-mongodb 在一个 Mongo 实例中连接多个数据库

mongo体系架构学习

MongoTypeConversionException:即使显式架构不包含 NullTypes,也无法使用 Mongo Spark 连接器将 STRING 转换为 NullType