Sql 如何创建具有共享表结构的多租户数据库?

Sql 如何创建具有共享表结构的多租户数据库?,sql,mysql,database-design,multi-tenant,Sql,Mysql,Database Design,Multi Tenant,我们的软件目前运行在MySQL上。所有租户的数据存储在同一架构中。因为我们使用的是RubyonRails,所以我们可以很容易地确定哪些数据属于哪个租户。然而,当然也有一些公司担心他们的数据可能会被泄露,因此我们正在评估其他解决方案 到目前为止,我看到了三种选择: 多数据库(每个租户都有自己的-几乎相当于每个客户一台服务器) 多模式(MySQL中不可用,每个租户在共享数据库中都有自己的模式) 共享模式(我们当前的方法,可能在每列上都有额外的标识记录) 多模式是我的最爱(考虑到成本)。然而,创建

我们的软件目前运行在MySQL上。所有租户的数据存储在同一架构中。因为我们使用的是RubyonRails,所以我们可以很容易地确定哪些数据属于哪个租户。然而,当然也有一些公司担心他们的数据可能会被泄露,因此我们正在评估其他解决方案

到目前为止,我看到了三种选择:

  • 多数据库(每个租户都有自己的-几乎相当于每个客户一台服务器)
  • 多模式(MySQL中不可用,每个租户在共享数据库中都有自己的模式)
  • 共享模式(我们当前的方法,可能在每列上都有额外的标识记录)
多模式是我的最爱(考虑到成本)。然而,创建一个新帐户和进行迁移似乎是相当痛苦的,因为我必须迭代所有模式并更改它们的表/列/定义


Q:多模式似乎被设计为每个租户有稍微不同的表-我不希望这样。是否有任何RDBMS允许我使用多模式多租户解决方案,其中表结构在所有租户之间共享

另外,我所说的多租户是指超多租户(10.000+租户)

然而,也有一些这样的公司 担心他们的数据可能 要妥协,所以我们正在评估 其他解决办法

这是不幸的,因为客户有时会产生一种误解,认为只有物理隔离才能提供足够的安全性

有一篇有趣的MSDN文章,标题为,您可能想查看一下。这就是作者如何解决对共享方法的误解:

一个常见的误解是 只有物理隔离才能提供安全性 适当的安全级别。在里面 事实上,使用共享 这种方法还可以提供强有力的数据 安全,但需要使用更多 复杂的设计模式

关于技术和业务方面的考虑,本文简要分析了某种方法可能比另一种方法更合适的地方:

项目的数量、性质和需求 你希望为所有人服务的租户 您的数据体系结构决策 不同的方式。以下几点 这些问题可能会使你倾向于一个更为复杂的问题 孤立的方法,而其他方法可能 让你倾向于一种更共享的方式 接近

  • 你预计有多少潜在租户?你可能什么地方都没有 几乎可以估计 具有权威性的预期用途,但 从数量级考虑: 您是否正在为构建应用程序 数百名租户?几千?经皮电刺激神经疗法 成千上万?更多你越大 预计您的租户基础是 你可能更愿意考虑 更共享的方法

  • 您希望平均租户的数据占用多少存储空间? 如果您希望部分或所有租户 存储非常大量的数据 单独的数据库方法可能是可行的 最好的。(事实上,数据存储 需求可能会迫使您采用 还是单独的数据库模型。如果是, 这将更容易设计 从 开始,而不是移动到 稍后采用单独的数据库方法。)

  • 您希望平均租户支持多少并发最终用户? 数字越大,就越多 采取更孤立的方法 将满足最终用户的要求

  • 您是否希望为每个租户提供增值服务,例如 根据租户进行备份和恢复 能力?这样的服务比较容易 通过一个更孤立的 接近


更新:进一步更新预期租户数量

对于大多数(如果不是所有的话)场景,预期的租户数量(10k)应该不包括多数据库方法。我认为您不会喜欢维护10000个数据库实例,并且每天必须创建数百个新实例的想法

仅从该参数来看,它看起来像是共享数据库,单模式方法是最合适的。事实上,每个租户只需存储大约50Mb的数据,而且不会有每个租户的附加组件,这使得这种方法更加合适

上面引用的MSDN文章提到了三种安全模式,它们解决了共享数据库方法的安全问题:

当您对应用程序的数据安全措施充满信心时,您将能够为您的客户提供强大的数据安全保障。在SLA中,除了保证之外,您还可以描述为确保数据不受损害而采取的措施

更新2:很显然,微软的家伙们就这一主题发表了一篇新文章,原来的链接已经消失,这就是新的链接:(谢克尔先生很荣幸)

我的经验(尽管是SQL Server)是,多数据库是一条路要走,每个客户端都有自己的数据库。因此,尽管我没有mySQL或RubyonRails的经验,但我希望我的输入可能会增加一些价值

原因包括:

  • 数据安全/灾难恢复。每个公司的数据都与其他公司的数据完全分开存储,从而降低了数据被泄露的风险(比如,如果您引入了一个代码错误,这意味着某些东西错误地查看了其他客户机数据,而它本不应该这样做),最大限度地减少一个特定数据库损坏等情况下对一个客户端的潜在损失。对客户端的安全好处更大(增加了额外的副作用!)
  • 可伸缩性。从本质上讲,您应该将数据分区以实现更大的可扩展性—例如,可以将数据库放在不同的磁盘上,您可以使多个数据库服务器联机,并可以更轻松地移动数据库