将多种数据类型存储到数据库中的最佳方法是什么

发布于 2024-11-02 16:26:11 字数 646 浏览 4 评论 0原文

我正在使用 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 语句来选择数据,例如 从 ID = 1 的值中选择 logtime,value,无需知道通道的数据类型。

但这是浪费内存,因为现在我将 int32 和 boolean 存储为 Decimal。我是数据库编程的新手,我想知道是否有人知道更好的方法来做到这一点?

I am designing a database using MSSQL server 2005 to store log values from different devices.
The datatype of the values can be boolean, int-32 or 64 bit-double

There will be a lookup table called channels:

ID(PK)      | int32

device_name | varchar(32)  

There will be a table called values to store the value. So boolean and int-32, double values will be casted to DECIMAL datatype.

ID(foreign key to ID@channels)  | int32

logtime                         | DATETIME
value                           | DECIMAL

The reason I do that is the end user can select data using a simple select statement on one table, such as
select logtime,value from values where ID = 1 without knowing the datatype of the channel.

But this is waste of memory, since now I stored int32 and boolean to Decimal. I am new to database programming, I wonder if anyone know a better way to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

记忆之渊 2024-11-09 16:26:11

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

或者,您可以使用 sql_variant 字段。 sql_variant 可以存储多种类型并保留类型元数据(类型、精度、小数位数)。

You can store 3 individual fields that are nullable. Two will have NULL value, the third will have the actual value (you can even enforce with a CHECK constraint that exactly one of the three is not-NULL). NULL values occupy no space. You can add a computed value that exposes the non-null value as a pseudo-column.

Alternatively you can use a sql_variant field. sql_variant can store multiple types and preserve the type metadata (type, precision, scale).

雨落□心尘 2024-11-09 16:26:11

这是 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)
)

This is an example of a CHECK constraint that ensures exactly one of the three 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)
)
我很OK 2024-11-09 16:26:11

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

By using 3 individual fields that are nullable, I created a view called mixedNumericView that
uses CASE to select the right column. I assume this way using CASE is inexpensive, am I right? Any alternative ways to do this? The log frequency can be up to every minute, I want to make sure this is the best way to select data.

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]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文