【问题标题】:Tranforming single-customer web application into a multi-customer application将单客户 Web 应用程序转换为多客户应用程序
【发布时间】: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


【解决方案1】:

如果您要求用户使用“用户”值登录,您可以构建一个包含所有者和用户的连接表(我喜欢添加一个活动标志,仅用于 s&g)。确实没有添加临时表或视图的好方法,因为每个“所有者”都会有一个视图。有一种解决方案。您可以基于连接到 user() 上的“所有者”表的表创建视图。因此,例如,如果我有一个名为 usertemp(user varchar(40), owner varchar(45)) 的表并且我的用户名是“biff”(并且它存在于表中),我可以构建一个视图:

create view usertemp_v
as
select user, owner
from usertemp
where user=user();

然后我可以查询视图:

select *
from usertemp_v;

我将看到的只是与我的名字相关联的数据。但请理解,它要求您为用户设置一个变量,或者用户必须单独登录 MySQL。它还要求权限(IP 地址或域)也存在于 owner_users 表中(如果使用 user())。

然后,我必须针对我在 usertemp 中加入的所有者加入您的主源表。

【讨论】:

  • 我不太了解视图中的 user=user() 部分。 user() 指的是什么?
  • 表中有一个名为“user”的列。在 mysql 中还有一个函数可以返回当前会话用户“user()”。本质上,我将“虚拟私人行”中的用户与当前登录的用户帐户进行匹配。这是一般指南。如果您的软件需要不同的方法来识别给定用户,您可以替换它(例如 @user 变量)。
猜你喜欢
  • 1970-01-01
  • 2018-05-31
  • 2016-05-26
  • 2020-09-28
  • 1970-01-01
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多