【问题标题】:When should I mark a column as the primary key?什么时候应该将列标记为主键?
【发布时间】:2016-07-05 14:23:35
【问题描述】:

我有一张这样的桌子:

// cookies
+----+---------+-------------------+------------+
| id | user_id |       token       |   expire   |
+----+---------+-------------------+------------+
| 1  | 32423   | dki3j4rf9u3e40... | 1467586386 |
| 2  | 65734   | erhj5473fv34gv... | 1467586521 |
| 3  | 21432   | 8u34ijf34t43gf... | 1467586640 |
+----+---------+-------------------+------------+

我想了几天。我想我不需要id 列。目前 id 列是 PK 并且我在 token 列上有一个唯一索引,以使其既独特又快速搜索。

现在我想知道,我可以从表中删除id 列并将token 列作为PK 吗?这正常吗?

说实话,到目前为止,我从来没有创建一个没有id 列的表(一直是 PK),所以我选择 token 列作为 PK 对我来说很奇怪.

【问题讨论】:

  • 你目前的结构没问题。
  • @GordonLinoff 在我目前的结构中,id 是 PK。可以吗?
  • 谷歌“自然键与代理键”。两者各有优缺点,哪个更适合您的系统取决于您的具体要求。
  • 如果自然键 (Id) 或代理键 (token) 都没有用作外键,那么使用代理键是一个有效的选项。它不会对性能产生太大影响。实际上,select * 可能会稍微快一点,只有一个代理键作为 PK(要选择的数据更少)。自然键的好处也是直观的,因为更容易看到记录的插入顺序(如果没有创建时间戳)。

标签: mysql sql database-design


【解决方案1】:

token 是一个宽varchar 而言,我会坚持使用您已经拥有的AI int PK。加入会更快。插入也是如此。更新速度可能相同,因为为什么要更新该列从而强制更改索引树。但是,通过不将宽 varchar 拖到索引树中,子关系的插入速度更快。

这也取决于偏好和可读性。至于可读性,这样的 varchar 几乎没有。它不像是“鞋子”这样的类别。这是一种悲惨的不可读的非人类形式。因此,就可读性而言,将token 用作PK 几乎没有争议。当然,有时它可能有点用处。

其他组合(多列索引)

当您开始将选择的 PK 与复合中的其他同伴列(您可能选择拥有的其他索引)结合起来时,瘦 int 将变得非常明显成为最佳选择。即使是中等规模的数据集。

【讨论】:

    【解决方案2】:

    在您发布此问题 3 年后,我觉得我必须说点什么。考虑到当其他与您有相同问题的开发人员难以对这种结构化表格做出决定时,会弹出此问题。

    话不多说,我想给你一个场景: 想象一下,您有一项任务要手动检查这两个值是否相同 value1 = 1223611547921cvdfrvalue2 = 1223611547921cvdfr... 你会怎么做?那么正确的步骤是从头到尾比较两个值之间的每个字符。然后*seconds 稍后当你完成时,你会说,这些值是相同的。

    但是,如果您要比较这两个值 value1 = 2value2 = 2,会发生什么?在一瞬间你说“他们是一样的”。

    计算机也会出现同样的情况,复杂的值会导致较长的比较或加载时间。通常这段时间很少引起注意,但是如果您运行像 Facebook 这样的网站,每次都有数十亿用户在线登录,会发生什么?

    所以SELECT user_id WHERE id = "1"SELECT user_id WHERE token = "dki3j4rf9u3e40..." 更快。

    虽然我通常会添加一个安全密钥,更像是一个 Guid 或令牌,在从服务器返回用户信息之前,它必须与请求中的 Id 一起传递。例如,您通过 id 获取用户,然后确认该用户具有与提供的相同的安全密钥。否则,返回 not-found。

    有时它是关于简单性,而简单性是现代编程的首选方式。我看到开发人员使用错误的方法,而他们一直在说“这是我的偏好”。通常你喜欢的东西会导致糟糕的编码,随着技术的发展,保持警惕并寻找现代设计模式很重要。

    【讨论】:

      【解决方案3】:

      一般来说,我们通常更喜欢表的 Id 作为主键,但主要说它不应该为空,并且应该唯一标识表的其余记录(列),所以如果你想使令牌作为主键您可以轻松制作它,但请确保它(Id)不应该依赖于其他表。 因此,每当您需要获取任何记录时,您都可以使用令牌轻松获取它。

      【讨论】:

        猜你喜欢
        • 2011-02-22
        • 2010-10-10
        • 1970-01-01
        • 1970-01-01
        • 2021-07-23
        • 2016-05-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多