如何设计一个多租户mysql数据库

时间:2011-04-06 16:54:45

标签: mysql database database-design multi-tenant

让我们说我需要设计一个数据库来托管多家公司的数据。现在出于安全和管理目的,我需要确保不同公司的数据被正确隔离,但我也不想启动10个mysql进程来托管10个不同服务器上的10家公司的数据。使用mysql数据库的最佳方法是什么。

6 个答案:

答案 0 :(得分:28)

多租户数据库有多种方法。对于讨论,它们通常分为三类。

  • 每个租户一个数据库。
  • 共享数据库,每个模式一个 租户。
  • 共享数据库,共享架构。租户标识符(租户密钥)将每一行与正确的租户相关联。

MSDN在pros and cons of each designexamples of implementations上有一篇很好的文章。

<小时/> 微软显然已经删除了我提到的页面,但第一个是在archive.org上。我改变了指向那里的链接。我还没有找到第二个。

答案 1 :(得分:4)

简单的方法是:对于每个共享表,添加一个名为SEGMENT_ID的列。为每个客户分配了正确的SEGMENT_ID。然后在SEGMENT_ID上为每个客户群创建视图。这些视图将保持与每个客户分开的数据。通过这种方法,可以共享信息,使操作和操作都变得简单。开发(存储过程也可以共享)简单。

答案 2 :(得分:3)

假设您在一个MySQL实例上运行一个MySQL数据库 - 有几种方法可以区分属于谁的内容。 最明显的选择(至少对我而言)是创建复合主键,例如:

CREATE TABLE some_table (
id int unsigned not null auto_increment,
companyId int unsigned not null,
..
..
..,
primary key(id, company_id)
) engine = innodb;

然后通过更改主键的companyId部分来区分公司。 这样,您可以将所有公司的所有数据放在同一个表/数据库中,在应用程序级别,您可以控制哪个公司与哪个companyId绑定,并确定为某个公司显示哪些数据。

如果这不是你想要的 - 我为误解你的问题道歉。

答案 3 :(得分:1)

在给定特定数据库用户的情况下,您可以向用户提供成员资格,以指示允许其访问数据的公司。

我认为您将拥有Companies表,因此只需在CompaniesMySQLUsers或类似内容之间创建一对多关系。

然后,作为所有查询的条件,只需根据CompanyID

匹配UserID

答案 4 :(得分:1)

您是否考虑为每家公司创建不同的schema

但是,您应该尝试更准确地定义您想要实现的目标。

例如,如果要确保硬件故障不会危害多个公司的数据,则必须创建不同的实例并在不同的节点上运行它们。

如果您想确保公司A的某人无法看到属于公司B的数据,您可以根据Matthew PK答案在应用程序级别执行此操作,例如

如果你想确定那些设法破坏安全性并针对数据库运行任意SQL的人,你需要比这更强大的东西。

如果您希望能够独立备份数据,以便您可以安全地在星期一和A公司备份公司C并且能够仅恢复公司C,那么,再次,纯粹基于应用程序的解决方案将无济于事

答案 5 :(得分:1)

在MySQL中,我更愿意为所有租户使用一个数据库。我通过为每个只能访问仅显示属于该租户的行的视图的租户使用单独的数据库用户来限制对数据的访问。

这可以通过以下方式完成:

  1. 向每个表添加一个tenant_id列
  2. 使用触发器在插入时使用当前数据库用户名填充tenant_id
  3. 为每个表创建一个视图,其中tenant_id = current_database_username
  4. 仅在应用程序中使用视图
  5. 使用租户特定的用户名连接到数据库

我已经在博客文章中对此进行了充分记录: https://opensource.io/it/mysql-multi-tenant/