У меня есть куча логических опций для таких вещей, как «приемлемые типы платежей», которые могут включать в себя такие вещи, как наличные деньги, кредитная карта, чек, paypal и т. Д. Вместо того, чтобы иметь полдюжины булевых в моей БД, я могу просто использовать целое число и присвоить каждому способ оплаты за целое число, например, такНедостатки использования целого числа в виде битового поля?
PAYMENT_METHODS = (
(1<<0, 'Cash'),
(1<<1, 'Credit Card'),
(1<<2, 'Cheque'),
(1<<3, 'Other'),
)
, а затем запросить конкретный бит в Python, чтобы получить флаг. Я знаю, это означает, что база данных не может индексировать по определенным флагам, но есть ли другие недостатки?
Почему я это делаю: у меня уже около 15 булевых элементов, разделенных на 3 разных логических «набора». Это уже много полей, и использование 3 таблиц «многие-ко-многим» для сохранения множества данных, которые редко меняются, кажется неэффективным. Использование целых чисел позволяет мне добавить до 32 флагов в каждое поле без необходимости вообще изменять БД.
(1) Как я могу использовать перечисление? В перечислении хранится * один * из нескольких вариантов (думаю, переключатели), а не несколько флагов (думаю, флажки). (2) Django tag == недостаточно контролирует, какой тип данных используется. – mpen
Извиняюсь, я не понимал, что вам нужен этот дополнительный контроль. Ваш пример (тип оплаты) - это использование типа радиокнопки, и я вскочил на это. Если вам нужно несколько флагов true за раз, перечисления действительно не работают. Я переписал свой ответ. – dimo414
Да ... Я думаю, это был плохой пример. В моем случае пользователи * могут * проверить более одного типа оплаты. Я не уверен, что бит-полем действительно необходимо. Мне очень легко работать с битами, если вы просто немного перепутаете. Однако было бы неплохо, если бы я мог давать имена для разных флагов, а не запоминать целые числа. – mpen