一个表有不同的表前缀


Different table prefix for one table?

假设我安装了多个奇怪的MySQL/PHP驱动软件。它们是相同的软件,所以数据库表结构在所有安装中都是相同的。我想做的是,让软件使用不同的数据库前缀,只是一个表。具体来说,是用户表。假设安装是这样设置的:

  • 主安装:/home/www/Main,数据库主,前缀is1
  • 第二次安装:/home/www/Second,数据库主,前缀is2
  • 第三次安装:/home/www/Third,数据库主,前缀is3

所以我想告诉第二个安装和第三个安装从前缀is1上的users表中提取自己的数据通过该表。因此,在主安装上注册的任何用户也会在第二和第三安装上注册,反之亦然。这可能吗?如果可能,我该怎么做?即使这只是一个解决方案,给出相同的基本结果,我也会很高兴。

如果你不想修改应用程序的PHP源代码,并且它在这方面还不能配置,那么另一个选择是修改数据库,将is2usersis3users更改为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功能,以便跨所有三个数据库插入/更新/删除用户数据(这里的事务将很好)。

你所描述的是可能的,但需要一些自定义代码。