2010-08-18 4 views
2

У меня есть таблица под названием page, которая представляет каждую страницу на моем сайте.MySQL: что является лучшим способом создания системы доступа?

page_id | page_subject | page_path 
---------------------------------- 
1  | Foo   | /Foo 
2  | Bar   | /Bar 

Я также таблицу с именем group:

group_id | group_name 
--------------------- 
1  | Users 
2  | Admins 

Цель: как определить доступ к каждой странице для одной группы? я создать еще одну таблицу - page_group:

page_group | group_id 
--------------------- 
1   | 1 
1   | 2 

Таблица содержит группы, которые имеют доступ к странице (page_group).

Я написал функцию:

CREATE FUNCTION `PAGE_ACCESS`(`pageId` INT, `groupId` MEDIUMINT) 
BEGIN 
    RETURN IF((SELECT COUNT(*) FROM `page_group` WHERE page_id = pageId AND group_id = groupId) > TRUE, FALSE); 
END; 

Теперь я могу сделать что-то вроде этого:

SELECT * 
FROM page 
WHERE <conditions> AND PAGE_ACCESS(page_id, <group_id>) 

... который возвращает страницы, которые я должен иметь доступ.

Работает нормально, но кажется медленным с рядами> 100 000 Как вы это сделаете? Вы поступили бы по-другому?

ответ

2

попробовать:

SELECT * 
from Page p 
WHERE EXISTS (SELECT 1 from page_group pg join group g 
       on (pg.group_id = g.groupidId) 
       WHERE g.group_id = <groupId> 
       AND p.page_id = pg.page_id) 

Также вы можете попробовать (только понял, что таблица групп не обязательно):

SELECT * 
from Page p 
WHERE p.page_id IN (Select page_id 
        from page_group pg 
        WHERE pg.group_id = <group_id>) 

или даже:

SELECT p.* 
from Page p JOIN page_group pg ON (p.page_id = pg.page_id) 
WHERE pg.group_id = <group_id> 
+0

Удивительно (для меня), это очень эффективный способ сделать эту проверку - mySQL может оптимизировать эту ситуацию, если у вас хорошие индексы. – Piskvor

+0

Спасибо, я попробую и дам вам знать :) – Bald

0

Я бы проверить скорость запроса с EXPLAIN SELECT - Я предполагаю, что у вас нет индексов на таблицах? Еще одно предположение: индекс на (page_group.page_group,page_group.group_id) может ускорить процесс. См. this introduction on EXPLAIN.

Кроме того, см. @Michael Pakhantsov's answer with the subquery - серверу проще оптимизировать подзапрос, чем UDF.

+0

У меня есть индексы :) – Bald

+0

@Bald: О, хорошо. И используются ли они этим запросом? – Piskvor

Смежные вопросы