Php 多租户-提前或根据需要创建表?

Php 多租户-提前或根据需要创建表?,php,mysql,saas,multi-tenant,mysql-error-1146,Php,Mysql,Saas,Multi Tenant,Mysql Error 1146,我目前正在开发一个SaaS类型的应用程序,对于多租户,我已经为每个用户确定了一个数据库,每个数据库包含用户有权付费的功能所需的所有表。 该应用程序旨在捕获数据,如web分析,并将其呈现给用户。该设计最终应该能够扩展到数万用户 可行的解决方案是在应用程序检测到需要表时“动态”创建表吗?或者,当我知道可能需要用户升级、新功能等时,我是否应该在特定的用户数据库中创建所有最终需要的表 我当前的体系结构允许我这样做: function insertData($table, $data) { mys

我目前正在开发一个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
      }
    }
}
Tables_in_DATABASENAME (TABLENAME)
----------------------------------
be_groups

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

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

SHOW TABLES LIKE 'TABLENAME';
结果集如下所示:

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
      }
    }
}
Tables_in_DATABASENAME (TABLENAME)
----------------------------------
be_groups
如果行数为零,则表显然不存在


就你的过程而言,我想我会采取混合的方法。当客户升级时,作为资源调配工作流的一部分,创建向客户提供新服务所需的所有表。这样一来,客户就不会占用更多的磁盘资源,在这种情况下,不会超出他们的付费范围,您也不会给自己带来动态资源调配的痛苦。

谢谢您的回答。我编写的代码的好处是,只有当查询首先给出错误时,才会测试表是否存在。一旦创建了表,初始的INSERT查询将无错误地运行。如果要显示表,则需要每次运行INSERT时都进行检查。我同意我们关于在升级时创建表的评论,但如果系统中添加了新功能,我仍然需要遍历所有数据库。不一定,这取决于您的帐户结构设置。我将“遍历所有数据库”理解为“无论用户的帐户级别如何检查每个数据库”;实际上,您已经知道哪些数据库需要根据用户的ACL进行升级。如果您关心升级的服务器负载,那么创建空表几乎不需要任何负载—mysql基本上就是创建文件和更新索引。即便如此,你可以考虑交错部署和/或专用维护窗口。我承认插入/错误/创建周期与供应可能是比任何其他事情更为个人的选择,但对我来说,感觉就像在不存在的桌子上放上一杯果汁,注意到溢出,会得到一张桌子,然后重新开始。先看桌子比较容易。