让我们说我需要设计一个数据库,它将托管多家公司的数据。现在出于安全和管理的目的,我需要确保不同公司的数据被正确隔离,但我也不想在10台不同的服务器上启动10个MySQL进程来为10家公司提供数据。用mysql数据库做这件事的最好方法是什么?如何设计一个多租户mysql数据库
回答
有多种租户数据库的方法。讨论时,他们通常分为三类。
- 每个租户一个数据库。
- 共享数据库,每个 租户一个模式。
- 共享数据库,共享模式。租户标识符(租户密钥)将每一行与正确的租户相关联。
MSDN在pros and cons of each design和examples of implementations上有一篇很好的文章。
假设您将在单个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绑定并确定要为某个公司显示哪些数据。
如果这不是你正在寻找的 - 我的道歉误解你的问题。
我的想法是在一定程度上隔离数据,以便每个公司数据库都有唯一的登录ID。因此,可以说,如果在A公司发生了一些安全性妥协,公司B的数据仍然应该是安全的。 – gaurav 2011-04-06 17:15:58
@ I.Tyger你甚至可以编码吗? – 2018-03-09 14:43:08
@ I.Tyger,因为你发表了一条没有道理的评论。我想你在这里学习,没关系。祝你好运。不要张贴废话,这是无聊的看到红点的烦人。 – 2018-03-09 15:11:11
给定一个特定的数据库用户,您可以为组指定允许其访问数据的公司的用户成员资格。
我认为你将有一个Companies
表,所以只需在Companies
和MySQLUsers
之间创建一个一对多的关系或类似的东西。
然后,您所有的疑问的情况下,只匹配基础上,UserID
你有没有考虑创建每个公司不同的schema的CompanyID
?
尽管如此,您应该尝试更准确地定义您想要实现的目标。
例如,如果要确保硬件故障不会损害多个公司的数据,则必须创建不同的实例并在不同的节点上运行它们。
如果你想确保从A公司的人看不到属于公司数据B,你可以这样做,在应用层面为每马修PK答案,例如
如果你想确保虽然有人设法破坏安全性并针对数据库运行任意SQL,但您仍然需要比这更强大的功能。
如果您希望能够独立备份数据,以便您可以在周日和公司A上安全地备份公司C,并且能够仅恢复公司C,那么纯粹基于应用程序的解决方案就不会帮帮我。
我想要做你最后一点提到的事情。独立进行备份,在一定程度上保持数据隔离,以便在一家公司收到大量流量时,将其移至另一台机器上的全新实例。 – gaurav 2011-04-06 17:53:02
然后看看架构,我没有太多的mySql经验,所以我可能会缺少一些特定于实现的细节,但我认为这是您的案例中最好的方法。 – 2011-04-06 22:08:23
简单的方法是:对于每个共享表,添加一个表示SEGMENT_ID的列。为每个客户分配适当的SEGMENT_ID。然后在SEGMENT_ID上为每个客户群创建视图,这些视图将保持每个客户的数据分离。通过这种方法,信息可以被共享,使得简单的操作&开发(存储过程也可以被共享)变得简单。
SEGMENT_ID是一个可怕的名字 – 2014-01-24 08:05:51
TENANT_ID是完美的名字 – Nabeel 2014-07-16 13:13:37
- 1. 多租户数据库设计
- 2. 具有2.4.0的多个数据库(每个租户一个)的Grails多租户
- 3. CakePhp多个租户 - 单个数据库与多个数据库
- 4. 如何为多个用户设计数据库表(MySQL)?
- 5. 与多租户数据库
- 6. 如何使一个外地在多租户数据库
- 7. 这是多租户数据库设计好吗
- 8. 数据库设计的多租户应用
- 9. 多租户SAAS应用程序的数据库设计和ORM
- 10. 多租户 - 为每个租户动态创建数据库
- 11. 多租户 - 设计模式
- 12. 多租户和EF6设计
- 13. 如何使用Azure弹性数据库设置多租户?
- 14. MySQL数据库设计:一个用户表,两个用户组?
- 15. 如何设计这个mysql数据库
- 16. 如何为多租户SaaS产品设计有效的数据库?
- 17. Grails的多租户与多数据库
- 18. 多个用户数据库设计
- 19. Rails - Apartment - MySQL drop租户数据库
- 20. 具有单个共享数据库的多租户数据库
- 21. 多租户WCF HOWTO使用多租户设计从
- 22. 租赁房源数据库设计
- 23. 多租户共享数据和租户
- 24. 多租户与租户共享数据
- 25. 相当大(400k)mysql数据库设计为多个用户
- 26. 如何在多租户数据库中设置唯一约束条件
- 27. 查找在多租户数据库
- 28. 映射多租户数据库
- 29. Loopback多租户数据库交换
- 30. 数据库设计决定:多个(mysql)数据库还是1个数据库?
在这种情况下可以分片帮助,每个分片包含单独客户端的数据吗? – gaurav 2011-04-07 16:36:08
频谱从“无共享”(每个租户一个数据库)运行到“共享所有”(每个表中的租户密钥)。 Sharding接近频谱的“共享所有”结尾。我希望它能够让单个租户的灾难恢复变得更简单。如果您可以想象单个服务器上的“共享所有”系统,为单个租户恢复数据意味着只恢复每个共享表中的某些行。这不仅仅是简单的。 – 2011-04-07 21:14:19
MySQL支持单个数据库多个Sachems吗? – Sagar 2016-01-09 07:39:16