多租户-单数据库与多数据库


20

我们有许多客户,他们的系统共享一些功能,但也有一定程度的多样性。客户数量在增长-永远是健康的事情!-他们的业务之间的差异也在增加。

当前,只有一个ASP.Net(Web窗体)网站(与Web项目相对),其中每个租户都有子文件夹,并带有该租户的非标准页面。有一个单独的模型项目,处理数据库访问和业务逻辑。

在(a)每个客户端拥有1个数据库且仅具有与该客户端相关联的功能之间,这是更好的选择,也是最重要的原因。(b)由所有客户端共享的单个数据库,其中任何一个客户端仅使用表的子集。

企业内部的主要担忧已经结束:

  • 维护多个资产-备份,版本控制等
  • 尽可能促进重复使用

您将如何确保解决这些问题,哪种解决方案更可取,为什么?(我也一直在整理类似问题的答案)


是否有可能将其迁移到像Azure这样的PaaS云环境?如果是这样,您还需要考虑环境的最佳实践。上次查看时,MS建议在Azure上的多租户软件中使用多个数据库。
哈珀·谢尔比

感谢您的询问。我一直在想类似的事情,但是还没有像您一样雄辩地提出疑问。
MathAttack 2012年

您应该阅读Ayende的多租户博客系列。他对多数据库与单数据库提出了一些非常好的观点。
Sebazzz 2015年

Answers:


12

10

如果使用的是SQL Server,请使用一个数据库,但要使用架构。将dbo用于所有客户端通用的内容,并为每个客户端创建一个架构,并将该架构设为该客户端用户的默认架构。现在,您可以在dbo模式中拥有一个通用对象(例如getBudget proc),并在其模式中为客户端使用相同的名称定制一个对象。


+1这还将使您避免配置MSDTC并承担相关的开销(两阶段提交)
brian

希望你避免通过CustomField30具有类似于自定义字段列和/或具有类似预算,BudgetEx,BudgetCustom,BudgetCustomerName,BudgetAnotherCustomerName等表的陷阱
jfrankcarr

现有的数据访问层使用大量存储过程-190个表,每个表5个代码生成的过程,以及一些自定义过程-中期目标是引入Entity Framework,是否需要复制存储的过程每个模式的程序?
RichardW1001 2012年

@ RichardW1001:取决于。您可以在sp中执行动态SQL,以使其具有通用性,但是当然这取决于它们至少在某种程度上具有相似的结构。动态sql的一种可能替代方法是同义词,据我所知,它们是系统范围的,不包含在事务中,因此不适合并发使用不同的值。
jmoreno,2012年

如果我们使用多个模式,那么使用EF Code First可以在系统上线后将所有模式迁移到最新版本吗?
Yashvit

4

由于客户端数据库和功能各不相同,因此这意味着它们最终将成为不同的系统,因此在这种情况下,我建议使用单独的系统,因为为每个客户端维护自定义项的成本将超过单个客户端的收益。数据库系统。

当不同客户之间的更改仅仅是配置而不是每个客户端的附加功能时,单个数据库系统最适合。


您对如何以最小的痛苦来管理通用功能有何建议?
RichardW1001 2012年

1
在您的版本控制系统中,维护核心应用程序的负责人,并为每个客户创建一个主分支,并为他们需要维护的新功能提供子分支。在分支机构中开发客户特定的功能,并选择更新主干等的选项。然后,您可以在需要时轻松地调整客户特定的环境
Stephen Senkomago Musoke

3

您缺少一些担忧。问题将伴随增长。如果您可以假设有一天您将成长为超过一台数据库服务器,那么一个复杂的数据库肯定会让您头疼。除非您事先投资建筑。但这也是昂贵的步骤)

因此,别忘了,与大型数据库相比,横向扩展几个不同的数据库便宜很多倍,也容易得多。


您是否有任何数据可以确认扩展的简便性?如果是这样,那将是一个非常有说服力的案例。您能详细说明其他遗漏的问题吗?我正在尝试在两边尽可能完整地论证。
RichardW1001 2012年

1

我没有在答案中解决的一个方面是正确保护多租户数据库应用程序的问题。多租户应用程序必须经过精心设计才能避免安全问题。大多数数据库和应用程序提供了一些但不是完全的隔离-通常有直接或间接地推断数据库模式中的数据的方法。相当多的共享资源(日志和其他文件,DBA表,游标...)至少可以导致对其他租户的轻松的“拒绝服务”攻击,而且通常还会更多。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.