1
現在の問題について考えています。これは、ノード単位のACLとともにツリー上で検索すると常に起こります。ユーザーがページ区切りの結果を要求すると、生の結果を取得し、ACLに対してフィルタをかけなければならず、十分な結果が得られない場合は、十分な結果が得られるまで、再度検索する必要があります。1つのSQL文内の再帰的および非再帰的なACL
これを一度に行うことができないのではないでしょうか?私が探しています文で
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;
:
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;
うこの文(任意の実際の検索条件をスキップ):
はこれを(私は簡潔にするためのインデックスをスキップしています)を考えると?あなたは明らかな改善や間違いを発見できますか?私はそこのCONCAT声明について少し不幸です...これを避ける方法はありますか?
EDIT:私(そう
c83eff41-dec8-45fb-94ef-6e3f380ebcec.1db333d9-995e-4e24-af8a-da2faf962060.dd71fd12-c975-4f33-bf0e-2df9da312bcd
類似しているがネストされていないパスには一致しないように、 '%'の前にディレクトリ区切り文字を入れる必要があります。 – Barmar
@barmarあなたはちょっと正しいですが、私はUUIDを使用しています。私はUUIDでパスを使用しています。名前ではありません。とにかく彼らは固定長です。だから私は本当にそこに衝突を期待していない。この制約を質問に追加します。 – rmalchow