这个问题建立在How to filter my Doctrine queries with Symfony ACL的讨论之上
有一个类/实体,例如产品
它映射到数据库表
每一行代表一个对象(产品)
我们使用ACL来允许/限制对产品的访问
有鉴于此,我们如何查询以获取用户可以访问的所有产品的列表?
浏览每个产品,并检查用户是否有权访问是不可能的。。。很快就会变坏的。
在前面的讨论中,我们使用了In-array或JOIN查询。
IN ARRAY APPROACH获取用户有权访问的产品id列表(从acl_entries table),然后在products table上执行IN ARRAY查询。
连接方法用acl_entries table连接products table
(注意,在这两种情况下都不使用父acl)

最佳答案

让我们看看这两种情况的时间复杂性:
数组方法:实体表为M rows,ACL entries数组为size N(ACL表中的行与此处无关)
时间复杂度:O[N*log(M)]
连接方法:实体表为M rows,ACL表为N rows
时间复杂度:O[M+N]
实际上我们通常有这样的情况,
排列

N=10,000
M=1,000,000
O=>60,000

加入
N=10,000
M=1,000,000
O=>1,010,000

理论上,in-array的最坏情况是
排列
N=1,000,000,000
M=1,000,000,000
O=>9,000,000,000

加入
N=1,000,000,000
M=1,000,000,000
O=>2,000,000,000

这是什么意思?摘要/TL;DR
如果每个用户只被授予访问数组中使用的实体中的一小部分对象的权限。
如果每个用户对实体的每个对象都有一个ACL条目,请使用JOIN。虽然收益不会有几个数量级(除非你有数万亿的产品),所以你可能仍然想在数组中使用。
在这两种情况下,只有在绝对必要时才使用ACL!选民们!

关于php - 使用Symfony的ACL时,最好使用JOIN查询或IN数组查询?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38426584/

10-13 08:47