gpt4 book ai didi

mysql - 一个 SQL 语句中的递归和非递归 ACL

转载 作者:行者123 更新时间:2023-11-30 21:52:47 25 4
gpt4 key购买 nike

我正在考虑当前的一个问题 - 当您在树上搜索时以及每个节点的 ACL 时总是会发生 - 如果用户请求分页结果,我有时必须检索原始结果,过滤ACL,如果我没有足够的结果,我必须再次搜索……直到我有足够的结果。

一次性完成这件事不是更好吗?

鉴于此(为简洁起见,我跳过了索引):

CREATE DATABASE `test`;

CREATE TABLE `acl` (
`id` varchar(36) NOT NULL,
`entry_id` varchar(36) NOT NULL,
`principal_id` varchar(36) NOT NULL,
`recursive` tinyint(1) NOT NULL,
`permission` varchar(45) NOT NULL,
PRIMARY KEY (`id`),
KEY `fk_entry_has_acl_idx` (`entry_id`),
CONSTRAINT `fk_entry_has_acl` FOREIGN KEY (`entry_id`) REFERENCES `entry` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `entry` (
`id` varchar(36) NOT NULL,
`parent_id` varchar(36) DEFAULT NULL,
`path` varchar(512) DEFAULT NULL,
`name` varchar(128) DEFAULT NULL,
`type` varchar(45) DEFAULT NULL,
`category` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这个语句(跳过任何实际的搜索条件):

SELECT 
e.*
FROM
entry e JOIN acl a JOIN entry e2 ON
((
e.id = a.entry_id
AND
a.recursive=0
) OR (
a.entry_id = e2.id
AND
e.path LIKE CONCAT(e2.path,'%')
AND
a.recursive=1

))
AND
a.principal_id in ("K")
AND
a.permission IN ("READ","WRITE")
GROUP BY e.id;

是我正在寻找的声明吗?你能发现任何明显的改进和/或错误吗?我对那里的 CONCAT 声明有点不满意......有没有办法避免这种情况?

编辑:id 是 UUID,“路径”字段将一直包含父 ID,如:

 c83eff41-dec8-45fb-94ef-6e3f380ebcec.1db333d9-995e-4e24-af8a-da2faf962060.dd71fd12-c975-4f33-bf0e-2df9da312bcd

最佳答案

因此,我的第一个优化是在 ACL 表中包含路径(我对 concat 所做的),包括或不包括通配符(取决于递归标志)

foo bar recursive  entry_path

... ... 1 ID1.ID2.ID3%
... ... 0 ID1.ID2.ID3

所以我可以通过一个简单的 LIKE 加入

.... FROM entry e, entry_acl a ON e.

关于mysql - 一个 SQL 语句中的递归和非递归 ACL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46501483/

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