мультиселекты в базе данных

kostroma

Новичок
мультиселекты в базе данных

Привет!

Есть некий параметр который предполагает возможность мультивыбора (обычный мультиселект в веб-интерфейсе).
Этот параметр хочется отображать в таблице базы данных в рамках одного поля.

Есть идея использовать биты как индикаторы было выбрано то или иное значение в мультиселекте или нет. Но эта идея упирается
в слишком ограниченное число бит которые можно использовать.

>>>>

Поясняю:
пусть у мультиселекта есть 8 значений
h g f e d c b a

Каждое значение соот-ет биту в 1 байтовом числе:
номера битов
8 7 6 5 4 3 2 1

Тип поля в базе данных - однобайтовый INT

Если пользователь выбрал h, b, a
то получаем значение
8 X X X X X 2 1 = 130 в десятичной системе или 82 в шестнадцатиричной
соот-но это значение и заносится в значения поля таблицы в базе данных

Но мультиселекты легко могут содержать по 100, 200, 300, 1000 значений.
Понятно что с такими числами нет возможности работать.

>>>>

Есть ли другие схемы решения подобной задачи: запихать значения мультиселекта в одно поле?
 

vasa_c

Новичок
Решением данной извращенной задачи будет использование поля не типа int, а какого-либо строкового.
Так же можно обратить внимание на ф-ию serialize().
 

SiMM

Новичок
> можно обратить внимание на ф-ию serialize().
Это будет не решение, а извращение.
 

kostroma

Новичок
В SET можно использовать только до 64 значений.

Может быть кто нибудь решал подобную задачу и пришёл к какому-либо алгоритму? Просто полагаю одним полем здесь не обойтись...

-~{}~ 18.08.06 19:29:

Естественно задача рассматривается в преломлении вопроса поиска.
 

SiMM

Новичок
Чем не устраивает?
> Решением данной извращенной задачи будет использование поля не типа int, а какого-либо строкового.
Поиск по маске довольно просто реализуется.
 

kostroma

Новичок
решение.
если значений свыше 64 то делать тип поля TEXT
и пихать значения чз разделитель а при формировании поискового запроса использовать LOCATE:

... LOCATE(multiselectfield, '234,') and LOCATE(multiselectfield,'567,) ...

Плюсы:
- любое количество значений,

Минусы:
- тормознутость

-~{}~ 18.08.06 19:54:

Извините невнимательно просмотрел пост vasa_c
 

sunchess

Новичок
А почему не использовать отдельную таблицу для селектов?
> Так же можно обратить внимание на ф-ию serialize().
Таким способ я делал но это гемор по коду, легче использовать отделюную таблицу + связи.
Преймущиства все выборки на уровне бд.
 

kostroma

Новичок
Как Вы полагаете можно хранить данные о множественном выборе в одном поле?
 

kostroma

Новичок
Это обсуждаемо. Я вовсе не настаиваю, но как мне кажется оперируя одним полем в одной таблице можно достичь:
- более высокой скорости работы
- более прозрачного кода который бы управлял данными

Ещё раз подчёркиваю, что с радостью бы выслушал мнение о более эффективных схемах хранения... но по моему на первом месте SET на втором строковой тип.
 

SiMM

Новичок
Что касается строкового - есть вариант хранить данные в виде двоичной строки фиксированного размера и выборки делать в виде
... multiselectfield REGEXP "^.{234}1.{332}1"
Будет ли это быстрее - выясняется экспериментально, при желании данные можно упаковать в 8 раз - правда регулярник составлять будет сложнее, и опять же стоит оно того, или нет - выясняется экспериментально ;)
 

Crazy

Developer
Я что-то путаю, или заметная часть предлагаемых решений будет делаться базой через table scan -- без индексов?
 
Сверху