假设我需要设计一个数据库,用于存储多家公司的数据。现在出于安全和管理目的,我需要确保不同公司的数据得到适当隔离,但我也不想为10家公司的数据在10个不同服务器上启动10个mysql进程进行托管。有什么最好的方法可以使用mysql数据库实现这一点。
假设我需要设计一个数据库,用于存储多家公司的数据。现在出于安全和管理目的,我需要确保不同公司的数据得到适当隔离,但我也不想为10家公司的数据在10个不同服务器上启动10个mysql进程进行托管。有什么最好的方法可以使用mysql数据库实现这一点。
有几种处理多租户数据库的方法。一般来说,它们通常被分为三类。
MSDN有一篇很好的文章介绍了每种设计的优缺点和实现的示例。
作为参考,这是第二篇文章的原始链接。
错误404
。您是否有更新的链接?谢谢 - Metafaniel简单的方法是:对于每个共享的表,添加一列称为SEGMENT_ID。 为每个客户分配适当的SEGMENT_ID。 然后基于SEGMENT_ID为每个客户创建视图,这些视图将使数据与每个客户分开。 使用此方法,信息可以共享,同时简化操作和开发(存储过程也可以共享)。
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相关联,并确定显示某些公司的哪些数据。
如果这不是您要寻找的内容-很抱歉我误解了您的问题。
给定一个特定的数据库用户,您可以将用户成员身份授予组,指示他们被允许访问数据的公司。
我假设您将拥有一个Companies
表,因此只需在Companies
和MySQLUsers
或类似表之间创建一对多关系。
然后,在所有查询的条件中,只需根据UserID
匹配CompanyID
即可。
在我的文件Generate_multiTanentMysql.php中,我使用PHP脚本执行所有步骤。
https://github.com/ziedtuihri/SaaS_Application
一个解决方案设计模式:
为每个租户创建一个数据库用户
将每个表重命名为不同且唯一的名称(例如,使用前缀'someprefix_')
在每个表中添加一个名为'id_tenant'的文本列,用于存储行所属的租户名称
为每个表创建一个触发器,在插入新行之前自动将当前数据库用户名存储到id_tenant列中
为每个表创建一个视图,使用原始表名和除id_tenant外的所有列。该视图只返回(id_tenant = current_database_username)的行
仅向每个租户的数据库用户授予视图权限(而非表权限)
然后,应用程序中唯一需要更改的部分是数据库连接逻辑。当有人连接到SaaS时,应用程序需要:以该特定租户的用户名连接到数据库