Мне нужно хранить битовый массив для каждой записи таблицы, поддерживая следующие операции:
Тестирование, если бит установлен, и установка бит (с использованием SQL)
Запрос и установка значения с помощью ADO 2.8 (не ADO.NET)
Индексирование (для того, чтобы воспользоваться функцией «индекс покрытия»)
Максимальное количество битов, которые должны храниться в этом массиве, является фиксированным, но может превышать 32 . То есть простой столбец int не всегда работает.
Из того, что я видел до сих пор, мои варианты:
- Используйте несколько столбцов int
- Использовать bigint (работает до тех пор, пока число битов <= 64)
- Используйте бинарный
- ?
Первый вариант будет работать, но потребуется немало рефакторинга в коде, который обращается к данным. Второй вариант - только временное облегчение, и из моих поисков пока я не слишком уверен, хорошо ли работает ADO с bigint . У меня нет опыта работы с двоичным файлом , и я не знаю других вариантов.
Какой тип данных вы бы выбрали, учитывая требования?
Если все, что вам нужно сохранить, это умеренное количество значений true / false, вы можете использовать
bit
тип данных.Внутренне SQL Server хранит
bit
столбцы, упакованные в байтовые «куски». Таким образом, до 8bit
столбцов в вашей таблице SQL сохраняет это как упакованный 1 байт; 9-16bit
столбцов в 2 байта и так далее.Не похоже, что вы приближаетесь к пределу столбца, так что это кажется довольно простым. И, конечно же, их точное разделение позволяет вам назвать столбцы для удобства чтения и получить все возможности индексации, которые вы обычно делаете (если флаги очень избирательны, отфильтрованные индексы могут быть полезны, если вы можете ориентироваться на 2008+).
Выполнение битовой упаковки самостоятельно сделает индексацию намного более сложной (возможно, вычисленные и проиндексированные
bit
столбцы для представления каждой позиции маски ... но тогда вам будет хуже по сравнению сbit
непосредственным использованием ).источник