我正在构建两个应用程序,它们将在通用模式中共享一些数据。我使用 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
我错过了什么?