让我们看看这两种情况的时间复杂度:
数组方法:实体表M rows
,ACL 条目数组为size N
(ACL 表中的行与此处无关)
时间复杂度:O[N*log(M)]
加盟方式:实体表M rows
,ACL表为N rows
时间复杂度:O[M+N]
实际中我们通常会遇到这样的情况,
IN ARRAY
N=10,000
M=1,000,000
O=>60,000
JOIN
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
JOIN
N=1,000,000,000
M=1,000,000,000
O=>2,000,000,000
这是什么意思?摘要/TL;DR
如果每个用户仅被授予访问实体中一部分对象的权限,请使用 IN 数组。
如果每个用户对于实体的每个对象都有一个 ACL 条目,请使用 JOIN。虽然收益不会是几个数量级(除非你有数万亿个产品),所以你可能仍然想使用 IN 数组。
在这两种情况下,仅在绝对必要时才使用 ACL!选民们!