组合主键与单个整数主键大表

时间:2016-12-06 15:08:27

标签: sql-server database-design primary-key database-schema

我们有一个以下列方式存储大量测量数据的数据库。

  • 有一个名为" Instrument"的表,其中每个工具都有三列的主键[CustomerCode | LocationCode | InstrumentCode。那些colums类型为VARCHAR(4),因此完整的主键看起来像ABC | L001 | S001。这些代码对我们来说是有意义的,所以我们不能只改变整数。其他关系也在这些列上定义,但它们超出了这个问题的范围。该表包含大约200,000行代表不同的测量数据点。
  • 有一个名为" InstrumentLoggings"的表格。其中每个InstrumentLogging都有一个四列的主键[CustomerCode | LocationCode | InstrumentCode |时间戳。 Timestamp列的类型为DateTime。外键关系定义在"仪器"的前三列。表。然后是第五个VARCHAR(25)类型的字段,其中包含该时间戳的值。这个表保存了大约50亿条记录(这是多么令人发指,还是一点都不差?)。

这是当前情况的简短图表:

enter image description here

我们的问题是InstumentLoggings表增长到200GB以上,性能开始下降。备份和恢复也非常耗时。我们正在寻找将所有这些主键字段消除到InstrumentLoggings表中的单个字段的方法。

我可以简单地在Instrument表上添加一个额外的ColumnId列,并创建一个只有三个列的InstrumentLoggings表[InstrumentId |时间戳|值]其中主键由InstrumentId和Timestamp列组成?或者,在上一个想法中添加一个额外的列InstrumentLoggingId对性能有好处吗?

在下图中,您可以看到现在的日志记录表,以及两个备选方案。我对你的想法非常好奇,如果有任何其他选择,我现在也看不到......

enter image description here

1 个答案:

答案 0 :(得分:2)

看看Why use multiple columns as primary keys (composite primary key)。看起来我们用于新开发的共识是:单列主键,然后在必要时对所包含的复合键进行唯一约束。

这将是您使用InstrumentLoggingId的选项2。如果需要,您可以使用唯一约束或仅在InstrumentId / Timestamp上添加其他索引。

修改

这种选择的理由(基于经验 - 我不是训练有素的DBA: - )):

  1. ORM简单性和未来验证。如果将新列添加到业务键,则任何引用表都不必更改,代码更改也会更加简单。
  2. 独特性和打破平局。假设你使用InstrumentId / Timestamp作为你的PK,你在夏令时做什么...... UTC以避免重复?或者由于PK冲突导致设备出错并丢失数据?如果其中一个设备出错或者时钟同步不正确会发生什么......它可能会开始喷出重复的次数。拥有一个单独的唯一键,您可以通过按时间和该键进行排序并调整您想要调整的特定记录来找出可能存在重复项的内容。
  3. 我有第三个原因,但不记得它现在是什么,除非它与2号混在一起。如果我记得以后会编辑: - )
  4. 插入效果。 AFAIK使您的唯一(可能的身份)PK群集将在最后插入记录,而不是根据业务密钥插入和改组记录的物理顺序(例如,假设您使用了InstrumentId / Timestamp的群集PK,每个插入仪器1将在仪器2)的记录之前物理插入。我不知道发生这种情况的完整技术方法,但我知道有更多的开销,而不仅仅是插入结尾。