【问题标题】:Which column should I make the primary key?我应该将哪一列设为主键?
【发布时间】:2013-08-28 05:48:10
【问题描述】:

我正在做一张桌子

手机型号信息

+-------------+-----------------+------+-----+---------+----------------+
| Field       | Type            | Null | Key | Default | Extra          |
+-------------+-----------------+------+-----+---------+----------------+
| ID          | int(5) unsigned | NO   | PRI | NULL    | auto_increment |
| linktospecs | varchar(255)    | YES  |     | NULL    |                |
| name        | varchar(30)     | NO   | UNI | NULL    |                |
| company     | varchar(20)     | NO   |     | NULL    |                |
+-------------+-----------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)

在此表中,来自任何手机制造商的每部手机都只会出现一次,以及其他信息,例如其制造商名称和指向其规格的官方链接。我现在能想到的就这些了。

我想要的是,因为 name 列本质上是唯一的(两行相同的移动模型会很愚蠢),我希望能够使用它来索引,简单地说,因为在我的应用程序中,当用户搜索手机名称,我将使用 name 列从该表中检索所有其他列。

但是在许多示例中,我看到人们使用一个额外的简单 ID 列,该列会自动递增以将其保持为简单的主键。 所以,我的问题是,我是否需要保留 ID 列或者唯一的 name 列是否足以使用此表? 我是数据库和 SQL 的新手。

【问题讨论】:

  • 好吧,我会保留 ID 列,但这是一个漫长的争论。尝试谷歌surrogate vs primary key,找到你喜欢的哲学......
  • 我从网上关于 SQL 的教程中了解到,unique 表示一个列会有唯一值,所以我应该逻辑上只使用name 作为主键。但是我是 SQL 和数据库的新手,所以在我的东西上线之前,我需要一个外部的意见。
  • 使用 ID 是个好主意。然后,您可以更新任何其他字段,而不会断开与其他表的链接。一切都可以通过 ID 访问记录。
  • 即使您决定使用ID 列,如果您只需要其中的唯一值,请name 上应用UNIQUE 索引柱子。请记住,仅仅因为有一个主键(以任何形式),您还应该强制执行任何辅助键。这使您的数据库更干净。
  • @Damien_The_Unbeliever 我在创建表格时确实这样做了。这是这张表的show create table 转储:pastebin.com/3DBYpDSZ 这就是你说的对吗?编辑 - 实际上这就是我创建它的方式。与转储不同:pastebin.com/gCTkJmgB

标签: mysql sql database-schema rdbms


【解决方案1】:

将 ID 列作为主键始终是一个好主意,因为它永远不会改变。如果您需要更改电话的名称,并且名称是主键,那么之前对该电话的任何引用都将立即停止工作,因为主键值不再存在。另一方面,如果您对每个人都有一个唯一的 ID,则可以更改名称而不影响 ID,并且所有以前的引用都将保持有效。

也有可能两家不同的公司推出同名手机,在这种情况下,如果姓名是您的主键,那么您只能在其中一个上存储信息。

【讨论】:

  • 哦,是的,我没有意识到更改手机型号的名称,这不是很大的可能性,但它可能会发生,而且我不想破坏我的数据库(如果可能的话)
【解决方案2】:

主键意味着它将是一个聚集索引 - 您将搜索 name 列而不是 id 列,因此搜索应该比非聚集索引有所改善。 -- https://stackoverflow.com/a/3543719/2724079

【讨论】:

  • 所以你是说(name,company) 的复合键比使用ID 更好?这张表的记录不会超过 1000 条。
  • 我的意思是PRIMARY KEY(NAME,COMPANY)
【解决方案3】:

我更喜欢 ID,因为名称可能匹配诺基亚 500 和 HTC 500。您不能在型号名称中添加公司名称。在这种情况下,您可能会得到多个。在这种情况下,最好使用“ID”作为键。

如果您不喜欢将 ID 用作附加列,请使用公司和名称的组合作为键。

【讨论】:

    【解决方案4】:

    在我看来,使用ID 列会更好,好像在不久的将来,如果您想添加一些功能,其中包括外键(出现在其他表中的表的主键)概念然后使用ID可能只是您的任务以及您在各个方面的努力 (如果您需要更改手机的名称,并且名称是主键,那么之前对该手机的任何引用都将立即停止工作,因为主键值不再存在)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-21
      • 2014-10-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多