一个数据库与多个数据库

我需要devise一个代表多个“项目”的系统,在SQL Server中每个客户端一个,类似于StackExchange …相同的数据模型,不同的站点(每个客户一个)。 每个项目都有相同的数据模型,但独立于所有其他项目。 我的倾向是使用一个数据库来存储所有的项目。 你的build议是什么?

我会做单独的数据库,因为否则,如果每个客户端使用相似的模式,你将不得不组合表或使用大量的前缀,或有链接表包含客户端识别信息。 另外,如果pipe理员拥有自己的数据库,则pipe理客户端数据的备份/恢复会容易得多。

没有好的理由不使用单独的数据库,国际海事组织。

单独数据库的一个缺点是推出模式更改; 如果你有几百个数据库,准备找一个聪明的方法来推送新的表,存储过程,升级索引。 另一个缺点是随着数据库数量的增长,镜像对DR解决scheme的吸引力下降。

除非迫切需要将数据保存在一个地方,否则我build议将它们分开。 它将使服务器之间的数据移动变得更容易(例如,一旦负载增长到问题点,或者如果客户想要支付内部应用程序的费用,如果要将它们分割到多个数据库服务器上),它可以使备份和随后的恢复更加方便(依赖于您使用的备份方法),并且降低了代码错误的风险,允许客户端(意外或通过有意的黑客攻击)查看其他数据。

这里没有正确的答案。 purist-dba路线将全部在一个数据库中。 如果你擅长devise/configuration/ SQL,你会惊讶于你现在可以得到一个8K的服务器。 廉价和肮脏的networking缩放路线将是1:1客户:分贝。 这样一来,如果一个客户比其他客户更受欢迎,你可以把他们分开,并扩展他们的设置。 纯粹的Web开发者路线将是“一个”分贝,但build在一个bigtable / dynamo方式扩大范围。

它真的变成了一个技术问题,更多的是一个企业。 你现在有多less个开发人员和pipe理员,他们有多聪明,他们已经知道了什么,你期望在近期有什么样的stream量,购买/租赁10倍硬件需要什么样的收入为此等等

总的来说,为什么大多数较早的启动手会说“只是让它工作和专注”。

编辑:也,这是没有办法这是一个系统pipe理员问这个问题。 开发人员总是喜欢将服务器configuration复杂性devise为“以防万一”。

我不使用MS SQL,但作为一个原则,每个客户一个数据库。 更容易处理。 另外,如果一个数据库被搞砸了,而且确实发生了,它不会影响到其他客户。 任何维护程序都可以像一个一样容易地为多个数据库编写脚本。

我一直在为每个客户使用一个数据库,如前所述,更新模式和备份将变得棘手。

但不是那么多。

您需要单独logging所有数据库(在不同的数据库中,至less如果不是不同的机器),有一个名为schema_update_log的表,或者写一个脚本来更新每个数据库的模式并logging成功。 所以,如果你有100,000个数据库,即使在许多物理服务器上,你也可以查询每个数据库并logging成功,如果由于任何原因失败,请再次尝试失败的数据库。

所以它会是这样的:

master_databases :(每个客户端的每个数据库的logging,以及它的连接string)db_id数据库…

schema_update_log pk query_id db_id状态(等待,成功,失败)时间戳错误(以防万一)

schema_query query_id(在schema_update_log中引用)查询

然后编写一个脚本来遍历每个数据集的查询和更新日志,继续这样做直到每个query_id,每个数据库都会在schema_update_log中返回成功。

这将需要时间,但会比adhoc更新更可靠。

分开的数据库。 除了给出的其他原因:

  1. 否则,您的查询将需要全部包含“AND project_id = $ project_id”
  2. pipe理机密性,存储个人客户的logging等要容易得多(您可能需要定期存档某些客户的数据库)
  3. 如果您曾经为个别客户添加function,可以为该客户添加架构更改(或至less您可以select)
  4. 没有数据泄漏从一个客户到另一个的危险

基本上,它更清洁或更正确:如果表中的行完全没有关系,那么它们不应该在一个表中。 (好吧,我只是做了这个规则。)

正如坚果所说,这取决于。 然而…

每个客户端的一个数据库听起来像是可能会让自己长久以来更难。 如果最终有10万个客户会怎么样? SQL服务器会处理那么多的数据库吗? 你最终会有100,000个数据库备份吗? 你将如何pipe理? 如果这将为你做更多的工作,为什么现在采取这个select,如果它可以稍后改变?

现在使用单个数据库可能是一个想法,但是想想如果最终有很多客户端,如何分割数据。