gpt4 book ai didi

php - 使用 Symfony 的 ACL 时,使用 JOIN 查询还是 IN 数组查询更好?

转载 作者:行者123 更新时间:2023-11-29 02:16:45 25 4
gpt4 key购买 nike

这个问题建立在 How to filter my Doctrine queries with Symfony ACL 的讨论之上

  • 有一个类/实体,例如产品
  • 它映射到数据库表
  • 每一行代表一个对象(一个产品)
  • 我们使用 ACL 来允许/限制对产品的访问

考虑到这一点,我们如何查询以获取用户有权访问的所有产品的列表?

检查每个产品,并检查用户是否有权访问是不可能的……这很快就会变坏。

在前面的讨论中,我们一直在玩弄 IN 数组或 JOIN 查询。

IN ARRAY APPROACH 获取用户有权访问的产品 ID 列表(来自 acl_entries 表),然后对 执行 IN 数组查询产品表

加入方法加入acl_entries 表products 表

(注意,在这两种情况下都没有使用 parent_acls)

最佳答案

让我们看看这两种情况的时间复杂度:

IN ARRAY APPROACH: M 行 的实体表,具有大小 N 的 ACL 条目数组(ACL 表中的行与此处无关)

时间复杂度:O[N*log(M)]


JOIN APPROACH: M 行 的实体表,以及 N 行 的 ACL 表

时间复杂度: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

如果每个用户仅被授予访问实体中部分对象的权限,请使用 IN 数组。

如果每个用户对实体的每个对象都有一个 ACL 条目,请使用 JOIN。虽然 yield 不会是几个数量级(除非你有数万亿的产品),所以你可能还是想使用 IN 数组。

在这两种情况下,只有在绝对必要时才使用 ACL!选民 FTW!

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com