码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 数据库设计中如何选择主键 (字符串或数值数据类型 )| Part 2


    作为主键的字符串与数值数据类型

    欢迎回到围绕关系数据库选择主键主题的系列。在第 1 部分中,我们介绍了自然主键和代理主键,并考虑了什么因素决定选择哪一种。今天的部分将探讨字符串和数值数据类型,看看哪种更适合作为主键。

    关系数据库中的字符串和数值数据类型

    字符串和数值实际上都是包含了几种不同数据类型的总称。对于初学者来说,字符串数据类型是一个通用的 IT 术语,传统上指的是一组字符序列,可以是文字常量,也可以是某种变量。在数据库方面,以 CHAR 类型表示的单个字符也归类为字符串。其他数据库字符串数据类型包括 VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM 和 SET。而数值数据类型既包括精确数值数据类型,例如 INTEGER、SMALLINT、DECIMAL 和 NUMERIC,也包括近似数值数据类型,例如 FLOAT、REAL 和 DOUBLE PRECISION。

    辩论

    关于哪种数据类型最适合做主键(PK)的建议在互联网上比比皆是。一些网站直接表示数值键几乎总是优于基于字符的键,而同等数量的网站则提倡使用字符串类型。同时,数据库供应商本身也不会建议使用哪种类型。他们只提供关于 PRIMARY KEY 约束的说明。它可唯一标识表中的每条记录并规定:

    • 主键必须是唯一值,不能含有 NULL 值。
    • 一个表只能有一个主键;在表中,主键可以由单个或多个列(字段)组成。
    • 主键值不应随时间而改变。

    就数据库供应商而言,只要你的主键满足上述标准,那么您就可以开始了。但这并不意味着一种类型可能比另一种优越。现在,让我们深入研究这些类型。

    支持数值类型

    当我第一次学习数据库开发时,有人告诉我,数值类型最适合作为主键,因为它们速度更快,又节约内存。我的第一个雇主联邦政府证实了这种观点,他们使用了数值主鍵,即使这意味着添加一个代理键

    有很多知名的参考网站都回应了这种观点。Mysqltutorial.org 在谈到 MySQL 时指出:

    因为 MySQL 处理整数速度更快,所以主键列的数据类型应该是整数,例如 INT、BIGINT。并且你应该确保主键的整数类型的值范围足以存储表可能有的行数。

    MySQL 在处理数字数据方面远非独一无二。关于 Oracle 主键的”另一页指出“主键通常是数字,因为 Oracle 处理数字的速度通常比任何其他数据类型更快。”

    他们甚至说主键中的数据应该是“无意义的”:

    有时,你可能希望对主键使用被认为是唯一的有意义的数据,例如社会安全号码(SSN)、车辆识别号码(VIN)、电子邮件和电话号码。但是,你不知道电子邮件或电话号码何时会更改或被其他人重复使用。在这种情况下,会产生很多数据问题。在数据库世界中,人工键被称为代理键,与自然主键相反。

    下周预告...

    到目前为止,数值主键似乎是最好的主键。但是,我们还没有听取支持字符串一方的意见。也许他们有一些使用字符串代替数值的充分理由。

    往期回顾

    Navicat 被投毒了 | 真相来了!

    盗版引发设备瘫痪

    Navicat 16.1 为OceanBase 社区版

    Navicat 成为信通院数据库创新实验室成员

    Navicat 学术伙伴计划 - 免费教育版申请

    Navicat 技术智库 - 实战演练与各类热门问题解答

    免费试用攻略 | Navciat 16 数据库管理工具

  • 相关阅读:
    ZigBee 3.0理论教程-通用-1-01:概述
    软件测试 接口测试 Postman测试工具 接口测试的流程 执行接口测试 接口关联 环境变量和全局变量 内置动态参数以及自动有的动态参数
    视频需求超平常数 10 倍,却节省 60% 的 IT 成本投入是种什么样体验?
    kotlin 之几个常见的内联函数(五)
    【网络协议】聊聊HTTPDNS如何工作的
    算法整理(四)
    激活函数总结(四十四):激活函数补充(NLSIG、EvoNorms)
    获取钉钉机器人的token及secret
    javaweb
    Redis数据持久化
  • 原文地址:https://blog.csdn.net/weixin_53935287/article/details/126775701
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号