11

我正在构建两个应用程序,它们将在通用模式中共享一些数据。我使用 MySQL 作为 RDBMS。这是我的第一个模式 ( test_schema_1):

test_schema_1

第二个(test_schema_2):

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

我错过了什么?

4

2 回答 2

10

MySQL 为所有数据库维护一组缓冲区。关于性能,表是否在不同的数据库中并不重要。

您的用例是边界线,但似乎是从不同数据库聚合数据的合理案例。

不过,我会小心这种架构。如果您的应用程序开始共享多个表,请问问自己这些应用程序是否真的是不同的应用程序,或者更确切地说是同一应用程序的模块。在后一种情况下,将所有表都放在一个数据库中对我来说是有意义的。

如果您担心安全性,请注意大多数访问权限可能是按表(甚至按列)授予的。

于 2013-11-18T15:16:46.563 回答
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;

第二部分是关于你的模式。基本上,查询不同的模式不是问题。如果您对安全问题感到困惑,我建议您将查询切换为过程。至于分片,分解不同的模式就更简单了。

于 2013-11-18T08:18:52.850 回答