Да да, вы правы, мой подход может подойти для частного случая, но он не универсален. Всем спасибо, хоть автор темы и не я но для себя многое вынес!!!
-~{}~ 09.11.07 22:45:
Последовав вашим советам я создал таблицу permissions:
id | uid | mod | act
1 | 1 | 1 | add
2 | 1 | 1 | delete
3 | 1 | 1 | edit
2 | 2 | 3 | view
Но смотрите что выходит... если модулей 30 а среднее количество действий 6 то это 180 записей на юзера
при 100000 юзеров это ~18 000 000 записей...
Мне кажется это много и тормозно...
Я провел тесты, создал в таблицах users и perms1 по 250 000 и 400000 записей соответственно. В цикле 30 000 подряд вынимаю эти данные из бд...
В итоге получаю время генерации страницы MIN: 28.6972169876 - MAX: 58.4005129337 сек
код:
PHP:
$stm = explode(' ',microtime());
$stm = $stm[1] + $stm[0];
ini_set('max_execution_time',190);
$db['charset'] = 'utf8';
$db['name'] = 'tests_db';
$db['host'] = 'localhost';
$db['user'] = 'юзер';
$db['pass'] = 'пароль';
$db['cid'] = '';
$db['cid'] = mysql_connect($db['host'],$db['user'],$db['pass']) or die('DB error #'.mysql_errno());
mysql_select_db($db['name'], $db['cid']) or die('DB error #'.mysql_errno());
mysql_query('SET NAMES \''.$db['charset'].'\'') or die('DB Error #'.mysql_errno());
for ($z=0;$z<30000;$z++) {
$f_res = mysql_query('SELECT * FROM users1 WHERE id=\'2\'') or die('DB Error #'.mysql_errno());
$user = mysql_fetch_assoc($f_res); mysql_free_result($f_res);
$f_res = mysql_query('SELECT * FROM perms1 FORCE INDEX (`srch`) WHERE uid=\'2\' && `mod`=\'1\'') or die('DB Error #'.mysql_errno());
$user['perms'] = mysql_fetch_assoc($f_res); mysql_free_result($f_res);
unset($user);
}
mysql_close($db['cid']);
$etm = explode(' ',microtime());
$etm = $etm[1] + $etm[0];
print $etm = $etm - $stm;
Далее я пошел на эксперимент и нарушение признаков Реляционной СУБД создав таблицу вида:
id | uid | mod | act
1 | 1 | 1 | add:delete:edit:view
колличество рядов в таблицах оставил тоже самое(хотя при такой реаллизации на одного пользователя не 180 записей а в 6 раз меньше 30) провел тесты получил время генерации MIN: 17.2141671181 - MAX: 34.9395740032 сек
код:
PHP:
//без изменения
for ($z=0;$z<30000;$z++) {
$f_res = mysql_query('SELECT a.*, b.act as `perms` FROM users1 a, perms b FORCE INDEX (`srch`) WHERE a.id=\'2\' && b.uid=\'2\' && b.mod=\'37673951\'') or die('DB Error #'.mysql_errno());
$user = mysql_fetch_assoc($f_res); mysql_free_result($f_res);
$user['perms'] = explode(':',$user['perms']);
unset($user);
}
//без изменения
Что вы думаете по этому поводу? Второй способ выигрывает и по скорости и по объему данных, хоть и данные не атомарные... Хотелось бы знать мнение гуру
Кстати кто-то тут писал что не понимает для чего нужны роли, вот наглядный пример, при большом кол-ве юзеров вместо того чтобы иметь мега таблицы с 1000 000 записей и можно иметь 10 ролей и табличку с разрешениями максимум на 1000 строк... думаю поиск будет гораздо быстрее, а для описания частных случаев можно завести еще табличку куда добавляются права пользователя, допутим модератора, которому запрещенно удалять темы, но можно редактировать, итого роль+ 1 запись быстро, удобно.