4

我的项目是基于多租户SaaS。

我有多个客户(公司),每个客户都有多个用户——他们都将使用相同的数据库布局。

每个客户都有自己的数据库,因此在用户身份验证期间,我想构建一个主数据库,将用户与该用户的公司数据库相关联。

每个数据库的结构都是相同的……只是数据不同。

这样我们就可以为不同的公司保留不同的数据库,这样就不会在数据库中混入数据。

编写应用程序时,客户端的数量(以及数据库的数量)是未知的,因此不可能在引导脚本中包含所有连接。

现在,我想要做的是,动态更改引导程序中的数据库连接,或者能够为登录的用户动态创建新连接。在 Yii 中是否有一个简单的解决方案并且仍然使用 AR ,查询建设者?

我看到了这个解决方案,但对我不起作用http://www.yiiframework.com/forum/index.php?/topic/5385-dynamic-db-connection/

这就是我今天的配置文件对于运行一个数据库的脚本的外观,我想调用一个主数据库来控制用户属于哪个数据库以及应用程序在 Yii 中使用,知道吗?

<? php

 $language = 'en'; 

  $currencyBaseCode = 'USD';

 $theme = 'default';

 $connectionString = 'mysql:host=localhost;port=3306;dbname=master';

 $username = 'root';

 $password = 'YOUR PASS';

 $memcacheServers = array( // An empty array means memcache is not used.

 array(

'host' => '127.0.0.1',

'port' => 11211, // This is the default memcached port.


 'weight' => 100,

  ),

  );

  $adminEmail = 'EMAIL ADDRESS';

  $installed = true; // Set to true by the installation process.

  $maintenanceMode = false; // Set to true during upgrade process or other maintenance tasks.

  $instanceConfig = array(); //Set any parameters you want to have merged into configuration array.

  //@see CustomManagement

  $instanceConfig['components']['request']['hostInfo'] = 'website url';

  $instanceConfig['components']['request']['scriptUrl'] = '/app/index.php';

  $urlManager = array (); // Set any parameters you want to customize url manager. 
  ? >
4

1 回答 1

0

在配置文件中定义主数据库,并使用普通的 AR 类连接到它以检索凭据。然后,关闭连接。

然后扩展 AR 类,特别是getDbConnection()方法。获取相关凭据,并将它们作为参数传递给新的 CDbConnection 对象。

获取凭据的初始 DB 请求将极大地拖累性能,因此您应该使用 Redis 或 Memcached 将它们真正存储在内存中。Yii 本身并不这样做。

有几种不同的方法:

  • 不同的前端控制器加载不同的配置文件,每个配置文件由单独的应用程序动态生成或销毁。
  • 一个大数据库。每条记录都有一个键来定义它属于哪个客户端。
  • 一个大数据库。可以通过使用客户端名称作为表名的一部分来复制表。

使用 Yii 这些都不是一件容易的事,因为这并不是 Yii 的设计初衷。

于 2013-02-09T16:07:30.770 回答