Подскажите альтернативу SET или правильную структуру

Ralph

Дикий столяр
Подскажите альтернативу SET или правильную структуру

Добрый день... Давно не могу корректно решить одну проблему.Имеем юзеров (количество неограниченно),имеем множество разделов сайта (тоже неограниченно и может изменяться как в сторону увеличения,так и уменьшения,пример:подфорум #5,подфорум #39,комната чата #17 и т.д.,они могут удаляться,создаваться новые) Каждый юзер может быть модератором или суперюзером в одном или нескольких разделах.Вот и возник вопрос хранения статуса
 

Ralph

Дикий столяр
Так как данные по своей сути битовые (да/нет),первая идея была:в таблице юзеров поля xsuperuser и xmoderator со структурой SET(раздел1,раздел2,. . . ,разделХ)
Но здесь возникло две проблемы: 1-ограничение в 64 бита 2. С независимой выборкой одного бита нет проблем,а вот с независимым изменением одного бита,не затрагивая остальные... Ведь как я понял,в UPDATE необходимо будет указать значения ВСЕХ битов,даже неизменяемых,что есть очень неудобно :(

-~{}~ 23.09.07 13:29:

В данный момент реализовано так:поля структуры TEXT 'форум5,чат8,обьявления59,) ,проверка бита-LOCATE('имяраздела,',имяполя),установка бита-CONCAT(имяполя,'имяраздела,'),сброс бита-REPLACE(имяполя,'имяраздела,',''),но что то мне это не особо нравится... Кто может подсказать что то лучше ?
P.S. Не забыл,просто не успел,работаю только с мобильного телефона,там ограничение текстового поля в 512 символов,да и удобство набора...
 

Ralph

Дикий столяр
Хотя бы потому,что поле все таки изначально было расчитано не для хранения битовой информации,и раз я не могу решить задачу,правильно используя бд,значит,скорее всего,у меня что то не в порядке с реализацией структуры :(
 

Андрейка

Senior pomidor developer
а какие запросы будут делаться по этой инфе?
является ли юзер модером?
является ли юзер админом? еще какие?
 

Ralph

Дикий столяр
В основном-1.обладает ли человек,зашедший в данный раздел,какими либо расш.полномочиями,2.Получить полный список людей,имеющих в этом разделе сайта доп.полномочия
Весь вопрос в множестве-я могу перенести эту инфу в таблицы разделов,но опять же придется там делать перечисление ID юзеров (те же уши,только в другой таблице)
 

Андрейка

Senior pomidor developer
а зачем "делать перечисление"? какое-то ограничение имеется на количество записей в таблице для одного юзера или одного раздела?
 

Ralph

Дикий столяр
Вы имеете в виду ограничение на количество полей ? Нет,таких ограничений нет,но 1.С былых времен осталась дурная привычка выжимать максимум компактности и как то дико для битового значения выделять целое поле
2.Так как я не знаю количество разделов,то не могу заранее при создании таблицы задать все поля,а где то я читал,что создавать/модифицировать тип поля после создания таблицы уже в процессе работы с ней есть не гуд
 

Андрейка

Senior pomidor developer
1,а для всех юзеров выделять целое поле, если админ всего один это нормально или компактно?
2, мысль не понята - а что если составить список всех админов во всех категориях в отдельной таблице?
 

Ralph

Дикий столяр
1.В том то и дело,что речь идет не о админе,и как у одного раздела может быть несколько модераторов,так и один человек может быть модератором нескольких разделов
2.Вы имеете в виду простейшую таблицу вида id_of_user INT + id_of_razdel_where_user_is_super INT + id_of_razdel_where_user_is_moder INT ? Блин,мне как то это в голову не пришло... Ну тогда наверно усложнятся запросы,а я еще не очень свободно обращаюсь со всякими там LEFT JOIN'ами и вложенными запросами :(
 

Андрейка

Senior pomidor developer
id_of_razdel_where_user_is_super INT + id_of_razdel_where_user_is_moder INT
не, наверное немного не так.. а если юзер - модератор в 2х категориях и админ в трех?

Ну тогда наверно усложнятся запросы
жысть штука сложная
 

Ralph

Дикий столяр
нет,моя структура не годится :( В вашем примере ничего страшного нет,просто будет 3-6 строк таблицы,где будет одинаковый id юзера,при селекте никаких проблем не возникнет,а вот при удалении статуса...Ну хоть намекните на структуру :(

-~{}~ 28.09.07 20:30:

Ладно,структура-флаг с ней,но все же для общего развития ответьте-правильно ли я думаю,что для поля SET надо получить SELECT значения всех битов поля и лишь потом,используя их,делать UPDATE ???
 

Mols

Новичок
нет не правильно.
Смотрите "Битовые функции/операторы"
Если нужно изменить какой то бит, то по большому счету запрос уровня сложности - "увеличить значение поля на 1." Только вместо оператора "+" используются другие операторы. Ну и аргумент естественно другой будет )))
Для установки или сброса бита достаточно битовых операторов "И" и "ИЛИ".
 

Ralph

Дикий столяр
Ну что-что,а битовые операции я знаю нормально-в 94 писал на ассемблере... :) Просто я думал что с полем сет так же просто,как с полями в таблице-не нужно знать их точное "местоположение"-достаточно помнить их имя... Придется,видимо,останавливаться на моем "неправильном" варианте :(
 
Сверху