database - 使用主键值字符 "1"而不是 int 值 1

标签 database architecture

嗯,我对数据库架构了解不多,但我真的不明白CTO的想法,但他坚持使用字符作为 我们使用的所有表的主键的列类型。 但是主键看起来仍然像这样 -> 1,2,3...等。它们是数字。 所以我使用 integer + auto_increment 来合成 PK

但是 CTO 说这很糟糕,因为他不能在 PK 上使用 LIKE 条件发出查询?!

  1. 使用字符进行 PK 是否可以,尤其是当您的 PK 是数字时?
  2. 在PK上使用like condition是否正确?

PS - 所以不是自动递增/触发,序列 CTO 发出选择查询获取 表中的最大值,他加 1,然后将该值转换为字符串 然后存储它。

编辑
感谢您的帮助 !但我需要让他相信这将是一场灾难。 我只被告知这(在这种情况下字符 4 PK)是个坏主意。 他的论点是……
1.角色PK不会占用太多空间。
2. 如果您使用 int 类型 PK,数据库查询优化器将不得不重新读取您的查询 因为你必须发出像
这样的东西 “从名字像'somename'的员工中选择*

从 id = 6 的员工中选择 *
因为 where 子句改变了。
他强烈主张我们使用的是
“从@columnName 喜欢@value 的员工中选择*”
他说这样,查询优化器会运行得更好。

我如何证明或给他一些正当理由让他改变主意?

谢谢你:)

最佳答案

您的 CTO 做出错误决定的原因有很多;让我介绍一些:

  1. 正如您所注意到的,您必须采取额外的步骤来生成新的自动递增 PRIMARY KEY。这是一种计算成本,而且还会增加它在未来某个时间点应用不一致的可能性。

  2. 一旦超过 4 个字符,字符将占用更多磁盘空间(换句话说,12345 比“12345”的存储成本低得多)。

  3. 如果您在主键上使用聚集索引(这是某些 RDBM 的默认设置),则字符排序与整数排序完全不同:

字符:1、10、101、11、12、13、14、15... 数字:1,2,3,4...

如果您将最大数值作为字符插入,那么您就是在粉碎索引。不是无法克服的问题,而是更多浪费的计算能力需要清理。

至于你关于在 PRiMARY KEY 上使用 LIKE 的第二个问题,我想不出你会这样做的原因;如果您需要 LIKE 的功能,通常是因为您已经为用作 PRIMARY KEY 的列分配了某种重要性,这意味着您需要将其公开给最终用户。如果是这种情况,那么我会使用代理自动递增数字主键,并向用户公开某种形式的 ID。

关于database - 使用主键值字符 "1"而不是 int 值 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14189306/

相关文章:

c# - 与 DBMS 中的索引相关的 "pinning"到底是什么?

java - 设计多模块 Java EE 应用程序

c++ - 线程体系结构问题 C++ 消息传递

architecture - 可视化编程语言的定义(如 BPMN 和 LabView)

java - 从 Java 运行 SQLscript 文件

mysql - 表增长后优化 MySQL 操作的最佳方法

iOS 应用提交 : missing 64-bit support

php - XML 有什么用,我应该什么时候使用它?

mysql - 使用 WHERE 子句的多表连接

mysql - 将数据从一个表复制到另一个表。数据库不同表结构不同