为具有几个列的表组合选择一个好的主键,这些列是唯一的

时间:2011-11-10 12:09:00

标签: sql composite-primary-key

虽然我一直在查询SQL数据库一段时间,但我仍然是实际构建好表的新手。我经常遇到的一件事就是使用主键。

在一个表格中,我现在正在创建一些报警设备上的记录错误,我需要5列。 parkcode列唯一标识一个网站(尽管park列是atm。未使用)。然后会有一个serial列标识相关设备,以及一个包含错误代码的error。最后,记录错误时会有timestamp

每个站点都有几个不同的设备,一台设备可能会报告几个错误。更正错误后,将从表中删除该行。

因此,为了唯一地识别错误,我们需要检查parkcodeserialfault。 所有这些似乎都是基于可能运行的查询的索引的良好候选者。但是,将所有这些定义为组合主键似乎并不正确,它们毕竟是表中的几乎所有列!

我曾多次遇到类似问题,我从未觉得自己找到了一个好的解决方案。任何人都可以为这样的表建议一些好的做法,其中大多数(甚至所有)列都需要唯一标识一行?

1 个答案:

答案 0 :(得分:3)

很多人会告诉您在该表中添加一个ID号,并将其作为主键。

我不是那些人之一。

如果需要列{park,code,serial,fault}来唯一标识一行,从而防止重复,那么dbms需要知道这一点。您可以通过以下两种方式之一向dbms通知该要求。

  • PRIMARY KEY(停车,代码,序列,故障)
  • NOT NULL UNIQUE(停车,代码,序列,故障)

在某些情况下,使用较小的代理键(ID号)作为主键是有意义的。这并不能减轻你告知dbms真实情况的责任。 (使用NOT NULL UNIQUE (park, code, serial, fault)。)我不认为这适用于您的情况。