![]() |
Модераторы: skyboy |
![]() ![]() ![]() |
|
serghd |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 136 Регистрация: 5.10.2009 Репутация: нет Всего: нет |
Здравствуйте, интересен следующий вопрос. Есть таблица пользователей, пользователь может иметь 6 различных уровней прав. Для каждого уровня прав - отдельная таблица (поля у них, допустим: id | user_id). Вопрос в том, можно ли как-то получить все уровни права пользователя не считывая отдельно каждую из таблиц прав, а одним запросом? Т.е. если его id есть в таблица_прав1, то по данному праву у объекта пользователя - true. Также и с остальными таблицами прав.
|
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
stfg Левое соединение
-------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
serghd |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 136 Регистрация: 5.10.2009 Репутация: нет Всего: нет |
я в курсе о нём. Вы думаете, что в этом случае это поможет?) |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
Из описания ни хрена не удаётся понять. Кроме того, что ACL реализованы через одно место - право на объект есть одна сущность, и негоже размазывать её по куче таблиц
+ stfw объединение запросов Проинтуичить, что ли? ![]() -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
serghd |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 136 Регистрация: 5.10.2009 Репутация: нет Всего: нет |
ну как ещё описать, чтобы было понятно - хз. И так вроде по буквам разложил. Пусть будет пример: есть учитель, ученик и родитель. У всех свои разные права, хотя при этом все являются пользователями. Таблица users: id | login Таблица pupils: id | user_id | class Таблица teachers: id | user_id | subject Таблица parents: id | user_id | pupil_id После авторизации надо знать какие права у пользователя, т.к. например родитель может быть в то же время и учителем.
Как раз-таки считаю совсем наоборот - пихать в одну общую таблицу кучу ненужных для некоторых типов пользователей информацию считаю злом, поэтому и разделил. Или вы предлагаете дополнительное поле в таблицу users с "перечислением" доступных прав? Думал, но не то это, т.к. нужна дополнительная инфа, которая отмечена в таблицах примера выше по каждому типу пользователя. Это сообщение отредактировал(а) serghd - 28.2.2012, 20:30 |
||||
|
|||||
Zloxa |
|
||||||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
на счет левого соеднинеия, вы уже конечно в курсе
ну или через объединение, как предлагал Акина
Но такой дизайн для ACL - да, весьма странен. ![]() Это сообщение отредактировал(а) Zloxa - 28.2.2012, 20:40 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
||||||
|
|||||||
serghd |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 136 Регистрация: 5.10.2009 Репутация: нет Всего: нет |
можете порекомендовать другой? |
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
Попытаться вас в чем то побуеждать? Ни в коем разе, с чего вы подумали? Просто поделился наблюдением. -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
serghd |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 136 Регистрация: 5.10.2009 Репутация: нет Всего: нет |
||||
|
||||
serghd |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 136 Регистрация: 5.10.2009 Репутация: нет Всего: нет |
придумал
"SELECT (SELECT COUNT(id) FROM `administrators` WHERE user_id = '".$user_id."') as admin, (SELECT COUNT(id) FROM `form_masters` WHERE user_id = '".$user_id."') as form_master, (SELECT COUNT(id) FROM `teachers` WHERE user_id = '".$user_id."') as teacher, (SELECT COUNT(id) FROM `head_teachers` WHERE user_id = '".$user_id."') as head_teacher, (SELECT COUNT(id) FROM `pupils` WHERE user_id = '".$user_id."') as pupil, (SELECT COUNT(id) FROM `parents` WHERE user_id = '".$user_id."') as parent" Вывод: Array ( [admin] => 1 [head_teacher] => 1 [form_master] => 0 [teacher] => 1 [pupil] => 1 [parent] => 0 ) всё ок, в базе так и лежит. Если равно 0, то данных прав нет. Это сообщение отредактировал(а) serghd - 28.2.2012, 22:01 |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
Месье знает толк в извращениях... но коли оно нравится - так и пусть его.
А поскольку сие явно поделка ну максимум в размере районо, то база большой не будет, производительность пофиг... сойдёт. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
serghd |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 136 Регистрация: 5.10.2009 Репутация: нет Всего: нет |
а, ну то есть по поводу ACL вы уже не против? Ибо предложений ещё не увидел)) |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
Да мне по барабану... хотите делать через определённое место - делайте. Или почитайте, как организовано хранение прав и вычисление эффективных прав в приличных файловых системах и в сервисах каталога. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
serghd |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 136 Регистрация: 5.10.2009 Репутация: нет Всего: нет |
если бы дело касалось c++, то на права пользователя я бы выделил тип int, и комбинировал бы их побитовыми операциями (предварительно описавши енум для работы с ними). Это наименее затратный способ. В плане БД ничего удобнее я ещё не придумал. Это сообщение отредактировал(а) serghd - 28.2.2012, 22:39 |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
Судя по тексту выше, у Вас MySQL. Ну так он распрекрасно умеет выполнять побитовые логические операции. Единственное ограничение - их результат всегда 64 бит беззнаковый, соответственно и права/маски рекомендуется хранить в том же типе. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Составление SQL-запросов | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |