正确使用带有时间戳数据的主键

本文关键字:数据 时间戳 | 更新日期: 2023-09-27 18:19:28

我有一个表,它存储来自传感器集合的带时间戳的记录,这些读数每天读取14400次。(每6秒)。

共有4个传感器,它们共享各自的主数据表。

目前的模式如下:

id (int-PK)
time (DateTime)
sensor (int)
reading (int)

这非常好用,并且我将主键设置为autoincrement。

然而,拥有这个主键似乎很愚蠢,因为我从来没有引用过它——使用时间和传感器的组合作为复合键会更好吗?

如果我确实使用了复合键,我想我每行的字节数也会减少吗?这是相关的,因为表格有超过10米的行,所以任何节省都是值得的

这看起来是双赢的,但我想看看这种方法会产生什么影响。

正确使用带有时间戳数据的主键

应避免使用复合索引,尤其是复合主键。索引更宽,这对性能(和内存使用率)不利。在我个人看来,使用复合主键也是一种糟糕的设计,因为没有比这更独特的单一方式来引用行了。

我的建议是坚持你现在的设计。

此时您正在使用代理项。并且您正在评估移动到自然关键点。

使用代理密钥比自然密钥有优势,您可以在上一个链接中了解:

  1. 不可变性
  2. 需求变更
  3. 性能
  4. 兼容性
  5. 均匀性

(来自维基百科)

你可以在stackoverflow中查找一些关于代理v.s.自然密钥的其他帖子。

但每个设计都不同。作为数据库分析师,您应该评估什么是您项目的最佳决策。

坚持设计,我从来没有遇到过在PK中放入日期时间的问题。当你的插入因为重复而开始失败时,你会希望你没有这样做。

如果您想节省空间,请为sensor列使用一个小int(您只有4个不同的值)。对于reading来说,可能是更小的值,我怀疑传感器能否记录一个int可以存储的2万亿个不同的值,很可能你可以使用smallint或微小int。

bigint   8 bytes, -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
int      4 Bytes              -2,147,483,648 to             2,147,483,647
smallint 2 Bytes                     -32,768 to                    32,767
tinyint  1 byte                            0 to                       255

在10M行上使用组合主键(或唯一索引)可以很容易地占用通过删除int PK(以及更多)获得的任何存储空间。此外,引用该表中的一行将变得更加困难。

我总是在任何表上保留一个int(或bigint,如果需要的话)PK。与其他数据相比,存储空间通常相对较小,并且有一种简单的方式来链接/引用行,这使WRT对数据模型的增强和更改变得更加容易。