【问题标题】:One database for one customer or one for all [closed]一个数据库为一个客户或一个为所有人[关闭]
【发布时间】:2015-10-07 02:54:39
【问题描述】:

在我们的项目中,我们有大约 100 个客户,到目前为止,我们每个客户都有一个数据库。 我们在软件更新和调试方面遇到了一些问题,而且更新真的很耗时。

我的一位同事告诉我,为一组客户只使用一个集群数据库会更容易。

你们怎么看?

我们如何使用该架构让一位客户通过一些架构修改进行 beta 测试?

我们认为我们可以进行某种数据库复制,但我们如何才能在不丢失数据的情况下与不同的模式进行合并?

编辑:

假设我有一个数据库服务器 ( SQL-01 ),我在该数据库上有 100 个客户。 在一些架构更改后,我该如何将一位客户带到 SQL-02,并且经过一段时间的 beta 测试后,我希望每个人都使用新架构在 SQL-01 上进行更新,并且我的 beta 测试客户进入SQL-01 直到下一次 beta 测试。

【问题讨论】:

标签: sql .net sql-server database architecture


【解决方案1】:

您几乎总是为所有客户提供一个数据库。 SQL 数据库是为大量数据而设计的。事实上,它们在处理大量数据时甚至比处理少量数据更有效(因为处理少量数据时,页面往往会被部分填充)。

区分不同客户的唯一原因是项目需要时:

  • 出于某种深不可测的原因,要求可能是明确的
  • 该要求可能规定来自两个客户的数据不能在同一个数据库中。
  • 可能需要为特定客户定制应用程序。

不过,一般来说,为了性能、可维护性、支持和安全性,您只需要一个数据库。每个表都应该有一个适当的客户 ID。

【讨论】:

  • 虽然我不同意 SQL Server 可以处理卷,但我不同意安全性在这里是一个优点,因为它是一个缺点 - 它是一个缺点。 DR 和升级/降级时机还有其他运营原因,这让我不同意您“几乎总是”的观点
【解决方案2】:

从我的角度来看,最好的方法是为所有客户使用一个模式和一个数据库 => 如果您有大量数据,请创建一个 DatawareHouse,尤其是星型模式...

例如:您可以先创建一个 id 为 customer,name,region,city.. 的表。像这样:

如果你想拥有 100 个数据库,你可以使用“ALTER SCHEMA”(带循环):

ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName;

【讨论】:

    【解决方案3】:

    虽然升级可能更痛苦,但在将所有客户放入一个更大的数据库之前,需要考虑一些要求:

    安全性:虽然您将数据保存在单个数据库中,但您对数据没有隔离保护,例如它位于同一地点。您冒着将一个客户的数据暴露给另一个客户的风险,因为代码中的任何一个错误都是微不足道的。使用多个数据库,您可以获得更多的隔离保护。

    升级:如果所有客户端都访问同一个数据库,那么升级将是全有或全无的方法 - 您将无法轻松地将一些用户迁移到新版本,同时让其他用户保持原样。这意味着您不能根据单个客户的时区安排停机时间,它们都会同时停机。

    备份:您可以将当前每个数据库单独备份,如果它在一个更大的数据库中,则每个客户端的备份都混合在一起。如果单个客户要求回滚到给定日期,您必须提前仔细计划如何在不影响系统其他用户的情况下执行。

    Beta 测试:正如您已经指出的,如果您希望升级单个客户端以测试新版本,则必须使用不同的数据库,或确保所做的每项更改都是向后兼容的,这样其他人就不会注意。在某些时候会有一个重大的变化,然后你就会遇到问题。

    扩展:最终,有了足够多的客户端和足够的数据,你就会用尽扩展空间,如果你有多个数据库而不是一个数据库,那么扩展会更便宜,也更容易。

    根据 Alex K 的 cmets 中的链接。我希望使用自动化来管理开销并最大限度地减少拥有大量 DB 的问题。

    【讨论】:

    • 感谢您的回答,您指出了我在使用这种模型时看到的所有缺点。我也会等待其他人的回答!谢谢。
    猜你喜欢
    • 2017-05-03
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 2012-02-01
    • 1970-01-01
    • 2019-04-14
    相关资源
    最近更新 更多