2011-04-06 93 views
19

让我们说我需要设计一个数据库,它将托管多家公司的数据。现在出于安全和管理的目的,我需要确保不同公司的数据被正确隔离,但我也不想在10台不同的服务器上启动10个MySQL进程来为10家公司提供数据。用mysql数据库做这件事的最好方法是什么?如何设计一个多租户mysql数据库

回答

25

有多种租户数据库的方法。讨论时,他们通常分为三类。

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

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

+0

在这种情况下可以分片帮助,每个分片包含单独客户端的数据吗? – gaurav 2011-04-07 16:36:08

+1

频谱从“无共享”(每个租户一个数据库)运行到“共享所有”(每个表中的租户密钥)。 Sharding接近频谱的“共享所有”结尾。我希望它能够让单个租户的灾难恢复变得更简单。如果您可以想象单个服务器上的“共享所有”系统,为单个租户恢复数据意味着只恢复每个共享表中的某些行。这不仅仅是简单的。 – 2011-04-07 21:14:19

+0

MySQL支持单个数据库多个Sachems吗? – Sagar 2016-01-09 07:39:16

4

假设您将在单个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绑定并确定要为某个公司显示哪些数据。

如果这不是你正在寻找的 - 我的道歉误解你的问题。

+0

我的想法是在一定程度上隔离数据,以便每个公司数据库都有唯一的登录ID。因此,可以说,如果在A公司发生了一些安全性妥协,公司B的数据仍然应该是安全的。 – gaurav 2011-04-06 17:15:58

+0

@ I.Tyger你甚至可以编码吗? – 2018-03-09 14:43:08

+0

@ I.Tyger,因为你发表了一条没有道理的评论。我想你在这里学习,没关系。祝你好运。不要张贴废话,这是无聊的看到红点的烦人。 – 2018-03-09 15:11:11

1

给定一个特定的数据库用户,您可以为组指定允许其访问数据的公司的用户成员资格。

我认为你将有一个Companies表,所以只需在CompaniesMySQLUsers之间创建一个一对多的关系或类似的东西。

然后,您所有的疑问的情况下,只匹配基础上,UserID

1

你有没有考虑创建每个公司不同的schemaCompanyID

尽管如此,您应该尝试更准确地定义您想要实现的目标。

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

如果你想确保从A公司的人看不到属于公司数据B,你可以这样做,在应用层面为每马修PK答案,例如

如果你想确保虽然有人设法破坏安全性并针对数据库运行任意SQL,但您仍然需要比这更强大的功能。

如果您希望能够独立备份数据,以便您可以在周日和公司A上安全地备份公司C,并且能够仅恢复公司C,那么纯粹基于应用程序的解决方案就不会帮帮我。

+0

我想要做你最后一点提到的事情。独立进行备份,在一定程度上保持数据隔离,以便在一家公司收到大量流量时,将其移至另一台机器上的全新实例。 – gaurav 2011-04-06 17:53:02

+0

然后看看架构,我没有太多的mySql经验,所以我可能会缺少一些特定于实现的细节,但我认为这是您的案例中最好的方法。 – 2011-04-06 22:08:23

3

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

+4

SEGMENT_ID是一个可怕的名字 – 2014-01-24 08:05:51

+7

TENANT_ID是完美的名字 – Nabeel 2014-07-16 13:13:37