不要使用业务键作为数据库主键

Mark Seemann这篇博客文章反对使用自然键作为数据库表中的主键,而是建议始终使用合成(人工)键。

什么是自然键
自然键(也称为业务键或领域键 )是数据库中一种唯一键,由存在并在数据库外部世界(即业务领域或论域)中使用的属性组成。[3]在关系数据模型中,自然键是超键,因此是关系中所有属性的 功能决定因素。

自然键有两个互补的用途:

  • 它为数据提供了唯一的标识方法
  • 它施加一条规则,特别是唯一性约束,以确保数据在信息系统中保持唯一性

自然键不同于代理键,后者在数据库之外没有任何意义,不基于现实世界的观察,也不旨在作为对所建模现实的陈述。因此,自然键提供了一定的数据质量保证,而代理键则没有。数据元素通常有多个键,其中任意数量的键可以是自然键或代理键。

原文观点:
我目前正在学习数据库和信息系统的本科课程。由于这门课程面向没有实际经验的学生,因此它明智地按照教学进度进行。为了教授数据库键,它从自然键开始。

从教学角度来看,这是有道理的,到目前为止,与我一起工作的年轻人现在提出使用自然键进行数据库设计。

我没有责怪任何人。你必须先学会爬,然后才能走路。

然而,这种情况让我思考以下问题:自然键是否是一个好主意?

让我们考虑一个例子。对于我们正在做的一个小项目,我们创建了一个世界 50 家最佳餐厅的数据库。我的同学建议采用这样的表格设计:

CREATE TABLE Restaurants (
year TEXT NOT NULL,
rank TEXT NOT NULL,
restaurantName TEXT NOT NULL,
cityName TEXT NOT NULL
);

当然,在这一点上,这个表格定义根本没有定义任何键。我对此并无怨言。毕竟,一个月前,学生们可能还没见过数据库表。

不过,根据课程设置,为 Restaurants 表定义一个由 restaurantName、cityName 和 year 组成的键是很自然的。假设名称和城市可以唯一标识一家餐馆。

在这个特殊的例子中,这个假设可能真的成立。到此为止。毕竟,数据集并不算大,而且对于该州中的餐厅来说,拥有可识别的名称非常重要。如果让我猜,世界上可能只有一家 Nobelhart & Schmutzig。

不过,一个好的软件架构师还是应该对基本假设提出质疑

  • 名字和城市是天然的关键吗?

很容易想象这不是。

  • 如果我们把关键字扩展到国家这个字段呢?

好吧,但如果我们在美国斯普林菲尔德开了一家名为 "China Wok "的餐馆呢?
很难说是独一无二的。

  • 如果再加上州呢?

可能还是不唯一的。

标识
确保唯一性只是自然键众多问题中的第一个。你可能很快就会得出结论,对于餐厅数据库来说,合成键可能是最好的选择。

那么 "自然 "的自然键呢?

  • 汽车底盘编号就是一个例子。这已经是一个不透明的数字,而且很可能来自某个数据库。
  • 那么个人身份号码呢?在丹麦,我们有 CPR 号码,据我所知,美国的社会安全号码也大致类似。

如果你正在设计的数据库已经包含了这样一个个人身份号码,你可能会倾向于使用它作为自然键。毕竟,它在其他地方已经是一个键了,所以可以保证是唯一的,不是吗?

  • 是的,这个身份号码可以唯一地识别一个人,但反过来就不一定了。
  • 一个人可能有不止一个识别码。至少当时间是一个因素时是这样。

例如,由于技术和历史原因,丹麦的 CPR 号码带有个人出生日期和性别等信息(按键不应该带有这些信息)。自 2014 年起,一项新的法律允许变性公民获得一个新的 CPR 号码,以反映他们所认为的性别。这样做的后果是,同一个人可能拥有不止一个 CPR 号码。也许不会同时拥有一个以上,但一生中肯定会拥有两个。

即使现有的键保证是唯一的,你也不能假定唯一性会导致双射。如果使用外部唯一键,就可能无法跟踪要跟踪的实体。

这不仅适用于人,也适用于汽车、自行车(也有底盘编号)、网卡等。

数据录入错误
最后,即使你已经找到了一个自然键,它可以保证是唯一的,并且可以跟踪你想要跟踪的实际实体,但还有一个反对在系统中使用外部定义键的理由:

  • 数据录入错误。

就拿我的汽车底盘编号来说吧:
虽然我住在哥本哈根,大部分时间都是步行或骑自行车在城里转悠,但我还是拥有一辆老爷车,以便在国内其他地方代步。在丹麦,汽车每隔一年就要接受一次强制性的官方检查,我一生中也经历过几次这样的检查。几年前,负责检查的机械师告诉我,我的汽车底盘编号有误。

这确实让我有点紧张,因为我买的是二手车,我突然担心事情并不像我想的那样。难道我无意中买了一辆赃车?

但机械师只是走到他的电脑前更正了错误。这时,一种不同的不安袭上心头。当你从事编程工作几十年后,你就会学会预见各种典型的故障模式。由于底盘编号是自然钥匙的一个明显候选项,我已经预料到更改这个编号要么被证明是不可能的,要么会产生各种连锁反应,最终导致官方记录不再承认这辆车是我的。

但事实证明,不管是谁制作了那款软件,他们都知道自己在做什么,因为机械师只是更改了底盘编号,仅此而已。现在这已经是五六年前的事了,我仍然拥有同一辆车,官方的所有权记录也从未出现过任何问题。

发现汽车底盘编号错误的机械师将其明确解释为笔误(数据输入错误)

经过几十年的编程生涯,我认识到数据迟早会出错。

  • 要么是笔误,
  • 要么是最终用户输入错误,
  • 要么是从外部系统导入时出现数据转换错误。
  • 甚至是同一系统内的数据转换错误,因为它要经历升级和迁移。

关键点:

  • 系统的设计应允许对数据进行更正。这包括外部键的更正,如底盘编号、政府 ID 等。
  • 这就意味着您不能在自己的系统中使用这些键作为数据库键

结论:
无论您认为自然键有多稳定,它都可能发生变化,从而导致更新异常和完整性问题。

自然键对于数据库设计来说从来都不是一个好主意,而应该始终使用数据库生成的合成(人工)键作为主键。

原文链接:https://www.jdon.com/74064.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/26235.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

调用华为云实现人证核身证件版(二要素)

目录 1.作者介绍2.华为云人证核身2.1什么是人证核身2.2应用场景2.3限制要求 3.流程介绍3.1调用API实现3.2调用SDK实现 1.作者介绍 高凡平,男,西安工程大学电子信息学院,2023级研究生 研究方向:数码印花缺陷检测 电子邮件&#xf…

下载NVIDIA官网的培训视频,生成中文字幕和PPT

下载NVIDIA官网的培训视频,生成中文字幕和PPT 一.[视频网站](https://www.nvidia.cn/on-demand/session/gtc24-s62129/)二.如何获取视频的原始链接三.下载视频的脚本【生成output.mp4】四.安装whisper环境【语音识别生成英文字幕】五.下载whisper模型六.生成英文字幕【输出merg…

最好用的搜题软件大学?8个公众号和软件推荐清单! #知识分享#知识分享#经验分享

今天,我将分享一些受欢迎的、被大学生广泛使用的日常学习工具,希望能给你的学习生活带来一些便利和启发。 1.彩虹搜题 这个是公众号 一款专供大学生使用的搜题神器专注于大学生校内学习和考研/公考等能力提升 下方附上一些测试的试题及答案 1、行大量…

版图快捷键

Ctrlf版图都不显示 Shiftf显示正常图层版图 顶层版图选中某一个block后,Shiftx进入下一层版图和对应的SCH,Shiftb返回上一层

几款免费又好用的项目管理工具(甘特图)

选择甘特图工具时,我们不仅要考虑工具的基本功能,还要考虑其易用性、团队协作能力、定制性以及与其他软件的集成能力。以下是几款好用的甘特图工具及它们的优点和不足,帮助你来选择适合自己的工具: 1、进度猫 特点: 任…

如何做好期货投资?

期货,这个词对于很多人来说可能还是个陌生的词汇,但是,随着经济的发展和人们对金融投资的需求增加,期货投资也变得越来越受到关注。那么,如何才能做好期货投资呢? 首先,了解期货的基本知识是非…

mesa编译器input识别问题2

概述 hlsl源码如下: struct PSInput {float4 position : SV_POSITION;float4 color : COLOR;float4 color2 : COLOR2; };PSInput VS(float4 pos : POSITION, float4 color : COLOR) {PSInput result;result.position pos;result.color color;return result; }fl…

电子设计新纪元:三品PLM系统在快速变革中的适应性

随着科技的飞速发展,电子行业正经历着前所未有的变革。产品生命周期的缩短、技术迭代的加速以及市场竞争的加剧,都对电子行业提出了更高的管理要求。在这样的背景下,传统的产品数据管理PDM和产品生命周期管理PLM系统显得力不从心。本文将探讨…

Python学习笔记速成版

数据容器 列表的方法-总览 具体操作 元组 定义 相关操作 注意事项 特点 字符串 总览 常用操作 特点 序列 定义 切片操作 Set集合 总览 定义 常用操作 注意事项 字典 总览 定义 常用操作 获取 嵌套 其他操作 summary 通用操作 字符串大小比较 函数进阶 多个返回值 多种传…

Docker面试整理-如何进行Docker镜像的构建和发布?

构建和发布 Docker 镜像是 Docker 使用中的一个常见任务,通常涉及编写 Dockerfile、构建镜像以及将其推送到镜像仓库的过程。以下是构建和发布 Docker 镜像的详细步骤: 1. 编写 Dockerfile 首先,你需要创建一个 Dockerfile,这是一个包含了一系列指令的文本文件,用来告诉 D…

香橙派 AIpro开发板深度测评

笔者从事无人机研发工作有四五年了,最近几年无人机的智能化是个热门的话题,现在的飞控系统已经非常的稳定。自动避障,AI识别这些功能也逐渐成了无人机的标配功能。飞控底层控制系统一般都是单片机,算力有限。因此和AI的结合势必要…

快准稳的文档解析工具,帮助构建性能优越的金融领域知识库问答产品

随着大模型应用落地速度加快,企业级应用相关技术模块日渐成熟,在各个行业领域,企业改革现有业务流程与生产方式、使用AI提高运作效率的可行性大幅度提升。其中,金融行业作为数据密集、更新快速的代表性行业之一,经常与…

大家都在谈数据要素,但数据交易市场惨淡,原因在哪?有解吗?

两周前,我在南宁参加中国计算机学会数据库战略研讨会,与会的专家、学者就数据要素的确权、定价、流通、安全、供需匹配等问题做了很多讨论。由于政府的推动,国家数据局的成立,当前数据资产的热度很高,尤其是大型央企、…

0117__ANSI C、ISO C、Standard 是什么关系

【C语言笔记】什么是ANSI C标准?-腾讯云开发者社区-腾讯云 ANSI C、ISO C、Standard 是什么关系?-CSDN博客 滑动验证页面 滑动验证页面

第十三章 组合模式

目录 1 组合模式介绍 2 组合模式原理 3 组合模式实现 4 组合模式应用实例 5 组合模式总结 1 组合模式介绍 组合模式(Composite Pattern) 的定义是:将对象组合成树形结构以表示整个部分的层次结构.组合模式可以让用户统一对待单个对象和对象的组合. 2 组合模式…

【数理统计】5-假设检验、参数与非参数检验

文章目录 一、前言二、参数检验和非参数检验2.1 卡方检验(非参数检验)2.1.1 单因素卡方检验例子2.1.2 双因素卡方检验 2.2 t检验(参数检验)2.2.1 单样本t检验(One-Sample t-Test)2.2.2 独立样本t检验&#…

Rust reqwest 简明教程

概述 reqwest 是 Rust 中一个非常流行和强大的 HTTP 客户端库,它提供了一种简单的方式来发送 HTTP 请求并处理响应。reqwest 支持阻塞和非阻塞(异步)请求,使其适合于各种不同的应用场景。在这篇博文中,我们将详细介绍…

【数据分析】统计学基础及Python具体实现

各位大佬好 ,这里是阿川的博客,祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 Python 初阶 Python–语言基础与由来介绍 Python–…

查找最佳分数Π

查找分子或分母不大于一亿的分数Π private static final int MAX_N 100000000;private static void findPIByDivider() {Log.d("findPI", "findPIByDivider start MAX_N" MAX_N);long curtime System.currentTimeMillis();double lastRet 1;int selec…

计算机网络 —— 数据链路层(VLAN)

计算机网络 —— 数据链路层(VLAN) 什么是VLAN为什么要有VLANVLAN如何实现IEEE 802.1Q 我们今天来看VLAN: 什么是VLAN VLAN(Virtual Local Area Network,虚拟局域网)是一种网络技术,它将一个物…