mongodb - MongoDB 中 Multi-Tenancy 数据库的推荐方法是什么?

我正在考虑使用 MongoDB 创建一个 Multi-Tenancy 应用程序。我还没有任何关于我会拥有多少租户的猜测,但我希望能够扩展到数千个。

我能想到三个策略:

  1. 同一集合中的所有租户,使用特定于租户的字段来保证安全
  2. 单个共享数据库中每个租户 1 个集合
  3. 每个租户 1 个数据库

我脑海中的声音暗示我选择选项 2。

想法和启示,有人吗?

最佳答案

我有同样的问题要解决,并且也在考虑变体。 由于我拥有多年创建 SaaS Multi-Tenancy 应用程序的经验,因此我也将根据我之前在关系数据库方面的经验选择第二个选项。

在进行研究时,我在 mongodb 支持网站上找到了这篇文章(因为它已经消失了,所以又添加了): https://web.archive.org/web/20140812091703/http://support.mongohq.com/use-cases/multi-tenant.html

这些家伙表示要不惜一切代价避免使用第二个选项,据我所知,这并不是 mongodb 所特有的。我的印象是,由于数据库设计的特殊性,这适用于我研究的大多数 NoSQL 数据库(CoachDB、Cassandra、CouchBase Server 等)。

集合(或存储桶,或者它们在不同的数据库中调用它)与 RDBMS 中的安全模式不同,尽管它们充当文档的容器,但对于应用良好的租户分离毫无用处。我找不到可以基于集合应用安全限制的 NoSQL 数据库。

当然,您可以使用 mongodb 基于角色的安全性来限制数据库/服务器级别的访问。 (http://docs.mongodb.org/manual/core/authorization/)

我会推荐第一种选择:

  • 您有足够的时间和资源来处理 此场景的设计、实现和测试。
  • 如果您不打算在结构和 数据库中针对不同租户的功能。
  • 您的应用程序设计将允许租户只做最少的 在运行时进行自定义。
  • 如果您想优化空间并尽量减少硬件使用 资源。
  • 如果您要拥有数千名租户。
  • 如果您想以合理的成本快速扩展。
  • 如果您不打算根据租户备份数据(保持分开 每个租户的备份)。即使在这种情况下也可以这样做 但需要付出巨大的努力。

如果满足以下条件,我会选择变体 3:

  • 您将拥有少量租户(数百名)。
  • 业务的具体情况要求您能够支持不同租户的数据库结构的巨大差异(例如,与第三方系统的集成、数据的导入导出)。
  • 您的应用程序设计将允许客户(租户)对应用程序运行时进行重大更改(添加模块、自定义字段等)。
  • 如果您有足够的资源来快速扩展新硬件节点。
  • 如果您需要为每个租户保留数据的版本/备份。恢复也很容易。
  • 法律/监管限制迫使您将不同的租户保留在不同的数据库(甚至是数据中心)中。
  • 如果您想充分利用角色等 mongodb 开箱即用的安全功能。
  • 租户之间的规模存在很大差异(您有很多小租户,而很少有非常大的租户)。

如果您发布有关您的申请的更多详细信息,也许我可以给您更详细的建议。

https://stackoverflow.com/questions/2748825/

相关文章:

node.js - 如何在 mongodb-native findOne() 中使用变量作为字段名?

mongodb - Meteor 应用程序 — 重置已部署应用程序的数据库

MongoDB select count(distinct x) on an indexed col

javascript - node.js mongodb 通过_id node-mongodb-na

node.js - Mongoose findByIdAndUpdate 没有返回正确的模型

mongodb - 在 Mongoose/MongoDB 中创建多字段索引

mongodb - 无法验证到 mongo, "auth fails"

mongodb - 无法启动/启动本地 mongo db

mongodb - $lookup 查找数组中的 ObjectId

node.js - 保存后 Mongoose 填充