Бинарные фишки =)

Redjik

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

Предположим у нас есть книга, у нее есть жанр, но у книги может быть несколько жанров, вот тут на помощь и приходит ... ________ (от вас название)...

Мы записываем в базу
фантастика -1
ужасы - 2
мелодрама -4
фэнтези - 8
о животных - 16

И так далее ... само собой я понимаю, что int накладывает ограничение в 32 параметра, но это не страшно...

Потом в базу у нас сохраняется сложением ... то есть книга о животных в жанре фэнтези и фантастики будет - 25...

И если нам нужны выборка по всем книжкам в жанре фэнтези то
из mysql мы это дело вытаскиваем where id^8 = 8...

И наша книга чудесным образом найдется.

Еще раз повторю, я понял принцип, но хочу закрепить - почитать...

Не обижусь на ссылку аля хочешь я поищю за тебя =))))
 

~WR~

Новичок
Да, собственно, вы уже все и описали) Так оно и работает.
Бывает полезно в том случае, если нужна какая-то быстрая выборка по комбинации признаков.

Типа, "найти все книги, у которых строго два жанра: фантастика и ужасы".
 

weregod

unserializer
и что будете делать, кргда жанры перестанут влазить в маску?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
из mysql мы это дело вытаскиваем where id^8 = 8...
Вот так вот индексы не будут работать, поскольку у тебя получается вычисляемое поле. В общем, баловство это, на самом деле. Ты же не на картридж от денди программу пишешь, что бы биты экономить...
 

Redjik

Джедай-мастер
и что будете делать, кргда жанры перестанут влазить в маску?
зачем искать негатив? Ветка как называется? Вопросы по теории програмирования... или я ошибаюсь...
Я увидел новый способо хранения информации - спросил на форуме, где о нем можно почитать... мой пример написан для того чтобы было понятнее, о чем я спрашиваю... этот пример, как и вопрос в целом к практике не имеет никакого отношения...

ЗЫ. тут не маска, а ОДЗ ... и оно до 32х ... а жу куда применить - я найду
 

Redjik

Джедай-мастер
Вот так вот индексы не будут работать, поскольку у тебя получается вычисляемое поле. В общем, баловство это, на самом деле. Ты же не на картридж от денди программу пишешь, что бы биты экономить...
Про индексы - согласен, но ведь можной пойти от обратного, проиндексировать все возможные варианты =)))) 32! (так вроде факториал обозначается) =)))

Вообще понимаю все минусы этой штуки, просто искал описание принципа работы...
 

Redjik

Джедай-мастер
кстати, вопрос в продолжение темы, но не совсем по ней...

как тогда лучше всего хранить подобную информацию (оставим этот же пример с книгами)
денормализация и выборка по LIKE?
 

Вурдалак

Продвинутый новичок
books, genres, book_genre.

Код:
SELECT b.* FROM books b JOIN book_genre bg ON b.id = bg.book_id WHERE bg.genre_id = 42
 

fixxxer

К.О.
Партнер клуба
а нахрена делать битмаску руками, если в мыскле она есть уже готовая, под видом set?
 

Moisha

специалист по муравьям
Если это вопрос по теории программирования, то чисто теоретически это называется "антипатерн" с точки зрения работы с БД.
Потому что как раз БД создано, чтобы грамотно решать подобные задачи, и абстрагировать их от программиста.
За меня тут всё товарищь fixxxer сказал.

А если практически, то модификация SET не любима MySQL. И там всего 64 варианта :)
Поэтому это решение может быть полезным. Но должно быть обоснование: зачем и почему.

Если снова возвращаться в чисто теоретическую канву: вопрос можно решать в классическом варианте через таблицу отношений.
 

DiMA

php.spb.ru
Команда форума
Постгрес умеет хранить в одном поле массив чисел и искать по диапазону внутри него. Быстрее раз в 10, чем несколько отдельных столбцов с OR. И не битовые флаги (как в SET), а любые числа.
 

fixxxer

К.О.
Партнер клуба
А сфинксом с атрибутами еще раз в 10 быстрее. :) Но, конечно, это не подходит, если нужны real-time обновления.
 

fixxxer

К.О.
Партнер клуба
ну это совсем другое устройство индекса, и тут я не уверен, что будет быстрее postgresql
 
Сверху