码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 数据库设计中如何选择主键 (自然键或代理键 )| Part 1


    自然键与代理键

    身为数据库设计人员,你将面临的首要决定是你的表应使用哪种主键(PK)。如果你询问任何每天处理数据库的人,无论是数据库管理员、开发人员还是测试人员,你都会得到无数的意见和理由。使解决问题的障碍更加复杂的是,没有一种万能的解决方案。有鉴于此,本系列将介绍支持和反对不同类型 PK 的一些原因。在所有这些原因的某处,将会引导你找出 PK 的最佳类型,以满足你的组织需求。在第一部分中,我们将比较两种基本类型的 PK:自然键和代理键。稍后,我们将讨论是否使用数据库自动递增功能,以及哪些数据类型(如果有)是最好的 PK。

    自然键

    自然键是由表中已存在的一个或多个列组成的(例如,它们是数据模型中实体的属性),用于唯一标识表中的一条记录。由于这些列是实体的属性,因此它们本质上具有业务意义。以下是 Navicat Premium 16 的表设计器中有自然键的表示例。我们可以通过 “键”列中的钥匙图标轻松找到主键:

    查看一下数据,我们可以知道 productCode 是有业务义意的:

    代理键

    代理键(或合成键、伪键、实体标识符、非事实型键、技术键等!)是由系统生成的(GUID、序列、唯一标识符等)值,没有业务意义,用于唯一标识表中的记录。键本身也可以由一列或多列(即复合键)组成。 我们可以看到在同一个数据库的表中有一个代理键,定义了一个customerNumber 列作为表的 PK:

    虽然该列不是自动递增,但它是一个与客户实体无关的数字字段:

    作出决定

    那么,为什么一个表使用自然键,而另一个表使用代理键呢?

    产品有一个唯一的库存编号是很常见的,这是一个理想的PK。而添加一个额外的数字键只会浪费磁盘空间,并且几乎肯定需要在 productCode 列上添加一个用于搜索的额外索引。但另一方面,客户通常不会有一个唯一标识符。若你必须在数据库中辨识特定客户,可能需要一个长得惊人的列列表。因此,分配一个数字代理键来索引表中每一列通常要容易得多。

    自然键与代理键的总结

    在 “选择主键”的第一部分中,我们探讨了自然主键和代理主键,并考虑了什么因素决定选择哪一种。决定一开始使用自然键还是代理键是很重要的,因为你选择哪种主键也将有助于解答一些后续问题,特别是使用代理键。如果你想试用 Navicat 16,你可以在这里下载 14 天试用版。

    往期回顾

    Navicat 被投毒了 | 真相来了!

    盗版引发设备瘫痪

    Navicat 16.1 为OceanBase 社区版

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

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

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

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

  • 相关阅读:
    分布式事务解决方案Seata-Golang浅析
    【性能测试入门必看】性能测试理论知识
    [SWPUCTF 2021 新生赛]
    系统启动流程
    【Arduino TFT】Arduino uzlib库,用于解压gzip流,解析和风天气返回数据
    软考高项-规划风险应对
    基于FPGA的呼叫设备verilog开发
    各位帮我看看为啥冒红啊
    Kotlin 学习笔记(七)operator约定
    【wpf】 当用了数据模板之后如何获取控件的Item?
  • 原文地址:https://blog.csdn.net/weixin_53935287/article/details/126760521
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号