是否有理由不使主键未签名?

Cha*_*ugh 7 mysql database-design

我正在查看由比我更有经验的人创建的数据库创建脚本,我注意到主键设置为已签名。

所以像这样,

CREATE TABLE `exampleTable`
(
`pk` INT (11) NOT NULL AUTO_INCREMENT,
`content` TEXT
) ENGINE = INNODB
ROW_FORMAT = COMPACT;
Run Code Online (Sandbox Code Playgroud)

而不是这样,

CREATE TABLE `exampleTable`
(
`pk` INT (11) UNSIGNED NOT NULL AUTO_INCREMENT,
`content` TEXT
) ENGINE = INNODB
ROW_FORMAT = COMPACT;
Run Code Online (Sandbox Code Playgroud)

在我看来,通过将主键设置为无符号,可以使可能的值数量增加一倍,我是否遗漏了一些实际上对主键使用有符号 int 更好的东西

jch*_*ali 7

您可能会被告知的原因包括:

  • 怀疑无符号类型可能不可移植,即使在其他不可移植代码中,即使没有人考虑移植
  • 担心因为它偏离默认值,它有可能分散注意力,虽然不是绝对必要的,可能会导致程序员浪费时间或出错
  • 担心有人在将其复制到其他结构 (ETL) 时可能会忽略 unsigned 并且直到最终数字确实超过范围的另一半时才意识到错误;这可能需要数年时间并在很久以后爆发
  • 未表达的、模糊的担心某些事情可能会崩溃,无论是在处理不当时(在自己的代码库中),还是即使处理得当,如果使其工作的所有规则都不清楚(极端情况下,这可能包括对数据库引擎本身错误的恐惧)
  • 来自前辈、经理或只是喜欢挑战的人的挑战,他们能够通过挑战来阻止事情的发生。该小组可能会认为使用 unsigned 不在编码约定中,并坚持认为如果您希望将其添加到编码约定中,您会提出一个非常有力的理由。当你是唯一一个反对其他人说相反的人并且被第三个不在乎的人包围时,要证明你的理由是强大的并不容易。

或者,如果您主张使用有符号数的负半部分:

  • 不喜欢负数/混乱
  • 引用格式问题。'如果这些需要打印怎么办?他们会被正确打印吗?
  • 提出一个有效的问题:当 ID 分配过程已经用尽否定并达到 0 时会发生什么?ID=0 会像任何其他 ID 一样被应用程序和下游进程正确处理,还是他们会认为它很特别?

如果你在没有先建立良好声誉的情况下在团队中宣传不正常的事情,你就有可能冒着人们攻击你的倡议的风险,你的良好声誉将更难建立,你甚至可能获得坏名声,即使你什么都没做错误,或者说或没有造成任何困难,或者是任何出错的因素或共同因素。

如果你对此提出异议,那么权力也会攻击你,并让你受到控制,他们会说出“你的态度”这个词,你很快就会失望(“基于意见”是另一个关键词他们可能会在提及您或您的贡献时使用)。

问题不在于负数或无符号数,而是群体思维,以及制定规则的人、无论他们是谁以及他们是否真的知道“正常”的执行。这方面的数据库世界充满了,就像许多男性争夺卓越和权力的任何其他技术领域一样。

你看,如果这只是一个技术问题,它很容易解决。我不是说很容易分享,但至少很容易解决。它只需要你的技巧、注意力、细心和彻底。

不幸的是,当事情偏离平均水平时,即使它们在某种意义上“更好”,它们也会成为人类的“问题”。现在要解决它,你需要接受、耐心、谈判、说服,以及更多。比技术问题更难解决的事情。

背离规范有时非常好,但有时它们会动摇并检验个体差异、假设和假设以及团队的凝聚力和他们的信仰和文化,并成为影响团队前进方向及其成员的因素. 技术人员和人员之间的动态是复杂的,通常我们无法说出短期、长期什么更可取;我们甚至不会理解这一切或有相同的意见。

一个小小的技术问题、配方、选项或偏好可能只是什么,或者它可能成为冰山一角(对于雄伟的帆,或沉船),或者就像抚摸一盏精灵灯。我们都是一盒惊喜,你不知道门后面是什么,直到你按下那个按钮。


McN*_*ets 3

INT列可以容纳:4,294,967,296 个不同的值。

它们是否已签名并不重要。显然,您更喜欢处理正数而不是负数和正数。

如果您需要更多行,那么您应该将其更改为BIGINT.

看看MySQL文档:

11.2.1 整数类型(精确值)-INTEGER、INT、SMALLINT、TINYINT、MEDIUMINT、BIGINT

+---------+-------+-----------------+-----------------+
|  Type   | Bytes |   Minimum value |  Maximum value  |
+---------+-------+-----------------+-----------------+
| Signed  |       |                 |                 |
|   INT   |   4   |   -2147483648   |    2147483647   |
+---------+-------+-----------------+-----------------+
| Unsigned|       |                 |                 |
|   INT   |   4   |        0        |    4294967295   |
+---------+-------+-----------------+-----------------+
Run Code Online (Sandbox Code Playgroud)