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

gau*_*rav 30 mysql database database-design multi-tenant

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

Mik*_*ll' 32

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

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

MSDN对好文章的优点和每一个设计的利弊,以及实施方案的实例.


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

  • @Sagar:不。从标准的SQL角度来看,MySQL不支持`create schema`。MySQL中的“ create schema”只是“ create database”的同义词。[文档](http://dev.mysql.com/doc/refman/5.7/en/create-database.html) (2认同)

小智 6

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

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

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

我已经在博客文章中完整记录了这一点:https : //opensource.io/it/mysql-multi-tenant/

  • 您的文章似乎不再存在:“错误 404”。您有更新的链接吗?谢谢 (2认同)

小智 5

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

  • TENANT_ID是完美的名字 (11认同)
  • SEGMENT_ID是一个糟糕的名字 (7认同)