我有同样的问题要解决,也考虑变种。由于我有多年创建SaaS多租户应用程序的经验,我还将根据我以前使用关系数据库的经验选择第二个选项。
在进行研究时,我在mongodb支持网站上发现了这篇文章:[http://support.mongohq.com/use-cases/multi-tenant.html]
这些家伙表示不惜任何代价避免第二种选择,据我所知,这并不是特别针对mongodb。 我的印象是,由于数据库设计的具体细节,这适用于我研究的大多数NoSQL dbs(CoachDB,Cassandra,CouchBase Server等)。
集合(或桶或者它们在不同的DB中调用它们)与RDBMS中的安全模式不同,尽管它们表现为文档的容器,它们对于应用良好的租户分离是无用的。 我找不到可以根据集合应用安全限制的NoSQL数据库。
当然,您可以使用基于mongodb角色的安全性来限制对数据库/服务器级别的访问。([http://docs.mongodb.org/manual/core/authorization/)]
我会建议第一个选项:
你有足够的时间和资源来处理复杂性设计,实施和测试这种情况。
如果你不会在结构上有太大差异数据库中针对不同租户的功能。
您的应用程序设计将允许租户只做最小的运行时自定义。
如果您想优化空间并最大限度地减少硬件使用资源。
如果你有数以千计的租户。
如果您想快速扩展并且成本很高。
如果您不打算根据租户备份数据(保持单独每个租户的备份)。 即使在这方面也可以做到这一点情景,但努力将是巨大的。
如果符合以下情况我会选择变体3:
你将有一小部分租户(几百个)。
业务的细节要求您能够支持不同租户的数据库结构的巨大差异(例如,与第三方系统的集成,数据的导入 - 导出)。
您的应用程序设计将允许客户(租户)在应用程序运行时(添加模块,自定义字段等)中进行重大更改。
如果您有足够的资源可以快速扩展新的硬件节点。
如果您需要为每个租户保留数据的版本/备份。 恢复也很容易。
有法律/监管限制迫使您将不同的租户保留在不同的数据库(甚至是数据中心)。
如果您想充分利用mongodb的开箱即用安全功能,如角色。
租户之间的规模差异很大(你有很多小租户,很少有很大的租户)。
如果您发布有关您的应用程序的其他详细信息,也许我可以给您更详细的建议。