Многобитовое поле базы данных - PullRequest
2 голосов
/ 28 ноября 2008

Я использую базу данных MSSQL и хотел бы создать столбец, который имеет только 4 возможных значения. Есть ли способ определить 2-битный столбец? Я вижу битовый тип данных, а затем наименьший - tinyint, который составляет 1 полный байт.

Если такого поля нет, мне было бы интересно узнать, почему нет.

Спасибо.

Ответы [ 6 ]

3 голосов
/ 28 ноября 2008

Какое у вас отношение к размеру поля? Способ реализации домена поля должен использовать ограничение внешнего ключа (MSSQL должен иметь это).

2 голосов
/ 28 ноября 2008

Не вижу причины для такого поля.

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

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

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

Обновление: Хотя да, ограничение "enum" было бы полезно в MSSQL. Но это опять-таки немного отличается от простого 2-битного поля.

1 голос
/ 28 ноября 2008

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

, а затем добавьте вычисляемый столбец, который генерирует значения (0-3), которые соответствуют значениям 2-битных столбцов ....

CREATE TABLE [dbo].[testTable](
    [colA] [bit] NOT NULL,
    [colB] [bit] NOT NULL,
    [CalcCol]  AS (case [colA] when (1) then (2) else (0) end+[colB])
) ON [PRIMARY]

если вам нужен другой набор из четырех значений, то 0-3 просто поместите их в формулу расчета:

CREATE TABLE [dbo].[testTable](
    [colA] [bit] NOT NULL,
    [colB] [bit] NOT NULL,
    [CalcCol]  As 
         (Case ColA 
             When 0 Then Case ColB WHen 0 Then ValueA Else ValueB End
                    Else Case ColB WHen 0 Then ValueC Else ValueD End
             End)
) ON [PRIMARY]

Единственная проблема заключается в том, что вычисляемый столбец не может быть «записан» напрямую - вам нужно записывать отдельные битовые поля в отдельном коде ... как

Update TestTable Set 
  colA = Case When Value In (ValueA, ValueB) Then 0 Else 1 End, 
  colB = Case When Value In (ValueA, ValueC) Then 0 Else 1 End 
Where ... 
1 голос
/ 28 ноября 2008

Я с этим обожаю.

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

Что касается типа данных, smallint настолько мал, насколько вы собираетесь получить, SQL Server действительно не предназначен для хранения отдельных бит данных и манипулирования ими, но это можно сделать с помощью битовых операторов в двоичных столбцах, но даже самый маленький из них намного больше на диске. Столбец SQL Server Bit также необычен, так как имеет 3 возможных значения (1, 0 и ноль).

1 голос
/ 28 ноября 2008

То есть, вы говорите, что у меня должен быть только внешний ключ к другой таблице, содержащей мои четыре значения?

У меня нет серьезных проблем с этим. Я просто не вижу смысла давать полный байт чему-то, что требует всего 2 бита. Мне более любопытно узнать причины, по которым поле переменной битовой длины не существует.

0 голосов
/ 28 ноября 2008

Если ваша база данных не хранится на дискете, я бы ее не потел. Воспользуйтесь советами остальных здесь и приступайте к созданию остальной базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...