1

我目前正在开发一个 SaaS 类型的应用程序,对于多租户,我已经为每个用户确定了一个数据库,每个数据库都包含用户有权使用的功能所需的所有表(已付费)。该应用程序旨在捕获数据(例如网络分析)并将其呈现给用户。该设计应该能够扩展到数以万计的用户(最终)。

一个可行的解决方案是在应用程序检测到需要它们时“动态”创建表吗?或者我应该在特定用户数据库中创建所有最终需要的表,只要我知道它们可能需要(用户升级、新功能等)?

我目前的架构允许我做这样的事情:

function insertData($table, $data) {
    mysql_query("INSERT INTO ".$table." VALUES ('".implode("', '", $data)."')");
    if ( mysql_errno() ) {
      if (mysql_errno() == 1146) { // table does not exist
        if ( $this->createTable($table) ) {
          $this->insertData($table, $data)
        }
      } else {
        // other errors
      }
    }
}

我希望能够灵活地添加功能,而不必遍历所有用户数据库来添加表,因此像上面这样的设置将帮助我实现这一目标。但我不确定我是否遗漏了一些让我日后后悔的决定?

4

1 回答 1

0

使用插入来测试表是否存在可能不是您的最佳选择,特别是考虑到行的大小和数据库服务器的延迟。更好的解决方案可能是使用“显示表​​格”,即:

SHOW TABLES LIKE 'TABLENAME';

结果集将是这样的:

Tables_in_DATABASENAME (TABLENAME)
----------------------------------
be_groups

如果行数为零,则显然该表不存在。

就您的流程而言——我想我会采用混合方法。当客户升级并作为供应工作流程的一部分时,创建向客户提供新服务所需的所有表。这样客户就不会占用比他们支付的更多的资源(在这种情况下主要是磁盘),并且您不会给自己带来动态配置的痛苦。

于 2010-08-09T21:14:15.700 回答