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

2023-12-27

我们的软件目前运行在 MySQL 上。所有租户的数据都存储在同一个schema中。由于我们使用 Ruby on Rails,我们可以轻松确定哪些数据属于哪个租户。然而,当然也有一些公司担心他们的数据可能会受到损害,因此我们正在评估其他解决方案。

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

  • 多数据库(每个租户都有自己的数据库 - 几乎与每个客户 1 个服务器相同)
  • 多模式(在 MySQL 中不可用,每个租户在共享数据库中都有自己的模式)
  • 共享模式(我们当前的方法,可能在每列上有额外的标识记录)

多模式是我最喜欢的(考虑到成本)。然而,创建新帐户并进行迁移似乎非常痛苦,因为我必须迭代所有模式并更改它们的表/列/定义。

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

附:我所说的“多”是指超多(10.000+ 租户)之类的东西。


但也有一些企业 当然,他们担心他们的数据可能会 受到损害,所以我们正在评估 其他解决方案。

这是不幸的,因为客户有时会误以为只有物理隔离才能提供足够的安全性。

MSDN 有一篇有趣的文章,标题为多租户数据架构 http://msdn.microsoft.com/en-us/library/aa479086.aspx,您可能想要检查。这就是作者如何解决对共享方法的误解的:

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

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

的数量、性质和需求 您期望服务的租户都会受到影响 您的数据架构决策 不同的方式。以下一些 问题可能会让你更倾向于 孤立的方法,而其他人可能 使你倾向于更加共享的 方法。

  • 您预计有多少潜在租户?你可能无处可去 接近能够估计 预期使用权威,但是 从数量级的角度思考: 您正在构建一个应用程序吗 数百名租户?数千?十 数千个?更多的?你越大 期望您的租户群是 您更有可能想要考虑 更加共享的方法。

  • 您预计租户的数据平均占用多少存储空间? 如果您希望部分或全部租户 存储非常大量的数据, 单独的数据库方法可能是 最好的。 (事实上​​,数据存储 要求可能会迫使您采用 无论如何,单独的数据库模型。如果是这样, 设计起来会容易得多 应用程序从 开始而不是移动到 稍后采用单独数据库方法。)

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

  • 您是否期望提供任何针对租户的增值服务,例如 按租户备份和恢复 能力?这样的服务比较方便 通过更孤立的方式提供 方法。


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

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

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

上面引用的 MSDN 文章提到了三种解决共享数据库方法安全注意事项的安全模式:

  • 可信数据库连接 http://msdn.microsoft.com/en-us/library/aa479086.aspx#mlttntda_tdc
  • 租户视图过滤器 http://msdn.microsoft.com/en-us/library/aa479086.aspx#mlttntda_tvf
  • 租户数据加密 http://msdn.microsoft.com/en-us/library/aa479086.aspx#mlttntda_tde

当您对应用程序的数据安全措施充满信心时,您将能够为您的客户提供服务水平协议 http://en.wikipedia.org/wiki/Service_level_agreement为数据安全提供强有力的保障。在 SLA 中,除了保证之外,您还可以描述为确保数据不受到损害而将采取的措施。

更新2:显然微软的人移动/制作了一篇关于这个主题的新文章,原始链接已经消失,这是新的链接:多租户 SaaS 数据库租赁模式 https://learn.microsoft.com/en-us/azure/sql-database/saas-tenancy-app-design-patterns(向谢·克尔致敬)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何创建具有共享表结构的多租户数据库? 的相关文章

  • MYSQL 中当前行上日期之前(并包括该日期)的所有行的总和

    重要的是要知道在查询期间日期是未知的 因此我不能只硬编码 WHERE 子句 这是我的桌子 Date ID Customer Order Count 20150101 Jones 6 20150102 Jones 4 20150103 Jon
  • 在评论中查找不同风格的日期

    我还有一个问题要问preg match 我有一个表 其中评论的日期写在评论本身内 手动 现在我需要提取该日期并将其放置在不同的列中 我发现评论和日期的样式如下 id warning sent warning date 6109 2011 0
  • SQL最近的命令?微软SQL

    我只是编写一个查询来查看我的客户数据库并列出他们下了多少订单等 我正在努力添加到此查询中的是只显示该电子邮件的最新 OrderID 有任何想法吗 这是我的查询 select top 1000 BuyerEMail COUNT HowMany
  • SSRS 报告 - IIF 声明问题

    做一个表达式时出现错误 有人可以在这里告诉我正确的语法吗 IIf Fields t cpcp Value 310 Purchased Material Raw Material Nothing IIf Fields t cpcp Value
  • MySQL Spatial CONTAINS 显示错误结果

    我的 MySQL 空间搜索有一个奇怪的行为 我在 GEOM 字段 葡萄牙边界 中创建了一个多边形 然后我尝试在内部找到一个点 发现没问题 下一次尝试是查找多边形外部的点 但查询仍返回 1 个找到的行 请帮忙 我做错了什么 为什么它会找到多边
  • MySQL max_allowed_pa​​cket 参数有什么问题?

    我需要增加 max allowed pa cket 参数 以适应一些理论上非常大的项目 如果我将此参数设置为 10M 那么与设置为 1M 或 4M 相比 我要支付什么价格 如果有的话 感谢您的任何意见 托马斯 我找到了这个解释 http w
  • 使用 mariaDB 将 sql 转储文件安装到 docker 容器

    我刚刚学习 docker 的基础知识 但一直停留在从本地系统导入 SQl 文件上 我使用的是 Windows 10 并允许我的 docker 容器访问我的共享驱动器 我有一个位于 D 上的 SQL 文件 我想导入到从 docker hub
  • 如何使用默认约束为mysql中的列创建随机数?

    DEFAULT 约束在接受字符串或当前日期值方面没有问题 我需要的是一个约束 每次创建实体时都会创建一个随机的 4 位数字 我尝试了以下代码 但它返回语法错误 ALTER TABLE client number ADD 代码 INT 4 D
  • keycloak - 基于用户名(电子邮件地址)的领域解析

    我正在开发一个多租户项目 其中用户名实际上是他们的电子邮件地址 而电子邮件的域用作租户标识符 现在在 keycloak 中 每个租户都有不同的领域 但我希望为所有租户提供一个登录页面 并且实际领域将通过用户名 电子邮件地址 以某种方式解析身
  • 检索前 10 行并对第 11 行中的所有其他行求和

    我有以下查询来检索每个国家 地区的用户数量 SELECT C CountryID AS CountryID C CountryName AS Country Count FirstName AS Origin FROM Users AS U
  • 使用 MySQL 触发器将所有表更改记录到辅助表

    我有一张桌子 CREATE TABLE data table data id INT NOT NULL AUTO INCREMENT PRIMARY KEY field1 INT NOT NULL field2 INT NOT NULL f
  • 将 .NET 小数存储到 MySQL 中的最佳字段定义是什么?

    我需要将小数存储到 MySQL 中 它可以具有不同的精度 因此我很想知道哪种 MySQL 字段类型绝对等同于 NET 的字段类型decimal http msdn microsoft com en us library system dec
  • SQL Server 'FETCH FIRST 1 ROWS ONLY' 无效使用

    我正在尝试将 Db2 查询转换为 SQL Server 我遇到了一个我不熟悉的构造 仅 FETCH FIRST 1 ROWS 这是在 db2 上运行的查询 select from products series where state xx
  • 根据多行中的总分对 mysql 中的用户进行排名

    我有与这个问题中描述的非常相似的要求 mysql中的用户按积分排名 https stackoverflow com questions 34637943 rank users in mysql by their points 唯一的区别在于
  • 需要在SQL Server 2012中自动递增字符串

    考虑 SQL Server 2012 中的表 789 0000000 上面的数字在 SQL Server 2012 中将被视为字符串 但每当我更新记录时 我都需要增加到 1 例如 当我更新记录 1 时 它应该增加到789 0000001 当
  • PDO 多查询“SQLSTATE[HY000]:一般错误”

    我仍在学习 PDO 所以我可能会错过一些东西 但基本上我正在尝试将一行插入表中 然后选择生成的 id 我不确定它是否喜欢一个 pdo 语句中的两个查询 这是我用来执行 SQL 的代码 public function ExecuteQuery
  • 如何更改Linux服务器中的MySQL表名不区分大小写?

    我正在开发一个旧网站 该网站曾经托管在 Apple 服务器上 当它迁移到新的 Linux 服务器时 它停止工作 我很确定这是因为 php 脚本中使用的所有 MySQL 查询对于表名都有不同的大小写组合 我不知道为什么原始开发人员在创建表名或
  • Rails 5.2.2(活动记录)WITH 语句

    我正在使用 Rails 5 2 2 并且有一个使用 WITH 语句的复杂查询 我需要使用左外连接创建该语句 我该如何做WITH活动记录中的语句 我的 TOTAL PROFILES 由查询对象驱动 并且会发生变化 而其余部分将始终保持不变 所
  • 使用 Athena 从 AWS WAF 日志中的规则组列表获取终止规则

    我跟着这些说明 https docs aws amazon com athena latest ug waf logs html将我的 AWS WAF 数据放入 Athena 表中 我想查询数据以查找具有 BLOCK 操作的最新请求 此查询
  • BigQuery 标准 SQL 中具有不同架构的联合表

    附加具有不同架构的表的最佳方法是什么 表 0 架构 表1 架构 这很好用 SELECT img1 NULL as img2 FROM xxx staging table0 UNION ALL SELECT img1 img2 FROM xx

随机推荐