【发布时间】:2010-12-09 13:23:42
【问题描述】:
所以我正在开发一个 Web 应用程序,我们的客户希望他们的用户数据与其他客户的用户数据分开。由于我们的客户端可以相互协作,我们不能只为每个客户端创建一个新的应用程序实例,因为我们必须确保用户 ID 匹配并且在客户端之间是唯一的。
基本上,我们的“MasterApplication”数据库有一个“User”表,其中包含一个 UserId 和用于查找剩余用户数据的数据库名称。每个客户端都有自己的数据库用户,只能访问“MasterApplication”和自己的客户端表。
这是一个外观示例。
CREATE DATABASE MasterDatabase
CREATE DATABASE Client1
CREATE DATABASE Client2
CREATE TABLE `MasterDatabase`.`Person` (
`PersonId` INT NOT NULL AUTO_INCREMENT,
`DatabaseName` Varchar(20) NOT NULL,
PRIMARY KEY (`PersonId`)
)
CREATE TABLE `Client1`.`Person` (
`PersonId` INT NOT NULL,
`FirstName` Varchar(20) NOT NULL,
PRIMARY KEY (`PersonId`)
)
CREATE TABLE `Client2`.`Person` (
`PersonId` INT NOT NULL,
`FirstName` Varchar(20) NOT NULL,
PRIMARY KEY (`PersonId`)
)
INSERT INTO MasterDatabase.Person VALUES (1, 'Client1');
INSERT INTO MasterDatabase.Person VALUES (2, 'Client2');
INSERT INTO Client1.Person VALUES (1, 'Matt');
INSERT INTO Client2.Person VALUES (2, 'Scott');
所以 Client1 将拥有一个可以访问 MasterDatabase 和 Client1 表的数据库用户。 Client2 将拥有一个可以访问 MasterDatabase 和 Client2 的用户。
我希望有某种方法可以使用 MasterDatabase 中“DatabaseName”字段中的数据轻松地进行跨模式查询,但我想不通。我知道大部分情况下我可以将客户端的数据库名称存储在应用程序逻辑中,然后将其插入到查询中,但是有一些地方我需要将所有客户端加入到一个查询中。
我的尝试是做
SELECT *, `DatabaseName` INTO @DB FROM MasterDatabase.Person
LEFT JOIN @DB.Person ON MasterDatabase.Person.PersonId = @DB.Person.PersonId
但这并没有像我希望的那样奏效。有没有办法我可以通过程序来做到这一点?如果您有任何其他想法,我也愿意为每个客户分离用户数据。
【问题讨论】: