2017-09-30 11 views
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 
+0

類似しているがネストされていないパスには一致しないように、 '%'の前にディレクトリ区切り文字を入れる必要があります。 – Barmar

+0

@barmarあなたはちょっと正しいですが、私はUUIDを使用しています。私はUUIDでパスを使用しています。名前ではありません。とにかく彼らは固定長です。だから私は本当にそこに衝突を期待していない。この制約を質問に追加します。 – rmalchow

答えて

0

、私の最初の最適化がパスを持っているだろう:のように、IDはUUIDがあり、「パス」フィールドには、すべての方法まで、親IDが含まれます私はLIKEシンプル

.... FROM entry e, entry_acl a ON e. 
で参加することができます)再帰フラグに応じて、(ワイルドカードを含むを含むかどうか、ACLテーブルに)連結して

foo bar recursive entry_path 

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

を行いました

関連する問題