因此,我们正在构建一个多租户系统作为服务运行。我们从头开始。我们正在关注DDD;该域名(目前)有20个实体,后面会有更多实体。它由我们主持,在地理上是冗余的(n + 1除SQL查询之外的所有东西;-))和灵活设计(好,最后是我们自己的要求,而不是业务),尽管他们希望我们能够当然要求改变它)。我们基于.NET,并将使用关系数据库作为我们的支持存储。我们并不反对使用开源工具和库(根本)。在.NET中,您将如何处理多租户SaaS应用程序的租户,以便为模型的实体任意添加属性?
一个从企业必须具备的特点是,某些实体是由系统的租户可扩展性。例如,客户A可能希望实体Foo具有标题和抽象属性,而客户B可能希望实体Foo具有发布日期和定向属性 - 而不是标题摘要。
这也可能是它应该支持多种语言的数据为希望该住户的情况 - 例如,一个租户可能有兴趣在翻译他们的整个帐户划分为两个(或更多)的语言; “静态”字符串和作为数据附加到实体的字符串。
所以。任意数量的字段(在某些通用基线之上;所有租户都会获得有关这些实体的某些事情),可由客户端定义(他们也可以在其中定义数据类型)。数据翻译的可能性(不需要复制实体 - 如在没有用英语设置一套,然后用法语设置同一套)。强类型的,可搜索的,可查询的后备存储(也就是说,除非有强大的类型和可搜索的方式,否则没有额外的东西进入XML领域)。性能(但是作为次要要求;如果需要,该功能足够重要以购买硬件)。
数据量?在我们目前的系统中,一个“平均”客户端拥有数百个实体,一个“大”客户端拥有数千个实体。请求通常会过滤这些列表以显示在10-200ish之间,最常见的事情要包括半打实体(在新系统中应该是可扩展的)。
其他要点?每个实体与拥有它的租户有直接的联系。
如何去这一点,在.NET的土地?有人建议我们将实体放入IoC容器中,并在运行时将它们一起运行 - 但如何将它们映射到关系数据库?
我还记得在一段时间以前用Lucene.NET阅读Ayende's post这听起来不错,但我们目前还没有任何关于Lucene.NET或nHibernate的经验。 (我们现在将为我们的ORM使用Linq2Sql,但如果我们需要改变它来支持这一点,坦率地说,我个人很高兴)。
我读了this Castle dev list thread这是从Ayende链接,它似乎像nHibernate有一种叫做IUserType可能会有所帮助 - 我想知道我们是否可以应用,为每个租户拉我们的IoC适当的?因此,每个租户每个可扩展实体一个IUserType,并将数据本身存储在SQL Server内部的XML列(我们最有可能的RDBMS)中。
最后,我刚读一个建议每个租户周围动态变化的每一个实体DB-表 - 但是这听起来很...局的充满,说实话!我的意思是,它可能工作,但它听起来像是没有这样一个伟大的想法,发出这样对租户的能力(谁可能小于精通技术)。我想它可能只限于管理员 - 员工...