Php 如何使用MySQL查询分离数据,为多租户/白色标签的web应用做准备?

Php 如何使用MySQL查询分离数据,为多租户/白色标签的web应用做准备?,php,mysql,rest,white-labelling,Php,Mysql,Rest,White Labelling,我已经为自己的公司在RESTAPI(Slim/PHP/MySQL)上使用AngularJS创建了一个工作的web应用程序。现在,我有一大堆要求为像我这样的其他公司贴上白色标签 我的后端可能有大约一百个RESTAPI端点构建在PHP中,这些端点来自MySQL 对我来说,分离所有数据的最简单/最好的方法是什么? 我倾向于在同一个数据库中托管所有这些内容,并为每个表添加一个entityID列,并为我的每个白标公司分配一个entityID 然后将其添加到每个SQL命令: ...AND entityID=

我已经为自己的公司在RESTAPI(Slim/PHP/MySQL)上使用AngularJS创建了一个工作的web应用程序。现在,我有一大堆要求为像我这样的其他公司贴上白色标签

我的后端可能有大约一百个RESTAPI端点构建在PHP中,这些端点来自MySQL

对我来说,分离所有数据的最简单/最好的方法是什么?

我倾向于在同一个数据库中托管所有这些内容,并为每个表添加一个
entityID
列,并为我的每个白标公司分配一个entityID

然后将其添加到每个SQL命令:

...AND entityID=X
ie.
SELECT * FROM invoices WHERE status='paid' AND entityID=1;
这似乎是一种非常“暴力”的方式,因为我必须编辑100+SQL命令,其中一些是复杂的连接。你能想出更好的办法吗?我想知道是否有办法使用“MySQL视图”。我已经在使用视图隐藏“已删除的行”:

所以理论上我应该可以编辑我所有的视图。。。对吧?

CREATE VIEW invoices AS 
     SELECT * FROM _invoices where deleted is null 
          AND entityID=@entityID;
// BUT HOW would i set that entityID as a sql Variable from each PHP call?... 
//  I suppose I would have to add this before each call?
SET @entity=X;  

你能想出另一种方法,或者帮助我在视图中实现该变量,或者为我指出正确的方向吗?

这是我采用的方法:

  • 我在主数据库中保存了所有实体/公司的所有数据,并有一个
    entityID
  • 我为每个实体创建了一个新的数据库,但该数据库中充满了mysql视图,这些视图引用回主数据库。例如:

在我的情况下,这允许我不必更改代码中以前的任何查询。我所要做的就是选择合适的数据库,所有的数据都会自动分离


但将实际数据保存在同一个数据库中,这简化了维护。

这听起来比需要的复杂。白色标签涉及两件事:(1)确保每页都是特定于某个客户的,(2)确保每页都具有适合该客户的外观。对于第一种情况,如果产品已经与一个名为“客户”的实体打交道,那么在这种情况下,客户就是一个“超级客户”。啊,是的,我所说的“客户”就是一个“实体”,这确实是正确的做法。通常,
1
将来自会话,或者可能来自对域/URL的查找。如果要查找快捷方式,可以创建一个数据库模块,为所有应以这种方式受影响的查询添加
entity
子句。@halfer-ok yes。。那么你是说“数据库模块”比“视图”更好?是的,实际的entityID要么来自php,要么解析域/url,要么解析使用的api令牌。很可能我会基于API令牌,因为我们还有一个IOS应用程序将调用它。@halfer-谷歌搜索“mysql数据库模块”会得到很多一般性的东西。。。我到底在寻找什么,你能提供mysql文档或教程的链接吗?@halfer-谢谢你的所有输入!
CREATE VIEW invoices AS 
     SELECT * FROM _invoices where deleted is null 
          AND entityID=@entityID;
// BUT HOW would i set that entityID as a sql Variable from each PHP call?... 
//  I suppose I would have to add this before each call?
SET @entity=X;  
 # ie. main database has tables: users, and invoices tables
 # if you i have a new company named "acme", then:
 create database acme;
 create view acme.users as select * from maindb.users where entityID=2;
 create view acme.invoices as select * from maindb.invoices where entityID=2;