2010-09-21 75 views
1

我有一个包含2列和2条记录的表。 Column1永远不会改变,但Column2可能有改变的机会,但表格只有2条记录。列上的主键

列1

缺少

无效

列2

\\ SQLSERVER \目标\失踪

\\ SQLSERVER \目标\无效

我对这里有点困惑,因为没有Id列,所以我想把这张表放在主表上。那么哪一列我应该有主键?或者是否必须添加一个带有标识的列,并在主键上添加主键?

谢谢

回答

3

可供选择的候选人和主键的标准是:

唯一性,不可还原性,稳定性,简单和熟悉

从你所写的内容,Column1绝对是一个候选键。它具有全部5个上述标准。

Column2如果表中的两个值必须始终唯一,那么它们可能是候选键。但是,它不稳定,所以Column1是选择表(主键)的外键引用的更好的键。

您可以创建第3个数字列。由于将表限制为2行,因此新列是否具有系统维护的序列(标识属性)没有什么区别。

Column1已经熟悉了,新列不会。在话语的逻辑层面上,Column1和这个新专栏同样简单。从物理上来说,7个字符的字符串至少与64位数字一样大,所以32位数字占用的空间更少。但是,如果你选择添加一个新的列,由于物理大小,我会考虑一个char(1)列,'M'表示失踪或'I'表示无效,当占用时仍然有全部5个条件引用表中的物理空间更少。

+1

+1用于实际表达标准 – annakata 2010-09-21 13:24:57

4

是的。 PK列不能包含重复项。然而,它不一定是一个整数,但它需要是一个唯一的非空列。

2

恕我直言,你应该“总是”把一个id键,然后成为主键。

“always”在引号中,因为当不需要时可以争辩,但通常这是要走的路,当然可以肯定地说它是默认的方法,并且任何偏离它都应该是严格考察其好处。

有一个“自然”键的参数;也就是说,您将首要关键字放在保证唯一且永不改变的字段上。但是,根据我的经验,几乎所有事情最终都会改变,所以使用内置的默认自动递增ID更安全。

2

您不需要只有两个记录的表上的主键。主键意味着提高查询速度;有2条记录你几乎看不出有什么区别。

编辑: 为了回应评论,我想指出,没有主流数据库供应商强制使用主键。有一个原因是它们是可选的:除非功能需要主键,否则它不属于此类; YAGNI

+2

这可能是“真实的”,但对于任何真实的系统来说都是非常令人难以置信的。 – 2010-09-21 13:12:11

+0

我指的是这个具体案例。这个问题表明“表格将只有2条记录”。 – Saul 2010-09-21 13:18:07

+1

每张表都应该有一个关键字,并且出于数据完整性而不是性能的原因,即使是只有一行的表'CREATE TABLE Con​​stants(lock CHAR(1)DEFAULT'x'NOT NULL CHECK(lock ='x'),pi DECIMAL ...);' – onedaywhen 2010-09-21 14:24:02

0

在一张表格上,索引的创建实际上会减慢速度。索引被存储为二叉树,所以在这个小表上查找,除非它是聚簇索引,将导致比表扫描更多的读取。聚集索引实际上是“表”,但是在这样一张小桌子上,成本/收益再次“没有意义”。

我喜欢总是有唯一的行,但在这种情况下,只留下表未标记(知道为“堆”)实际上可能是最有效的。除非你需要强制约束,否则我不会在表格中引入索引。对它进行索引以查询性能不会为您在这个小表中做任何事情。

如果因为其他原因需要将PK放在桌子上,那么我会说把它放在第一列,因为它是最短的,不太可能的机会,它看起来像这张表基本上只用于作为一个查找反正......