【发布时间】:2018-07-31 10:23:51
【问题描述】:
我们开发了一个 Web 应用程序(PHP 和 Mysql),目前是单一客户,即具有不同权限级别的用户都是同一公司的一部分,因此可以访问相同的数据。 我们现在正计划将其转变为一个多客户平台,这意味着不同的用户必须访问不同的数据集。
显而易见的方法是通过向所有包含客户数据的 MySql 表添加“所有者”列来分离数据。困难的部分是更改所有 PHP 代码以考虑额外的参数。 我们的想法是通过“所有者”列预先过滤数据,以便所有进一步的询问查询将始终且仅选择与已连接客户相关的数据。通过这种方式,我们不必更改代码中的每个查询(查询中的表名已经参数化)。 这可以使用临时表来完成吗?我们有一个自定义 PHP 类来处理所有数据库查询,我们的想法是让它在每次创建类对象时在临时表中复制连接客户的数据。询问查询将自动路由到临时表而不是原始表,而插入、更新和删除操作将在原始表上执行。这是一种可行的方法还是我们会遇到麻烦?性能当然是这里的一个问题。 有关如何处理此问题的任何其他建议?
编辑
更多信息:用户的登录和身份验证由 PHP 处理,PHP 设置有关帐户的多个会话变量。用户帐户存储在同一数据库中的“用户”表中,用户将查询/编辑的数据存储在该表中。 所以登录后,我们有一个变量 $_SESSION['owner'] 将在整个项目中可用,并将用于标识用户可以查看/编辑的记录。
【问题讨论】:
-
根据应用程序(和客户端)的类型,最好提供数据隔离,例如为每个客户端提供单独的数据库。你写你有参数化的表名。你可以使用子查询
SELECT * FROM (SELECT * FROM org_tbl WHERE owner = 'aa') as tbl,虽然查询的性能会下降很多。接受您必须重写所有查询。 (并标记那些已修补的,以便它不会添加过滤子查询) -
客户端的数量是可变的并且希望很高,所以我会排除数据隔离。重写所有查询当然是我们最后的手段。临时表在性能方面是否比子查询更好/更差?
-
临时表 - 这取决于您将在临时表中放入多少数据。使用子查询将是最快的方法。因此,您可以更快地开始更改最常用的查询。
标签: php mysql web-applications webapp2