Vejamos as complexidades de tempo para ambos os casos:
EM ABORDAGEM DE MATRIZ: Tabela de entidades de
M rows
, com array de entradas ACL de size N
(linhas na tabela ACL não são relevantes aqui) COMPLEXIDADE DO TEMPO :O[N*log(M)]
ABORDAGEM DE PARTICIPAÇÃO: Tabela de entidades de
M rows
, com tabela ACL de N rows
COMPLEXIDADE DO TEMPO :O[M + N]
Na prática, geralmente temos uma situação como,
EM MATRIZ
N=10,000
M=1,000,000
O=>60,000
PARTICIPE
N=10,000
M=1,000,000
O=>1,010,000
E, em teoria, o pior cenário para in array seria
EM MATRIZ
N=1,000,000,000
M=1,000,000,000
O=>9,000,000,000
PARTICIPE
N=1,000,000,000
M=1,000,000,000
O=>2,000,000,000
O que isso significa? Resumo/TL;DR
Se cada usuário tiver acesso apenas a uma fração dos objetos em uma entidade, use o array IN.
Se cada usuário tiver uma entrada ACL para cada objeto de uma entidade, use JOIN. Embora os ganhos não sejam de várias ordens de magnitude (a menos que você tenha trilhões de produtos), você ainda pode usar o array IN.
Em ambos os casos, use ACL somente quando for absolutamente necessário! Eleitores FTW!