我需要设计一个在 SQL Server 中代表多个“客户”的 Windows 应用程序。每个客户都有相同的数据模型,但它是独立的。
使用多个数据库与使用单个数据库的优点/缺点是什么。
哪一种是完成这项工作的最佳方式。如果要使用单个数据库,要采取哪些步骤。
编辑:
一件事是数据库将托管在云(机架空间)帐户中。
我需要设计一个在 SQL Server 中代表多个“客户”的 Windows 应用程序。每个客户都有相同的数据模型,但它是独立的。
使用多个数据库与使用单个数据库的优点/缺点是什么。
哪一种是完成这项工作的最佳方式。如果要使用单个数据库,要采取哪些步骤。
编辑:
一件事是数据库将托管在云(机架空间)帐户中。
不要将来自多个客户的数据存储在同一个数据库中——我知道一些公司不得不花费大量时间/精力/金钱来修复这个错误。我什至知道客户不愿意共享数据库计算机,即使数据库是分开的——从好的方面来说,这些客户通常愿意为额外的硬件付费。
仅安全问题就应该阻止您这样做。因此,您将失去大客户。
如果您有一些客户不愿意升级他们的软件,那么共享一个数据库可能会非常困难。单独的数据库允许客户继续使用旧的数据库结构,直到他们准备好升级。
您人为地限制了可以为您的解决方案提供显着可扩展性的自然数据分区。多个小客户仍然可以共享一个数据库服务器,他们只看到自己的数据库/目录,或者他们可以在单独的数据库服务器/实例上运行。
您正在使您的数据库设计复杂化,因为您必须区分否则会自然分离的客户数据,即必须在每个 where 子句中提供 CustomerID。
通过在所有表中拥有更多行,您正在使数据库变慢。您将更快地用完数据库内存,因为 CustomerID 现在是每个索引的一部分,并且每个索引节点中可以存储的记录更少。由于失去了参考位置的固有优势,您的数据库也会变慢。
1 个客户的数据回滚可能非常困难,随着数据库的增长,甚至可能基本上不可能 - 您需要自定义过程来执行此操作,这比简单和标准的备份还原要慢得多且资源密集型。
大型数据库可能很难及时备份/恢复,可能需要额外的硬件支出才能使其足够快。
使用数据库的应用程序将更难维护和测试。
任何错误都可能更具破坏性,因为您可能会因一个错误而搞砸所有客户。
您可以通过将数据库强制到单个位置来防止可能的低延迟性能增强。例如,海外客户将一直使用缓慢、高延迟的网络。
您将被称为愚蠢的 DBA,或失业的 DBA,或者两者兼而有之。
不过,共享数据库设计有一些优点。
公共表模式、代码表、存储过程等只需要维护和存储在 1 个位置。
在某些情况下,许可成本可能会降低。
一些维护更容易,尽管使用组合方法总体上几乎可以肯定更糟。
如果您的所有/大多数客户端都非常小,您可以通过不合并服务器来降低资源利用率(即成本相对较高)。您可以通过将客户与他们的许可和明确理解相结合来降低高成本,但仍然为较大的客户使用单独的数据库。在这种情况下,您绝对需要明确和预先与您的客户沟通。
除了服务器成本分摊之外,这仍然是一个非常糟糕的主意 - 但成本也可能是一个非常重要的方面。这确实是这种方法的唯一理由 - 如果完全合理,请避免这种情况。也许你最好为你的产品多做一点改变,或者只是不能以便宜的价格支持小客户。
我假设多个客户不仅在存储客户信息,还在为客户的应用程序托管数据库,例如 CRM 系统。
如果是这样,那么我绝对不会将所有内容都存储在同一个数据库中。
原因:
所以底线:单独的数据库。
要考虑的每种方法的一些优点是:
单一数据库
多个数据库
有一天,您的开发人员会搞砸一些事情,一位客户将访问另一位客户的信息。结果你会失去你的客户。仅此一项就应该告诉您,多个客户不能在一个数据库中。如果他们知道这一点,没有人会愿意成为您的客户。
如果是这种情况,我是否真的必须仔细考虑最终会发生的所有问题?答案很简单——不。您不想在同一个数据库中拥有多个客户的信息。
只有当您有多路复用器数据库来跟踪客户登录、会话等时才会发生这种情况。但是客户使用和存储的数据应该在专用数据库中。