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

  • Автор темы Автор темы Ralph
  • Дата начала Дата начала

Ralph

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

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

-~{}~ 23.09.07 13:29:

В данный момент реализовано так:поля структуры TEXT 'форум5,чат8,обьявления59,) ,проверка бита-LOCATE('имяраздела,',имяполя),установка бита-CONCAT(имяполя,'имяраздела,'),сброс бита-REPLACE(имяполя,'имяраздела,',''),но что то мне это не особо нравится... Кто может подсказать что то лучше ?
P.S. Не забыл,просто не успел,работаю только с мобильного телефона,там ограничение текстового поля в 512 символов,да и удобство набора...
 
Хотя бы потому,что поле все таки изначально было расчитано не для хранения битовой информации,и раз я не могу решить задачу,правильно используя бд,значит,скорее всего,у меня что то не в порядке с реализацией структуры :(
 
а какие запросы будут делаться по этой инфе?
является ли юзер модером?
является ли юзер админом? еще какие?
 
В основном-1.обладает ли человек,зашедший в данный раздел,какими либо расш.полномочиями,2.Получить полный список людей,имеющих в этом разделе сайта доп.полномочия
Весь вопрос в множестве-я могу перенести эту инфу в таблицы разделов,но опять же придется там делать перечисление ID юзеров (те же уши,только в другой таблице)
 
а зачем "делать перечисление"? какое-то ограничение имеется на количество записей в таблице для одного юзера или одного раздела?
 
Вы имеете в виду ограничение на количество полей ? Нет,таких ограничений нет,но 1.С былых времен осталась дурная привычка выжимать максимум компактности и как то дико для битового значения выделять целое поле
2.Так как я не знаю количество разделов,то не могу заранее при создании таблицы задать все поля,а где то я читал,что создавать/модифицировать тип поля после создания таблицы уже в процессе работы с ней есть не гуд
 
1,а для всех юзеров выделять целое поле, если админ всего один это нормально или компактно?
2, мысль не понята - а что если составить список всех админов во всех категориях в отдельной таблице?
 
1.В том то и дело,что речь идет не о админе,и как у одного раздела может быть несколько модераторов,так и один человек может быть модератором нескольких разделов
2.Вы имеете в виду простейшую таблицу вида id_of_user INT + id_of_razdel_where_user_is_super INT + id_of_razdel_where_user_is_moder INT ? Блин,мне как то это в голову не пришло... Ну тогда наверно усложнятся запросы,а я еще не очень свободно обращаюсь со всякими там LEFT JOIN'ами и вложенными запросами :(
 
id_of_razdel_where_user_is_super INT + id_of_razdel_where_user_is_moder INT
не, наверное немного не так.. а если юзер - модератор в 2х категориях и админ в трех?

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

-~{}~ 28.09.07 20:30:

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