写点什么

为什么总是需要无意义的 ID?

  • 2019-12-27
  • 本文字数:1072 字

    阅读完需:约 4 分钟

为什么总是需要无意义的 ID?

为什么这么设计(Why’s THE Design)是一系列关于计算机领域中程序设计决策的文章,我们在这个系列的每一篇文章中都会提出一个具体的问题并从不同的角度讨论这种设计的优缺点、对具体实现造成的影响。如果你有想要了解的问题,可以在文章下面留言。


标识符 ID 是我们作为软件工程师再熟悉不过的字段和概念了,我们经常打交道的 MySQL 就经常使用 ID 作为主键,ID 在软件工程甚至生活中都是一个非常常见的概念,我们为什么总是需要在业务或者系统中引入『无意义』的 ID 呢,在这里先来看两个有意义的 ID:


  • 日常生活中使用的 18 位身份证号;

  • 支付票据上面的 20191002XXXXXXX


上述的两个 ID 是否会有重复的可能?这对于今天想要分析和讨论的事情密切相关,在这篇文章中作者就会分析『为什么总是需要无意义的 ID』。

概述

我们首先需要解决的问题是 ID 到底是什么,ID 一般会被认为是 identifier 的缩写,在 Wikipedia 上我们能够找到这样的定义:


An identifier is a name that identifies (that is, labels the identity of) either a unique object or a unique class of objects, where the “object” or class may be an idea, physical [countable] object (or class thereof), or physical [noncountable] substance (or class thereof). The abbreviation ID often refers to identity, identification (the process of identifying), or an identifier (that is, an instance of identification). An identifier may be a word, number, letter, symbol, or any combination of those.


标识符(identifier)就是一个可以唯一识别一个对象或者物体的名称,被识别的对象可能是一些想法、物理上可数的对象或者物理上的不可数物质。它的前缀 ID 经常被用来表示身份、鉴定过程或者标识符,其中的标识符可能是一个单词、数字、字母、符号或者上述元素的任意组合。


在标识符的定义中我们需要特别注意的是『唯一』这个词,这个词是其定义中最关键的信息,标识符一定能够帮助我们识别唯一一个的对象或者物体,如果它不能实现这个作用,就不是标识符。唯一这个词帮助我们确定了标识符的特性,也为我们后面的分析过程铺平了道路。

设计

在这一节中我们将开始分析为什么很多业务或者场景中都需要一个唯一 ID,例如:消息队列、TCP 通信等场景,我们可以将这一问题归结到两个原因上:


  • 需要通过唯一的标识符对数据或者事件进行识别或者去重;

  • 只有无意义的标识符才会绝对唯一的,任何携带其他信息的标识都可能重复;


本文转载自 Draveness 技术博客。


原文链接:https://draveness.me/whys-the-design-meaningless-identifier


2019-12-27 11:33791

评论

发布
暂无评论
发现更多内容

liunx:进程概念

雪芙花

c c++ 10月月更

C++进阶之哈希(unordered_map/set的使用及其模拟)

雪芙花

c c++ 10月月更

【愚公系列】2022年10月 Go教学课程 036-类型断言

愚公搬代码

10月月更

【web 开发基础】PHP 快速入门(7)-PHP 运算符之比较运算符详解

迷彩

10月月更 PHP基础 比较运算符

趁年少,多读书

暮春零贰

读书笔记 10月月更

“程”风破浪的开发者 | 关于web3.0远离银手镯比什么都重要!

王中阳Go

区块链 NFT Web3.0 10月月更 “程”风破浪的开发者

阿里云无影向RPA开闸,金智维、影刀、弘玑已落地|生态商机

B Impact

git fetch&pull讲解 | Git

Appleex

git

Web3.0杂谈-#008(55/100)

hackstoic

Web3.0

极客时间运维进阶训练营第一周作业

老曹

“程”风破浪的开发者|区块链与Web3.0辨析

timerring

区块链 Web3.0 10月月更 “程”风破浪的开发者 Web2.0

JS事件,你真的懂吗(捕获,冒泡)?

乌龟哥哥

10月月更

中东地区被低估,沙特偏好企业服务和云,新加坡稳定,东南亚复杂|出海

B Impact

一起学习 Go 语言设计模式之设计模式概述

宇宙之一粟

设计模式 Go 语言 10月月更

微服务的常见架构方式

乌龟哥哥

10月月更

谈谈曾经做的一个测试报告平台(1)

MegaQi

Python 测试平台 10月月更

再聊加班的感受

李印

成长感悟

数据湖(八):Iceberg数据存储格式

Lansonli

数据湖 10月月更

“程”风破浪的开发者 | 基建及团队建设的方法论

甜点cc

团队管理 学习方法 基建 “程”风破浪的开发者

golang中的字符串

六月的

golang 字符串

【ArchSummit】众安金融微服务架构演进实战

小明Java问道之路

架构 微服务 全球架构师峰会 ArchSummit 10月月更

[HCTF 2018]WarmUp题解(较为详细的)

w010w

Web CTF 每日一题 10月月更

ubuntu使用apt-get安装docker

忙着长大#

Ubuntu20.04

AfterShip 国际化获客冷启动经验:痛点、借力、连接

B Impact

消息推送渠道那么多,该怎么设计消息中心?

产品海豚湾

产品经理 产品设计 消息系统 产品架构 10月月更

2022年中国数字疗法市场洞察

易观分析

医疗

如何提高Docker容器的安全性

乌龟哥哥

10月月更

docker数据卷使用

忙着长大#

,docker

云计算商业周期超过其他产业,技术的天花板是商业机遇

B Impact

C++精通之路:红黑树的应用(模拟实现map/set)

雪芙花

c c++ 10月月更

HashMap 源码分析(五)

知识浅谈

HashMap底层原理 10月月更

为什么总是需要无意义的 ID?_语言 & 开发_Draveness_InfoQ精选文章