4

さまざまなデバイスからのログ値を格納するために、MSSQLServer2005を使用してデータベースを設計しています。値のデータ型は、boolean、int-32、または64bit-doubleです。

と呼ばれるルックアップテーブルがありますchannels

ID(PK)      | int32

device_name | varchar(32)  

値を格納するために呼び出されるテーブルがありvaluesます。したがって、booleanおよびint-32のdouble値は、DECIMALデータ型にキャストされます。

ID(foreign key to ID@channels)  | int32

logtime                         | DATETIME
value                           | DECIMAL

select logtime,value from values where ID = 1私がそうする理由は、エンドユーザーが、チャネルのデータ型を知らなくても、1つのテーブルで単純なselectステートメントを使用してデータを選択できるため です。

しかし、これはメモリの浪費です。これで、int32とbooleanをDecimalに格納しました。私はデータベースプログラミングに不慣れですが、誰かがこれを行うためのより良い方法を知っているのだろうか?

4

3 に答える 3

6

null許容可能な3つの個別のフィールドを格納できます。2つはNULL値を持ち、3つ目は実際の値を持ちます(3つのうちの1つがNULLではないというCHECK制約を適用することもできます)。NULL値はスペースを占有しません。null以外の値を疑似列として公開する計算値を追加できます。

または、フィールドを使用することもできますsql_variantsql_variant複数のタイプを保存し、タイプのメタデータ(タイプ、精度、スケール)を保持できます。

于 2011-04-20T02:17:59.390 に答える
2

これは、3つのうちの1つがNULLでないことを保証するCHECK制約の例です。

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)
)
于 2014-04-08T00:34:16.093 に答える
0

null許容の3つの個別のフィールドを使用して、CASEを使用して適切な列を選択するmixedNumericViewというビューを作成しました。このようにCASEを使用するのは安価だと思いますが、正しいですか?これを行う別の方法はありますか?ログの頻度は最大で1分ごとになる可能性があります。これが、データを選択するための最良の方法であることを確認したいと思います。

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]
于 2011-04-25T21:40:28.207 に答える