Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于将PHP MySQL应用程序部署到多个客户的重复表_Php_Mysql_Database_Left Join - Fatal编程技术网

用于将PHP MySQL应用程序部署到多个客户的重复表

用于将PHP MySQL应用程序部署到多个客户的重复表,php,mysql,database,left-join,Php,Mysql,Database,Left Join,我正在使用一个为一个客户构建的PHP MySQL应用程序,并将其部署为多个客户使用。每个客户帐户将有许多用户(30-200),每个用户可以有几个类,每个类有几个度量,每个度量包含几个观察值。有几种方法大约是2-8 最初,我计划创建一个应用程序代码实例,该实例将根据表前缀连接到该客户的相应表集。但我现在考虑对所有客户帐户只使用一组表。这将简化应用程序设计,从长远来看,这将是最好的。我的问题是,通过将所有客户数据合并到同一个表中,是否会对数据库服务器征税。大多数查询都是SELECTs查询,但由于模式

我正在使用一个为一个客户构建的PHP MySQL应用程序,并将其部署为多个客户使用。每个客户帐户将有许多用户(30-200),每个用户可以有几个类,每个类有几个度量,每个度量包含几个观察值。有几种方法大约是2-8

最初,我计划创建一个应用程序代码实例,该实例将根据表前缀连接到该客户的相应表集。但我现在考虑对所有客户帐户只使用一组表。这将简化应用程序设计,从长远来看,这将是最好的。我的问题是,通过将所有客户数据合并到同一个表中,是否会对数据库服务器征税。大多数查询都是SELECTs查询,但由于模式的性质,可能需要相当多的联接。大多数INSERT或UPDATE查询只是一个表中的一行,最多可能是一个或两个桥接实体表。
我知道这是一个“视情况而定”的问题,但我希望得到一些关于MySQL的速度有多慢的指导

下面是我将要进行的最长连接查询的一个示例

SELECT $m_measure_table_name.*, $m_metric_table_name.metric_name,$m_metric_table_name.metric_descrip, $m_metric_table_name.metric_id, $c_class_table_name.class_size,$c_class_table_name.class_id,$c_class_table_name.class_field,$c_class_table_name.class_number,$c_class_table_name.class_section, $lo_table_name.*,$lc_table_name.*, $user_table_name.user_name,$user_table_name.user_id, $department_table_name.*
    FROM $m_measure_table_name
    LEFT JOIN $m_metric_table_name ON $m_measure_table_name.measure_metric_id=$m_metric_table_name.metric_id
    LEFT JOIN $c_class_table_name ON $m_metric_table_name.metric_class_id=$c_class_table_name.class_id
    LEFT JOIN $lo_table_name ON $m_metric_table_name.metric_lo_id=$lo_table_name.lo_id
    LEFT JOIN $lc_table_name ON $lo_table_name.lo_lc_id=$lc_table_name.lc_id
    LEFT JOIN $class_user_table_name ON $c_class_table_name.class_id=$class_user_table_name.cu_class_id
    LEFT JOIN $user_table_name ON $user_table_name.user_id=$class_user_table_name.cu_user_id
    LEFT JOIN $department_class_table_name ON $c_class_table_name.class_id=$department_class_table_name.dc_class_id
    LEFT JOIN $department_table_name ON $department_class_table_name.dc_department_id=$department_table_name.department_id
    WHERE $c_class_table_name.class_semester=:class_semester AND $c_class_table_name.class_year=:class_year
    AND $department_table_name.department_id=:id
    ORDER BY $department_table_name.department_name, $lc_table_name.lc_name, $lo_table_name.lo_id

最终我的问题是,在主键上执行这样长的连接字符串是否会对数据库造成负担。此外,是否使用一组表似乎是更好的部署方法

这条评论太长了

假设您有适当的索引和表分区,SQL被设计为在具有数百万行的表上运行良好。在这种情况下,我不担心数据量会成为一个问题

但是,您可能会遇到安全问题。您可能不希望不同的客户看到彼此的数据。行级安全性是SQL中的难题。桌子级别更容易

另一种方法是为每个客户创建单独的数据库。除了安全优势外,这还允许您将不同的客户移动到不同的服务器以满足需求

这是有代价的。如果您有公共表,那么您需要复制它们或拥有一个“公共表”数据库。而且,当您更新代码时,需要更新所有数据库。后者实际上也可能是一个优势。它允许您将功能单独转移给客户,而不是要求所有功能同时升级

编辑:(关于缩放一个数据库)

一般来说,对于一个数据库,扩展应该是合适的。如果数据库可以扩展,您只需在单个服务器上投入更多的硬件即可解决问题。您将需要明智地使用索引来提高性能,如果数据变得相当大,可能还需要使用分区。对于多个数据库,您可以在问题上抛出更多的“物理”服务器,而对于一个数据库,您可以在问题上抛出“更大”的服务器。(这些都是双引号,因为现在很多服务器都是虚拟的。)


作为区别的一个例子。如果您有100个客户机,那么您可以在方便的时候备份100个数据库,并且所有备份都是并行的。而且,如果数据库位于不同的服务器上,则备份不会相互干扰。对于单个数据库,您只需备份一次,它会同时影响所有人。而且备份可能需要更长的时间,因为您没有运行单独的作业(备份可以利用并行性)。

感谢您提出的安全性和可扩展性。我计划通过检查所有查询的所有权来加强安全性。无论我的方法如何,这都是必要的。如果我使用一分贝的方法,有哪些扩展解决方案?复杂性如何?我关心的是用户表。我必须在多个数据库中搜索一个用户,创建一个冗余用户表,或者让客户始终单击其帐户的链接(这意味着我必须向世界显示我的客户列表)。我通常看不到这种设置用于大型web应用程序,所以它让我认为这是错误的方法。@Tycon。我可能误解了这个特点。我以为用户会被客户“拥有”。例如,如果谷歌、微软和苹果拥有该应用的副本,那么用户将专门登录到他们公司的数据。通常情况下是这样的,但至少会有一些例外情况,一些管理员可以访问多个帐户/客户端。示例:跟踪多个客户数据的顾问可能会使用此应用程序-这项业务的一部分可能是咨询,因此最好能够灵活地支持能够访问多个客户帐户的用户。