Могу ли я сохранить 7 логических значений в 1 столбце? - PullRequest
1 голос
/ 03 марта 2011

Прямо сейчас у меня есть 7 столбцов в моей таблице MySQL:

monday
tuesday
wednesday
..

Все они булевы.Есть ли способ объединить эти логические значения в один столбец days, используя bitset / bitmap или что-то еще?

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

SELECT id FROM rows WHERE thursday = 1

Может быть несколько дней, но мне нужно запрашивать только один день за один раз.

Ответы [ 7 ]

4 голосов
/ 03 марта 2011

Есть ли причина, по которой вы хотите хранить их все в одном столбце?

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

Если это только 7 логических значений, почему бы просто не создать столбец, который может хранить от 0 до 2 ^ 8 и назначать каждый день немного?

3 голосов
/ 03 марта 2011

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

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

Вам лучше с 7-битными полями в таблице.

2 голосов
/ 04 марта 2011

Позвольте мне поделиться с вами своим опытом. У меня была похожая потребность хранить битовую маску прав приложений.

Это довольно просто реализовать, вы просто делаете поле стандартным целочисленным типом и AND с соответствующей битовой маской, чтобы проверить, установлен ли конкретный элемент, и используете OR, чтобы установить конкретный элемент.

Тем не менее, я сожалею об этом сейчас. Это на самом деле делает ваш код более сложным, и я усвоил сложный способ, что вы не сможете получить сколько-нибудь значимого использования индексов для этого столбца, что приведет к низкой производительности запросов. Примите мой совет и сделайте это как 7 отдельных битовых / булевых полей, особенно учитывая, что они не изобретают новые будни в ближайшее время, поэтому гибкость использования битовой маски в любом случае является пустой тратой. Умное решение для битовой маски не окупается.

0 голосов
/ 03 марта 2011

Я думаю, @Mike M прямо здесь. так, например, у вас есть таблица, которая может выглядеть так:

monday | tuesday | wednesday | thursday | friday | saturday | sunday

true   | false   | false     | true     |  false |  false   | true

это может быть представлено в одном столбце как:

 | days |
 --------
  1001001

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

0 голосов
/ 03 марта 2011

Установить тип данных MySQL будет хорошо. Используется хранилище , поскольку оно является растровым.

0 голосов
/ 03 марта 2011

вы можете использовать 1 байт для хранения ваших 7 битов и иметь оставшийся 1 бит, однако настоятельно рекомендуется просто использовать разные столбцы для каждого бита

0 голосов
/ 03 марта 2011

Я думаю, что вы можете сериализации здесь.Посмотрите на это, пожалуйста:

http://www.devshed.com/c/a/PHP/Working-with-MySQL-and-Sessions-to-Serialize-Objects-in-PHP/1/

...