Каков наилучший способ хранения нескольких типов данных в базе данных - PullRequest
3 голосов
/ 20 апреля 2011

Я проектирую базу данных, используя MSSQL server 2005 для хранения значений журнала с разных устройств.Тип данных значений может быть логическим, int-32 или 64-битно-двойным

Будет таблица поиска с именем channels:

ID(PK)      | int32

device_name | varchar(32)  

Будет таблица с именем values для хранения значения.Таким образом, логические и int-32 двойные значения будут приведены к типу DECIMAL.

ID(foreign key to ID@channels)  | int32

logtime                         | DATETIME
value                           | DECIMAL

Причина, по которой я это делаю, заключается в том, что конечный пользователь может выбирать данные с помощью простого оператора выбора для одной таблицы, например select logtime,value from values where ID = 1, не зная тип данных канала.

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

Ответы [ 3 ]

4 голосов
/ 20 апреля 2011

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

В качестве альтернативы вы можете использовать поле sql_variant.sql_variant может хранить несколько типов и сохранять метаданные типа (тип, точность, масштаб).

2 голосов
/ 08 апреля 2014

Это пример ограничения CHECK, которое гарантирует, что ровно один из трех не равен NULL

ALTER TABLE MyTable WITH CHECK
ADD CONSTRAINT CK_MyTable_ColumNulls CHECK(
(CASE
   WHEN col1 IS NOT NULL
      THEN 1
   WHEN col2 IS NOT NULL
      THEN 2
   WHEN col3 IS NOT NULL
      THEN 3
   ELSE
      500
END)
=
(CASE
   WHEN col3 IS NOT NULL
      THEN 3
   WHEN col2 IS NOT NULL
      THEN 2
   WHEN col1 IS NOT NULL
      THEN 1
   ELSE
      600
END)
)
0 голосов
/ 26 апреля 2011

Используя 3 отдельных поля, которые можно обнулять, я создал представление под названием mixedNumericView , которое использует CASE, чтобы выбрать правильный столбец. Я предполагаю, что использование CASE недорогое, верно? Есть ли альтернативные способы сделать это? Частота записи может быть до каждой минуты, я хочу убедиться, что это лучший способ выбора данных.

SELECT [ID], [logtime]
      ,'value' = 
      CASE
        WHEN [intValue] is not NULL  THEN [intValue]
        WHEN [bitValue] is not NULL  THEN [bitValue]
        WHEN [floatValue] is not NULL THEN [floatValue]
        ELSE NULL
       END
  FROM [dbo].[mixedNumericView]
...