Хранение большого количества битов. Следует ли использовать несколько столбцов или один столбец битового поля? - PullRequest
8 голосов
/ 30 июля 2010

Я создаю таблицу User в моей базе данных.У меня есть около 30 или около того вариантов для каждого пользователя, которые могут быть «разрешить» или «запретить».

У меня вопрос, должен ли я хранить их как 30 bit столбцов или использовать один intколонка для их хранения и разбора каждого бита в моем приложении?

Также нашей базой данных является SQL Server 2008 и 2005 (в зависимости от среды)

Ответы [ 5 ]

11 голосов
/ 30 июля 2010

Я только что попытался создать две таблицы, одну с одним столбцом int и одну с 30-битными столбцами, затем добавил строку к каждой и просмотрел их с помощью Просмотрщика SQL Server Internals

CREATE TABLE T_INT(X INT DEFAULT 1073741823);

CREATE TABLE T_BIT(
X1  BIT DEFAULT 1,
/*Other columns omitted for brevity*/
X30 BIT DEFAULT 1
);

INSERT INTO T_INT DEFAULT VALUES;

INSERT INTO T_BIT DEFAULT VALUES;

Одна строка для таблицы с 30-битными столбцами

BITS

Одна строка для таблицы с одним столбцом int

INT

С точки зрения хранения SQL Server объединяет битовые столбцы, и данные хранятся в одинаковом объеме (желтый). В конечном итоге вы теряете 3 байта строки для растрового изображения NULL (фиолетового цвета), хотя его длина прямо пропорциональна количеству столбцов (независимо от того, допускают ли они пустые значения)

Ключ для полей (для версии int одинаковая цветовая кодировка для битовой версии)

Int key

5 голосов
/ 30 июля 2010

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

В таблице может быть более тысячи столбцов или дочерняя таблица для пользовательских настроек. Зачем ограничивать себя 30 битами, которые нужно анализировать в приложении? Представьте, какие изменения необходимо внести в приложение, если некоторые из этих параметров устарели или введено несколько новых.

4 голосов
/ 30 июля 2010

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

4 голосов
/ 30 июля 2010

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

1 голос
/ 31 июля 2010

Я согласен, что ваш дизайн должен быть должным образом нормализован, три таблицы пользовательских и пользовательских настроек и таблица мостов:

Пользователь:

Userid int

UserName varchar (X)

UserSetting :

Settingid int

SettingName varchar (X)

UserUserSetting:

ИД пользователя int

SettingId int

Бит IsSet

Между таблицей мостов будут * FK UserUserSetting и UserSetting и таблица User, а также уникальное ограничение контраста t UserId, SettingId в UserUserSetting

...