写点什么

为什么总是需要无意义的 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:331036

评论

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

前端规范之路

白玉兰开源

大前端 开发规范

打造创新模型,博睿数据首倡服务可达的数据链DNA

博睿数据

轻松带你学习java-agent

华为云开发者联盟

Java Trace Java虚拟机 java-agent 挂载

从源码分析 MySQL 死锁问题入门

比伯

Java 编程 程序员 架构 计算机

一入爬虫深似海,从此早睡是路人

Thrash

0门槛成为“技术牛人”!星环科技线上分享课“星课堂”开播,快来报名,一探究竟

星环科技

人工智能 数据库 云计算 大数据 直播技术

软件测试——教育机构课程顾问常见黑话大全

程序员阿沐

程序员 软件测试 教育 机构 教育培训

2020年12月的面试经历:美团4面+字节4面(均已拿offer),面试真题分享

Java架构师迁哥

肝了15000字性能调优系列专题(JVM、MySQL、Nginx and Tomcat),看不完先收藏

北游学Java

Java MySQL nginx tomcat JVM

Redis为什么是单线程?高并发响应快?

Linux服务器开发

redis Linux服务器开发 网络io C++后端开发 单线程

一个诡异的MySQL查询超时问题,居然隐藏着存在了两年的BUG

CoderW

Java MySQL 数据库 程序员 互联网

2021年3月券商App行情刷新及交易体验评测报告

博睿数据

前端⼤规模构建演进实践

白玉兰开源

架构 大前端

华云大咖说 | 华云数据与数科网维携手共建国产云生态

华云数据

GitHub惊现!JVM G1GC的算法+实现,90张图+33段代码,你的面试专属!

Java架构师迁哥

简简单单才是真,初试 Svelte

LeanCloud

彻底搞懂ThreadLocal

千珏

Java 源码分析 多线程 ThreadLocal

博睿数据携数据链DNA创新理念,闪耀金融科技应用发展研讨会四川站

博睿数据

Golang 对象池

escray

学习 极客时间 Go 语言 4月日更

【转载】图形化系统开发组件X-Series(一)——XrossUnit介绍

赫杰辉

重磅来袭:Spring之RequestBody的使用姿势小结

学Java关注我

Java 编程 架构 技术 程序人生

智汇华云 | ArSDN打通软件定义数据中心的“任督二脉”

华云数据

家务活中的python协程

行者AI

协程 python学习

前端DDD总结与思考

白玉兰开源

大前端 DDD

如何深入的学习C语言

cdhqyj

编程 C语言 计算机 嵌入式

什么是Selenium?使用Selenium进行自动化测试

码界行者

DevOps selenium

知识分享:SQL注入的流程和步骤

Thrash

sql

混搭的美感|靠谱点评

无量靠谱

Redis的适用场景简单剖析

大数据技术指南

redis 4月日更

一文搞定 Flink Job 的运行过程

shengjk1

flink flink源码 flink源码分析

聪明人的训练(二十二)

Changing Lin

4月日更

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