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

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(使用前将#替换为@)

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

  • 用于捕获审计跟踪的数据库设计的想法[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 如何维护数据库中的数据日志 我必须维护对每一行所做的每次更改的日志 这意味着我不能允许DELETE and UPDATE待执行 我怎样才能保留这
  • 如何在 MySQL 中求和时间?

    正如您在图片中看到的 我有一份停机报告 显示了所选工厂在选定日期的停机时间 现在我想添加所有的值 Time Duration 列并将其显示在附近的单独显示中 TOTAL TIME DURATION 例如 在图像中 所选日期为 2015 年
  • MySQL 和 Hibernate 之间的主键自增由谁负责?

    MySQL CREATE TABLE role id role INT 11 unsigned NOT NULL AUTO INCREMENT PRIMARY KEY id role AUTO INCREMENT 1 休眠 Entity p
  • PL/pgSQL SELECT 到数组中

    这是我的函数声明和主体的一部分 CREATE OR REPLACE FUNCTION access update RETURNS void AS DECLARE team ids bigint BEGIN SELECT INTO team
  • 只获取倒数第二条记录 - mysql-query

    我有一个如下表记录 my table id rating description 1 0 0 bed 2 1 0 good 3 0 0 bed 4 1 0 good 5 0 0 bed 6 0 0 bed 7 0 0 bed 现在我通过评级
  • 需要按天分割日期时间范围

    我有一个需要根据日期时间拆分的表 输入表 ID Start End A 2019 03 04 23 18 04 2019 03 04 23 21 25 A 2019 03 04 23 45 05 2019 03 05 00 15 14 所需
  • PostgreSQL 中“-”处或附近的语法错误

    我正在尝试运行查询来更新用户密码 alter user dell sys with password Pass 133 但因为 它给了我这样的错误 ERROR syntax error at or near LINE 1 alter use
  • SQL 查询用于计算每个客户的订单数量和总金额

    我有两张桌子Order与列 OrderID OrderDate CID EmployeeID And OrderItem与列 OrderID ItemID Quantity SalePrice 我需要返回客户 ID CID 每个客户的订单数
  • 数据库表设计

    我在选择数据库表的变量类型时遇到问题 有人可以给我一些关于如何选择类型的一般准则吗 以下是我的一些问题 用户 ID 应该是什么 INT 看起来很小 因为设计时应该考虑到大量用户 那么如果不是 INT 还有什么呢 大整数 VARCHAR 难道
  • SQL 2008全文索引填充延迟

    我的经理说 在基础表数据更改后 可能需要一段时间才能更新全文搜索索引 例如 如果我有一张桌子Products有一个柱子Description我更新了该描述 然后我可能需要一些时间才能搜索该新描述 真的吗 这需要多长时间 SQL 2008 对
  • 检查两个“select”是否相等

    有没有办法检查两个 非平凡的 选择是否等效 最初我希望两个选择之间有形式上的等价 但是答案在证明 sql 查询等价性 https stackoverflow com questions 56895 proving sql query equ
  • 错误代码:1305。函数或过程不存在

    因此 我在 MySQL 中创建一个函数 然后尝试向用户授予使用该函数的权限 但我无法这样做 这就是我正在做的 DELIMITER USE rxhelp36 scbn DROP FUNCTION IF EXISTS businessDayDi
  • 慢速自动增量重置

    我有很多表 由于某些原因 我需要在应用程序启动时调整这些表的自动增量值 我尝试这样做 mysql gt select max id from item max id 97972232 1 row in set 0 05 sec mysql
  • 如何搜索例程的内容/(SP-触发函数)

    我需要在数据库内所有例程的例程主体 存储过程 函数 触发器 中搜索文本 我该怎么做 Thanks SELECT OBJECT NAME object id FROM sys sql modules WHERE definition LIKE
  • JDBC插入实数数组

    我试图将一个真实的数组插入到 postgresql 数组中 该表的定义是 String sqlTable CREATE TABLE IF NOT EXISTS ccmBlock sampleId INTEGER block REAL 插入内
  • 在 jQuery AJAX 成功中从 MySql 获取特定响应

    好吧 我有这个 ajax 代码 它将在 Success 块中返回 MySql 的结果 ajax type POST url index php success function data alert data My Query sql SE
  • 数据库字段中的逗号分隔值

    我有一个产品表 该表中的每一行对应一个产品 并由唯一的 ID 标识 现在 每个产品都可以有多个与该产品关联的 代码 例如 Id Code 0001 IN ON ME OH 0002 ON VI AC ZO 0003 QA PS OO ME
  • 如何在 SEQUELIZE (nodeJS) 中创建触发器?

    我正在尝试使用sequelize 创建一个触发器 主要思想是创建一个实例CONFIG创建后USER USER MODEL module exports function sequelize DataTypes var User sequel
  • st_intersects 与 st_overlaps

    这两个查询有什么区别 select a gid sum length b the geom from polygons as a roads as b where st intersects a the geom b the geom gr
  • 如何在MYSQL中将整个字符串小写并保持第一个大写[重复]

    这个问题在这里已经有答案了 我的表栏目 我预期的输出会在列中发生变化 Smith Allen Doyle Dennis Baker Waker 这是我尝试过的 但不起作用 UPDATE TABLE employee SET last nam

随机推荐