在一个以数据库为中心的应用程序,是旨在为多个客户,我一直以为是"更好的"使用一个单一的数据库对所有的客户关联的记录适当的索引和钥匙。在听这堆溢出的播客,我听到乔伊说FogBugz使用一个数据库每个客户(如果有1000客户,将有1000数据库)。有什么优点使用这一架构?

我的理解是,对于某些项目,客户需要的直接访问他们所有的数据,在这种应用,这是显而易见的,每个客户的需求他们自己的数据库。然而,对于项目的客户不需要访问的数据库直接,是否有任何优势,使用一个数据库每客户?看来,在条款的灵活性,这是简单得多的使用单一数据库的一个副本表。这是更容易添加新功能,它更容易创建报告,它是就更容易管理。

我很有信心在"一个数据库,为所有客户"的方法,直到我听到了乔尔(一位经验丰富的开发人员)说,他的软件使用不同的方法--并且我有点困惑与自己的决定...

我听到人们援引的数据库慢下来,有大量的记录,但任何关系数据库有一些优点是不会有这问题-特别是如果适当的索引和密钥的使用。

任何输入是非常感谢!

有帮助吗?

解决方案

假定没有缩刑,用于储存的所有客户在一个数据库;对于大多数人,以及配置了数据库/查询,这将是相当真实的这些日子。如果你不是这些人中的一个,好,然后将受益的一个单一的数据库是显而易见的。

在这种情况下,利益来自封的每一个客户。从码的角度看,每个客户的存在隔离,没有可能的情况下在其中一个数据库更新可能会复盖,损坏,获取或更改数据的属于另一个客户。这还将简化的模式,因为你不需要考虑的事实记录可能属于另一个客户。

你也可以得到的好处的可分离性-这是微不足道中拉出来的数据与给定客户,并将它们移到一个不同的服务器。或恢复备份的客户时打电话来说"我们已经删除了一些关键的数据!", 使用的系统数据库的机制。

你容易获得及免费的服务器流动-如果你outscale一个数据库服务器,可以就主办新的客户上的另一个服务器。如果他们都是在一个数据库,你会需要获得强硬件、或运行数据库通过多个机器。

你能很容易找到版本控制,如果一客户想留在软件1.0版本,和另一个想2.0,其中1.0和2.0使用不同的数据库架构、有没有问题-你可以迁移到一个没有拉出来的一个数据库。

我可以想到的几十个多,我猜。但是,所有在所有的关键概念是"简单".的产品的管理一个客户,并且这样一个数据库。有没有任何复杂",但是该数据库还包含其他客户"的问题。它符合的心理模型的用户,他们在那里单独存在。等优点是能够做便于报告在所有客户在一次,是最小的-你经常要报告,整个世界,而不仅仅是一个客户?

其他提示

这里有一个办法,我已经见过的:

  • 每个客户都有一个独特的连接串储存在一个主的客户数据库。
  • 该数据库的设计,使这一切都是分段通过的层,即使只有一个客户在一个数据库。
  • 脚本是为了迁移的所有客户数据,以一个新的数据库,如果需要,那么只有客户的连接串需要更新点到新的位置。

这允许使用一个单一的数据库,然后再很容易分段以后一旦你得到了大量的客户,或更通常,当你有几个客户过度使用该系统。

我发现恢复客户的特殊数据是非常艰难的时候所有的数据是在同一个数据库,但管理的升级是简单得多。

当使用一个单一的数据库每个顾客,你遇到了一个巨大的问题保持所有客户运行在相同模式版本,甚至不考虑的备份工作在一大堆的特定客户的数据库。自然恢复的数据更加容易,但是如果你确定不要永久删除记录(只是标记与一个被删除的标志或转移到档案表),然后你有需要的数据库恢复在第一位。

以保持它的简单。你可以确信,你的客户是只看到他们的数据。客户记录较少没有支付罚款的具有竞争与成千上万的记录,可能会在数据库,但不是他们的。我不在乎如何以及一切都是编制索引,并优化会有查询,以确定,他们必须扫描每一个记录。

那么,如果你的客户之一,告诉你恢复的早期版本的数据,由于一些拙劣的进口工作或类似的?想象一下你的客户会觉得如果你告诉他们,"你不能这样做,因为你的数据之间共享所有我们的客户"或"很抱歉,但你改变都是因为失去客户X要求恢复的数据库"。

如对疼痛的升级1000数据库服务,一些相当简单的自动化应该采取的照顾。只要每一数据库保持一个相同的架构,那么它就不会真的是一个问题。我们还使用该数据库每个客户的做法,和它的工作原理以及对于我们。

这是一篇关于这个确切的主题(是的,这是MSDN,但它是一个独立的技术条): http://msdn.microsoft.com/en-us/library/aa479086.aspx.

另一个讨论多租户,因为它涉及到数据模型: http://www.ayende.com/Blog/archive/2008/08/07/Multi-Tenancy--The-Physical-Data-Model.aspx

可伸缩性。安全。我们的公司采用1DB/客户的方法。这也使得码有点容易维持。

我只是添加这个答案,包括一词多租户在这里。我在寻找此,使用"多客户"作为查询,以及这一没有出现。

谢谢你的输入-所有优秀和非常有效的要点。我想我找更多的在升级的灵活性。如果你需要修改的架构添加的新功能(可以说,对于网络的应用程序)或者加强现有的特点,它简单做在一个单一的数据库。如果你要重复这种变化跨1000单独的数据库,错误的机会的增加而增加。如果一个动作失败?多长时间才能升级的每一个客户?

如果适当的备份被保留(或如果数据库是结构性数据实际上从未被复盖),恢复的数据对特定客户是微不足道的。

简单的代码,同时重要的是,并没有真正得到非常复杂。取决于所使用的语言和方法,它是简单的创建目的,仅表示,特定的客户(其中储存的特定客户身份证)和其他项目只有可的编码于一个单一的对象(就像一个单一的客户)。

可扩展性是需要考虑的东西-你是对的,它很容易采取的一个单一的孤立的数据库,并将其移到一个不同的物理服务器;但是,它是越来越容易集群服务器一起,即使没有集群,现在看来似乎会是一个小的更改要点的每一个客户在一个数据库服务器主机的通用数据库(所以你可以有两个或三个数据库服务器托管只有一个数据库中的每一个,例如)。这种方法不断升级过程仅限于三个数据库。

在受监管的行业,如医疗保健可以要求一个数据库每个客户,可能的话甚至是一个单独的数据库服务器。

简单的答案更新多个数据库的升级时做的升级作为一个交易,并采取一个快照升级之前,如果有必要的。如果你行你的作业那么,你应该能够应用的升级到任何数量的数据库。

集群是不是真的一个问题的解决方案指数和完整的表格的扫描。如果你移动到一个集群,非常小的变化。如果你已经有许多较小的数据库分发了多个机器可以做这个更便宜没有一个群集。可靠性和可用性的考虑,但可以加以处理的其他方式(有些人仍然将需要一个集群,但大多数可能不)。

我有兴趣听到更多一点的背景下从你在这是因为聚类不是一个简单的主题和是昂贵的实施在数据库的世界。有很多对话/虚张声势有关聚类中非关系的世界的谷歌大表等。但他们正在解决一个不同的问题,并失去了一些有用的特征,从RDBMS。

有几种含义的"数据库"

  • 硬件箱
  • 正在运行的软件(例如"oracle")
  • 特定的数据文件
  • 特定的登录或架构

这可能是乔意味着一个低层。在这种情况下,它只是问题的软件配置的管理...你不需要贴1000软件服务器解决安全问题,例如。

我认为这是一个很好的想法,以使一个软件错误不会泄露信息的客户。想象一下这种情况与一个错误那里的条款,显示我你的客户数据,以及我自己的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top