正确使用带有时间戳数据的主键
本文关键字:数据 时间戳 | 更新日期: 2023-09-27 18:19:28
我有一个表,它存储来自传感器集合的带时间戳的记录,这些读数每天读取14400次。(每6秒)。
共有4个传感器,它们共享各自的主数据表。
目前的模式如下:
id (int-PK)
time (DateTime)
sensor (int)
reading (int)
这非常好用,并且我将主键设置为autoincrement。
然而,拥有这个主键似乎很愚蠢,因为我从来没有引用过它——使用时间和传感器的组合作为复合键会更好吗?
如果我确实使用了复合键,我想我每行的字节数也会减少吗?这是相关的,因为表格有超过10米的行,所以任何节省都是值得的
这看起来是双赢的,但我想看看这种方法会产生什么影响。
我的建议是坚持你现在的设计。
此时您正在使用代理项。并且您正在评估移动到自然关键点。
使用代理密钥比自然密钥有优势,您可以在上一个链接中了解:
- 不可变性
- 需求变更
- 性能
- 兼容性
- 均匀性
(来自维基百科)
你可以在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对数据模型的增强和更改变得更加容易。