假设我安装了多个奇怪的MySQL/PHP驱动软件。它们是相同的软件,所以数据库表结构在所有安装中都是相同的。我想做的是,让软件使用不同的数据库前缀,只是一个表。具体来说,是用户表。假设安装是这样设置的:
- 主安装:/home/www/Main,数据库主,前缀is1
- 第二次安装:/home/www/Second,数据库主,前缀is2
- 第三次安装:/home/www/Third,数据库主,前缀is3
所以我想告诉第二个安装和第三个安装从前缀is1上的users表中提取自己的数据通过该表。因此,在主安装上注册的任何用户也会在第二和第三安装上注册,反之亦然。这可能吗?如果可能,我该怎么做?即使这只是一个解决方案,给出相同的基本结果,我也会很高兴。
如果你不想修改应用程序的PHP源代码,并且它在这方面还不能配置,那么另一个选择是修改数据库,将is2users
和is3users
更改为is1users
的视图:
DROP TABLE is2users;
CREATE VIEW is2users AS SELECT * FROM is1users;
DROP TABLE is3users;
CREATE VIEW is3users AS SELECT * FROM is1users;
(关于视图的一般信息见http://dev.mysql.com/doc/refman/5.0/en/views.html,关于CREATE VIEW的具体信息见http://dev.mysql.com/doc/refman/5.0/en/create-view.html)
根据应用程序的不同,这可能不会完美地工作-例如,应用程序可能会在内存中缓存一些信息(例如标识符序列的当前值)-但它将可能工作。在将其投入生产之前进行测试!
您的php代码可能像这样在cfg.php:
$prefix = 'is3'
和user.model.php:
$sql = 'SELECT * FROM `'.$prefix.'users`';
因此,您需要在三个安装代码中的两个中更改用于处理'users'表的代码。但这似乎太危险了。
从模式的角度来看,这个设置很简单。你提到"安装",这意味着你正在使用一些打包的库,其中可能包含一个配置文件,你可以在其中更改各种设置,而其中一个设置可能是表前缀。如果没有表前缀选项,您可以浏览安装代码并找到模式所在的位置,并为每次安装手动更改前缀。
现在是最困难的部分,使代码按照您描述的方式运行。您必须使应用程序能够识别所有三个数据库,这意味着您可能必须向代码中添加两个新的数据库连接器(每个数据库一个连接器)。然后,您将不得不添加逻辑来处理用户CRUD功能,以便跨所有三个数据库插入/更新/删除用户数据(这里的事务将很好)。
你所描述的是可能的,但需要一些自定义代码。