Что лучше контролировать состояние и выполнять запросы? Один столбец TINYINT, один столбец BIT (8) или восемь столбцов BIT (1) - PullRequest
2 голосов
/ 12 февраля 2011

Я притворяюсь, что использую набор состояний битовых карт (, как этот парень ) и делаю битовые запросы к моим таблицам. Какие типы столбцов я должен использовать? И как бы я выполнял выборки?

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

Итак, если у меня есть таблица со строками:

        |1234 5678|
|Id|Name|State    |
|01| xxx|0111 0001|
|02| yyy|1101 1001|
|03| zzz|0101 0011|

Я бы хотел вернуть строки, которые:

StateColumn 234 = 101 and StateColumn 8 = 1 
That would be => (0101 0001)

Я должен вернуть строки с Id 02 и 03.

Это хорошая идея для такого рода поисков, или я просто сумасшедший?

Ответы [ 2 ]

3 голосов
/ 12 февраля 2011

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

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

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

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

Мой совет: храните каждый фрагмент данных в отдельном столбце. Вот как база данных была предназначена для использования, и она будет использовать все преимущества базы данных. Это также оказывается наилучшим подходом во всех случаях, кроме самых необычных.

1 голос
/ 12 февраля 2011

Я хочу иметь возможность индексировать поля, делать присоединения и все остальное я бы делать с нормальным полем.

«Do joins» подразумевает, что вы надеетесь иметь возможность выбирать строки, в которых 8-й бит столбца State в одной таблице соответствует 8-му биту столбца состояния в другой таблице.

Не делай этого.

Создать столбец для каждого отдельного атрибута. Выберите правильный тип данных. Объявите все соответствующие ограничения целостности. Индексируйте правильные столбцы.

Сделайте это, и вы можете выбрать и присоединиться, пока коровы не вернутся домой.

...