将多种数据类型存储到数据库中的最佳方法是什么
我正在使用 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 asselect 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以存储 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).这是 CHECK 约束的示例,它确保三个 IS NOT NULL 恰好之一
This is an example of a CHECK constraint that ensures exactly one of the three IS NOT NULL
通过使用 3 个可为空的单独字段,我创建了一个名为 mixedNumericView 的视图
使用 CASE 选择正确的列。我认为使用 CASE 的这种方式很便宜,对吗?还有其他方法可以做到这一点吗?日志频率可以达到每分钟,我想确保这是选择数据的最佳方式。
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.