我们开发了一个Web应用程序(PHP& Mysql),它目前是单个客户,即具有不同权限级别的用户都是同一公司的一部分,因此可以访问相同的数据。 我们现在计划将其转换为多客户平台,这意味着不同的用户组必须访问不同的数据集。
显而易见的方法是通过添加"所有者"来分隔数据。包含客户数据的所有MySql表的列。困难的部分是更改所有PHP代码以考虑额外的参数。 我们的想法是通过"所有者预先过滤数据"列,以便所有进一步的询问查询将始终只选择相对于连接客户的数据。通过这种方式,我们不必更改代码中的每个查询(查询中的表名已经参数化)。 可以使用临时表来完成吗?我们有一个自定义的PHP类来处理所有的数据库查询,我们的想法是每次创建类对象时都要在临时表中复制连接客户的数据。询问查询将自动路由到临时表而不是原始表,而插入,更新和删除操作将在原始表上执行。这是一种可行的方法还是会遇到麻烦?性能当然是一个问题。 关于如何处理这个的任何其他建议?
更多信息:用户的登录和身份验证由PHP处理,PHP设置有关该帐户的多个会话变量。用户帐户存储在&#39;用户帐户中。存储用户将询问/编辑的数据的同一数据库中的表。 因此,登录后我们有一个变量 $ _ SESSION [&#39;所有者&#39;] ,它将在整个项目中可用,并将用于识别用户可以查看/编辑的记录。< / p>
答案 0 :(得分:0)
如果您要求用户使用“user”值登录,您可以与所有者和用户建立联接表(我想添加一个活动标记,仅用于s&amp; g)。确实没有一种添加临时表或视图的好方法,因为每个“所有者”都有一个视图。有一种解决方案。您可以根据连接到user()上“owner”表的表创建视图。所以,例如,如果我有一个名为usertemp(用户varchar(40),所有者varchar(45))的表,我的用户名是'biff'(并且它存在于表中),我可以构建一个视图:
create view usertemp_v
as
select user, owner
from usertemp
where user=user();
然后我可以查询视图:
select *
from usertemp_v;
我将看到的是与我的名字相关联的数据。但请理解,它要求您为用户设置变量,或者用户具有到MySQL的单独登录。它还要求owner_users表中也存在权限(IP地址或域)(如果使用user())。
然后,我必须加入针对我在usertemp中加入的所有者的主要源表。