繁体   English   中英

多租户-是预先创建表格还是根据需要创建表格?

[英]Multi-tenancy - Create tables up-front or as needed?

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

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

我当前的体系结构将允许我执行以下操作:

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
      }
    }
}

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

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

SHOW TABLES LIKE 'TABLENAME';

结果集将如下所示:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM