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

C# 正确使用带有时间戳数据的主键,c#,sql-server,database,C#,Sql Server,Database,我有一个表,它存储了来自传感器集合的时间戳记录,这些读数每天采集14400次。(每6秒一次) 共有4个传感器,它们共享其主数据表 目前,模式如下所示: id (int-PK) time (DateTime) sensor (int) reading (int) 这工作得非常好,我将主键设置为autoincrement 然而,拥有这个主键似乎很愚蠢,因为我从来没有提到过它——我是否最好使用时间和传感器的组合作为复合键 如果我使用了复合键,我想我的每行字节数也会减少?这是相关的,因为表的行数超过了

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

共有4个传感器,它们共享其主数据表

目前,模式如下所示:

id (int-PK)
time (DateTime)
sensor (int)
reading (int)
这工作得非常好,我将主键设置为autoincrement

然而,拥有这个主键似乎很愚蠢,因为我从来没有提到过它——我是否最好使用时间和传感器的组合作为复合键

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


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

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


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


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

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


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

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


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

此时,您使用的是。您正在评估是否要搬到

使用代理关键点比自然关键点具有优势,您可以在上一个链接中了解这些优势:

  • 不变性
  • 需求变更
  • 演出
  • 相容性
  • 一致性
  • (摘自维基百科)

    你可以在stackoverflow中查找其他一些帖子


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

    此时,您正在使用一个数据库。您正在评估是否要搬到

    使用代理关键点比自然关键点具有优势,您可以在上一个链接中了解这些优势:

  • 不变性
  • 需求变更
  • 演出
  • 相容性
  • 一致性
  • (摘自维基百科)

    你可以在stackoverflow中查找其他一些帖子


    但每种设计都不同于其他设计。作为数据库分析员,您应该评估项目的最佳决策。

    坚持设计,除了在PK中添加日期时间,我从来没有遇到过任何问题。当插入由于重复而开始失败时,您会希望没有这样做

    如果您想节省空间,请在
    传感器
    列中使用一个很小的int(您只有4个不同的值)。可能是一些更小的东西,用于
    读取
    ,我怀疑传感器能够记录一个int可以存储的2万亿个不同的值,很有可能你可以使用smallint或tiny 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
    

    坚持设计,除了在PK中添加日期时间,我从来没有遇到过任何问题。当插入由于重复而开始失败时,您会希望没有这样做

    如果您想节省空间,请在
    传感器
    列中使用一个很小的int(您只有4个不同的值)。可能是一些更小的东西,用于
    读取
    ,我怀疑传感器能够记录一个int可以存储的2万亿个不同的值,很有可能你可以使用smallint或tiny 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
    

    它是什么类型的数据库?(例如,它是Oracle、SQL Server吗?)MSSQL 2008 R2,尽管我不认为我的问题会太技术化,但我从来没有遇到过任何问题,除了在PK中输入日期时间。当您的插入由于重复而开始失败时,您会希望没有这样做。在这种情况下,重复数据的插入失败将是我的预期行为。只需检查您的DB引擎是否对日期时间和组合主键有任何限制。它是什么类型的数据库?(例如,它是Oracle、SQL Server吗?)MSSQL 2008 R2,尽管我不认为我的问题会太技术化,但我从来没有遇到过任何问题,除了在PK中输入日期时间。当您的插入由于重复而开始失败时,您会希望您没有这样做。在这种情况下,重复数据的插入失败将是我的预期行为。只需检查您的DB引擎是否对日期时间和组合主键有任何限制。我有一个基于传感器和时间戳(均为ASC)的聚集索引,你是说这也是个坏主意吗?关于索引的大小,这是个好主意。我想,既然他没有以任何方式使用PK作为外键参考,那就没什么区别了。但是如果空间是个问题,那么这是有意义的。我有一个基于传感器和时间戳(都是ASC)的聚集索引,你是这么说的吗