【问题标题】:What is the best way to store multiple data type into database将多种数据类型存储到数据库中的最佳方法是什么
【发布时间】:2011-08-09 03:19:20
【问题描述】:

我正在使用 MSSQL server 2005 设计一个数据库来存储来自不同设备的日志值。 值的数据类型可以是 boolean、int-32 或 64 bit-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 不知道频道的数据类型。

但这很浪费内存,因为现在我将 int32 和 boolean 存储为 Decimal。我是数据库编程新手,不知道有没有人知道更好的方法?

【问题讨论】:

  • 磁盘空间很便宜 - 我认为您的初始方法(转换为十进制)是最佳的,无需摆弄空值或不同的字段。

标签: sql sql-server database types mixed


【解决方案1】:

您可以存储 3 个可以为空的单独字段。两个将具有 NULL 值,第三个将具有实际值(您甚至可以使用 CHECK 约束强制三个中的一个不为空)。 NULL 值不占用空间。您可以添加一个计算值,将非空值公开为伪列。

您也可以使用sql_variant 字段。 sql_variant 可以存储多种类型并保留类型元数据(类型、精度、比例)。

【讨论】:

  • 我觉得第一种方案比较好,不知道sql_variant会给我带来什么样的开销。
【解决方案2】:

这是一个 CHECK 约束的示例,它确保三个 IS NOT 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)
)

【讨论】:

    【解决方案3】:

    通过使用 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]
    

    【讨论】:

    • 您可以在表本身上使用计算列:ALTER TABLE ... ADD [value] AS COALESCE(IntValue, COALESCE(bitValue, floatValue))
    • @Remus - 大概是COALESCE(IntValue,bitValue, floatValue)
    • @Martin:我想现在是我了解 coalesce 接受开放参数列表的最佳时机......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 2011-07-12
    • 2016-08-09
    • 2020-04-08
    • 1970-01-01
    • 2016-09-30
    • 2012-07-31
    相关资源
    最近更新 更多