Examinons les complexités temporelles pour les deux cas :
APPROCHE EN TABLEAU : Table d'entités de M rows
, avec un tableau d'entrées ACL de size N
(les lignes de la table ACL ne sont pas pertinentes ici)
COMPLEXITÉ TEMPORELLE :O[N*log(M)]
JOIGNEZ-VOUS À L'APPROCHE : Table d'entités de M rows
, avec table ACL de N rows
COMPLEXITÉ TEMPORELLE :O[M + N]
En pratique, nous avons généralement une situation comme,
EN TABLEAU
N=10,000
M=1,000,000
O=>60,000
JOIGNEZ-VOUS
N=10,000
M=1,000,000
O=>1,010,000
Et en théorie, le pire scénario pour in array serait
EN TABLEAU
N=1,000,000,000
M=1,000,000,000
O=>9,000,000,000
JOIGNEZ-VOUS
N=1,000,000,000
M=1,000,000,000
O=>2,000,000,000
Qu'est-ce que cela signifie ? Résumé/TL;DR
Si chaque utilisateur n'a accès qu'à une fraction des objets d'une entité, utilisez le tableau IN.
Si chaque utilisateur a une entrée ACL pour chaque objet d'une entité, utilisez JOIN. Bien que les gains ne soient pas de plusieurs ordres de grandeur (sauf si vous avez des billions de produits), vous voudrez peut-être toujours utiliser le tableau IN.
Dans les deux cas, n'utilisez ACL qu'en cas d'absolue nécessité ! Électeurs FTW !