我正在构建两个将在通用架构中共享一些数据的应用程序。我正在使用MySQL作为RDBMS。这是我的第一个架构(test_schema_1
):
第二个(test_schema_2
):
我最近了解到我可以在多个模式之间进行JOIN。当我与root用户连接(无限制访问所有内容)时,我会这样做:
SELECT * FROM
TEST_SCHEMA_2.USERS U
JOIN TEST_SCHEMA_1.MASTER_USERS MU ON U.MASTER_ID = MU.ID
JOIN TEST_SCHEMA_2.ROLES R ON U.ROLE_ID = R.ID
WHERE MU.APP_ID = 'darth_vader@death.star';
得到我的期望!这看起来非常酷,因为我正在考虑使用这种设计进行生产。
但是我有点害怕这种设计的性能影响?这是一个好主意吗?如果将来我决定在不同的机器上对数据库进行分片(在MongoDB术语中)会怎样?
另外,我想知道安全问题。目前,我为每个架构都有一个单独的用户:
Host Db User Select_priv Insert_priv Update_priv Delete_priv Create_priv Drop_priv Grant_priv References_priv Index_priv Alter_priv Create_tmp_table_priv Lock_tables_priv Create_view_priv Show_view_priv Create_routine_priv Alter_routine_priv Execute_priv Event_priv Trigger_priv
% test_schema_1 t1 Y Y Y Y N N N N N N N N N N N N N N Y
localhost test_schema_1 t1 Y Y Y Y N N N N N N N N N N N N N N Y
% test_schema_2 t2 Y Y Y Y N N N N N N N N N N N N N N Y
localhost test_schema_2 t2 Y Y Y Y N N N N N N N N N N N N N N Y
所以我希望用户t1
无法从test_schema_2
读取。但上面的查询有效。他甚至可以插入test_schema_2
:
SELECT USER();
INSERT INTO TEST_SCHEMA_2.ROLES(ID, NAME) VALUES(4, 'TEST');
...
USER()
t1@localhost
-------------------------------------------
Updated Rows
1
我错过了什么?
答案 0 :(得分:8)
MySQL为所有数据库维护一组缓冲区。关于表演,表格是否在不同的数据库中并不重要。
您的用例是boderline,但似乎是汇总来自不同数据库的数据的合理案例。
我会谨慎使用这种架构。如果您的应用程序开始共享的不仅仅是几个表,请问自己这些应用程序是否真的是不同的应用程序,或者说是同一应用程序的模块。在后一种情况下,将所有表放在一个sigle数据库中是有意义的。
如果您担心安全问题,请注意,大多数访问权限可能会被授予on a per-table (or even per-column) basis。
答案 1 :(得分:1)
首先,您应该调整安全设置。您的用户可能已授予对所有架构的访问权限。 为简单起见,请尝试调用以下内容:
REVOKE ALL PRIVILEGES, GRANT OPTION from 't1','t2';
GRANT SELECT, INSERT, UPDATE, DELETE ON `test\_schema\_1`.* TO 't1';
GRANT SELECT, INSERT, UPDATE, DELETE ON `test\_schema\_2`.* TO 't2';
FLUSH PRIVILEGES;
第二部分是关于你的模式。基本上,查询不同的模式不是问题。如果您对安全问题感到困惑,我建议您将查询切换到过程。什么是分片,分解不同的模式更简单。