2008-10-24 57 views
1

因此,我们正在构建一个多租户系统作为服务运行。我们从头开始。我们正在关注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可能会有所帮助 - 我想知道我们是否可以应用,为每个租户拉我们的Io​​C适当的?因此,每个租户每个可扩展实体一个IUserType,并将数据本身存储在SQL Server内部的XML列(我们最有可能的RDBMS)中。

最后,我刚读一个建议每个租户周围动态变化的每一个实体DB-表 - 但是这听起来很...局的充满,说实话!我的意思是,它可能工作,但它听起来像是没有这样一个伟大的想法,发出这样对租户的能力(谁可能小于精通技术)。我想它可能只限于管理员 - 员工...

回答

0

有多种方式可以实现它,但多租户的问题不仅仅是数据模型。我讨厌插入产品,但是我的工作公司Apprenda检查了SaaSGrid。我们是一个云操作系统,允许您编写自动注入单租户SOA应用程序(随意使用NHibernate进行数据访问)多租赁到您的应用程序。当你发布你的应用程序时,你可以做一些事情,比如选择一个数据模型(独立数据库或共享),SaaSGrid将相应地部署,你的应用程序将在没有任何代码更改的情况下运行 - 只需编写代码就好像它是单个租户一样!