Есть ли способ использовать набор битов (или один байт) вместо набора логических значений? - PullRequest
0 голосов
/ 12 ноября 2018

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

Например:
* Флажки с 1 по 6, все непроверенные будут 00000000
* Флажок 1для 6 все проверенные будут 00111111
* Флажок 1 установлен, остальные не проверены будут 00000001
* Флажки 3 и 4 отмечены, остальные не проверены будут 00001100
* и т. д.

ДО РЕДАКТИРОВАНИЯ:«В конце будет один байтовый столбец, и для каждой строки будет установлена ​​/ отключена отдельная комбинация для флажков.»

ПОСЛЕ РЕДАКТИРОВАНИЯ: О, я вижу, я неясен.Я не имел в виду, что каждая возможная комбинация флажков хранится в таблице в разных строках, как таблица поиска.Это больше похоже на то, что вся таблица содержит информацию из пользовательской записи в формуле, а флажки, которые были проверены пользователем, являются лишь одним элементом формы (один столбец строки БД).Поэтому каждая пользовательская запись формы (строки) МОЖЕТ содержать отдельный байт в столбце флажков.Но если бы больше пользователей выбрали одинаковые флажки, байт в их строке, конечно, выглядел бы одинаково.

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

Есть ли лучший способ обработки значений флажков в БД?

Есть ли способ установить каждый бит байта вручную в C #?Кажется, я не могу найти объяснения, как это сделать.

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Вы можете сохранить один байт и сопоставить различные значения с проверяемыми флажками. IE: 00000000 ни одна кнопка не отмечена, 00111111 проверены все 6 кнопок. Это было бы большой дополнительной работой и не следовало бы хорошим принципам дизайна.

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

TLDR; не усложняйте это, просто сохраняйте значения как логические. преждевременная оптимизация - плохая идея.

0 голосов
/ 13 ноября 2018

Вы должны определить размер перечисления для байта и иметь атрибут атрибута FlagAttribute.

Вот пример кода для этого:

[Flags]
public enum BitFields : byte
{
    CheckBox_01 =      0,
    CheckBox_02 = 1 << 0,
    CheckBox_02 = 1 << 1,
    CheckBox_02 = 1 << 2,
    CheckBox_02 = 1 << 3,
    CheckBox_02 = 1 << 4,
    CheckBox_02 = 1 << 5
}

После того, как вы можете нас, как в C ++:

BitFields bits = BitFields.None;

bits |= BitFields.CheckBox_01| BitFields.CheckBox_01;
bits &= ~BitFields.CheckBox_04;

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

regrads

...