【问题标题】:One database per client or all clients in one database? [closed]每个客户端一个数据库还是一个数据库中的所有客户端? [关闭]
【发布时间】:2017-05-03 15:15:50
【问题描述】:

我必须在 SQL Server 中为我的项目设计一个数据库结构,作为一个管理信息系统。

我有一个主数据库,每当有新组织订阅我们基于 Web 的应用程序时,我的系统都会为该客户创建一个主数据库的新副本。随着时间的推移,客户端数量的增加,客户端数据库的数量也随之增加。

这是我正在使用的好方法,还是我必须为所有客户端使用一个数据库?

【问题讨论】:

  • 你为什么要改变我的问题,当你不理解我的问题时。
  • 我确实理解您的问题并已编辑我的答案。您最初的“新客户何时来”不清楚。
  • 这是一种非常糟糕的方法 - SQL Server 可以轻松处理一个包含 30 家公司的“主”表 - 绝对有 不需要(也没有好处)为每个客户创建一个单独的数据库......
  • 如果我不使用这种方法,一个主表的单个表将有很多不同公司的数据。那么性能呢。
  • SQL Server 中的魔法被称为正确的索引来处理性能 - 选择一个好的聚集索引,以及尽可能多的非聚集索引需要。性能调整您的查询,不要做任何愚蠢和草率的 SQL 编程 - 性能会很好

标签: .net sql-server multi-tenant


【解决方案1】:

不,每个客户端创建一个数据库,假设客户端只是数据库中的一个实体,而不是多租户应用程序的单独用户,这不是一个好主意。

如果您想在客户端下注册其他实体,例如硬件、项目或其他资源,那么您可以将其存储在单独的表中并创建从资源到客户端的外键,指示“has-a”关系.

看起来像这样:

客户

Id Name
1  Foo
2  Bar

资源

Id ClientId Name 
1  1        Resource of Foo
2  1        Resource of Foo
3  2        Resource of Bar

您还可以在多租户系统中采用上述方法,您的应用程序的所有用户都在同一个数据库和应用程序上运行。

不过,使用这种方法,您会有不同的顾虑。例如,单个数据库可能会不成比例地增长,从而损害性能以及备份和恢复的便利性。您必须在整个应用程序中添加检查,以检查当前用户有权访问的行是否发生任何数据库访问。回滚一个用户的操作可能更难,以及为特定用户引入新功能(因为它们都运行在相同的软件和数据库架构上)。

详细了解您正在寻找的“多租户”一词:

回答如何 来实现多租户将过于宽泛,请参阅上面链接中有关它的 MSDN 博客系列。至于性能问题:只有你知道。这一切都取决于您的代码、您的数据、您的架构、您的硬件等等。对其进行基准测试。

【讨论】:

  • 我有一个主数据库,当一个组织订阅我们的应用程序(网络基础)时,我们会为该组织创建一个单独的数据库来存储他们的数据,并且该单独的数据库是主数据库的副本。如果有 30 家公司或组织正在使用我们的系统,那么我们的服务器中将有 30 个客户端数据库。
  • @TheComputerScientist 当您有 30,000 个客户时,您将拥有 30,000 个数据库。当您发布需要更改数据库架构的系统重大更改时,将架构更改推广到所有 30K 数据库需要多长时间?甚至 30 个数据库?迁移到新的 SQL Server 实例(升级等)怎么样?您将面临一些非常具有挑战性的扩展问题。
猜你喜欢
  • 1970-01-01
  • 2012-02-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2015-10-07
  • 2011-03-31
  • 2011-02-17
  • 2015-04-14
相关资源
最近更新 更多