2009-11-20 58 views
8

如果我不需要主键,我应该不向数据库添加一个主键?是否可以不使用主键当我不需要一个

+16

几乎没有任何情况下您不需要主键。基本上,如果表没有主键,它不是表 - 它只是一堆数据。 – 2009-11-20 15:33:00

+2

它可能与您的问题没有关系,但我确实需要问:*您为什么不觉得您需要一个?* – 2009-11-20 15:33:03

+0

您能否向我们提供有关您正在处理的情况的更多信息?主键并不总是必要的,但如果我们知道你在做什么,我们可能会给你一些更好的建议。 – TLiebe 2009-11-20 15:34:21

回答

13

主键唯一标识表中的一行。

索引和/或聚集的事实是一个物理实现问题,与逻辑设计无关。

您需要一张表来表达意义。

3

如果你不需要主键,那么不要使用主键。我通常需要主键,所以我通常使用它们。如果你有相关的表,你可能需要主键和外键。

+0

+1 short and sweet :) – James 2009-11-20 15:33:00

0

主键将始终帮助查询性能。因此,如果您需要使用“键”查询“外键”,或者将其用作查找,那么可以使用外键。

+1

我不明白,主键有助于提升性能吗?如果你不需要它们,你将不会使用它来查找记录。所以,没有任何好处。 – brainfck 2009-11-20 15:32:58

+0

那桌子会用什么?大多数情况下,我们需要表格来存储一些信息,并且您将从中查找值。 – 2009-11-20 15:35:19

+1

Luke101应该发布他的用例,如果他需要,我们会看到。 – brainfck 2009-11-20 15:37:07

2

是的,但只是在同样的意义上,如果你不打算在事故中不使用安全带是可以的。也就是说,在需要时付出很大的利益是很小的代价,即使你认为你不需要它,未来也会有机会。不同的是你很多更可能需要一个主键比进入车祸。

你也应该知道,如果你不这样做的话,某些数据库系统会为你创建一个主键,所以你不会在引擎中发生什么。

+5

我不同意。我拒绝佩戴安全带,因为它们阻止我充分接触到我的啤酒。 但我永远不会创建没有PK的表。 – 2009-11-20 16:11:29

+0

@Rev奇闻趣事,你需要的是一个更具战略意义的啤酒持有者。来吧2010年。 – JeffO 2010-03-08 17:56:54

40

你确实需要一个主键。你现在还不知道。

+6

我曾经以为我不需要主键或者...现在我知道更好。 – MiseryIndex 2009-11-20 16:07:10

+2

+1因为这最准确地反映了现实。我可以看到一个可能不需要一个但很少的情况。 – Murph 2009-11-20 16:10:45

+1

除了当你不需要主键时,你现在知道它。但这是一个不寻常的例子。更好地发挥它安全和错误的赞成PK。 – MarkPflug 2010-11-08 19:20:50

0

我不知道。我已经使用了几个表格,其中只有一行和一列。将始终只是单行和单列。没有外键关系。

为什么我要在这个主键上?

+0

为什么会有一个表? – 2009-11-20 16:44:09

+0

你需要存储一条信息?像系统宽泛的偏好?每个人都需要这些数据,但是你不想为了获得那一块数据而创建一个全新的东西。 – ElGringoGrande 2009-11-20 20:12:22

+3

啊。但是你确实想在这个表上使用主键。还有一个检查约束将主键限制为单个值。因为否则,你会在6个月后回来,发现有人为你添加了另一行,你的应用程序正在拾取哪一个是任意的... – 2010-03-04 15:46:54

0

主键主要是正式定义来帮助参考完整性,但是如果表格非常小​​或者不可能包含唯一数据,那么这是一个不必要的开销。 在表上定义索引通常可以用来暗示主键而不用正式声明。 但是,您应该考虑定义主键对于开发人员和架构生成或SQL开发工具非常有用,因为让元数据有助于理解,并且一些工具依靠此来正确定义模型中的主键/外键关系。

0

那么......

关系型数据库中的每个表都需要一个主键。正如已经指出的那样,主键是唯一标识记录的数据...如果您有一个连接两个不同表的NM表,但您可以唯一地识别出一个“ID”字段,那么您可能会失去一个“ID”字段通过您加入的两列中的值来确定记录。 (复合主键)

有一个表没有主键是针对第一范式,并没有任何的关系数据库

2

不,除非你能找到,“这个数据库的例子会做如果table_x没有主键,则工作得更好。“

如果不需要性能,数据完整性和规范化,您可以进行永不使用主键的争论,可能不需要安全性和备份/恢复功能,但最终,您会将您的大男孩裤子并加入数据库实现的真实世界

1

是的,一个表应该总是有一个主键...除非你不需要唯一地标识它中的记录(我喜欢做出绝对的语句,并立即与之矛盾)

什么时候你不需要唯一地标识表中的记录?几乎从不,我之前做过这样的事情,比如审计日志表。或删除,并不会受到任何限制。基本上结构化的日志。

0

你应该总是有一个主键,即使它只是在ID上。也许NoSQL是你所追求的(只是问)?

0

这很大程度上取决于你如何确定你不需要。如果您有一丝怀疑,请添加一个 - 稍后您会感谢您。一种指标,如果您存储的数据可能与您的数据库中的其他数据有关联。

我能想到的一种用例是一种日志类型的表格,您可以在其中简单地转存一个条目(以便稍后正确处理它们)。如果您要存储足够的数据以过滤出相关的消息(如日期),那么您可能不需要主键。当然,为此使用RDBMS是值得怀疑的。

相关问题