本篇来聊聊数据存储的内容,看看程序世界里数据是以什么形式存在的?为了描述数据并把它们和这个现实世界关联起来我们一般都是如何去进行表达的?最后通过我们习惯的表达方式再结合数据结构是如何存储下来的?
在进行技术方案设计的时候,第一步大多都是围绕当前的业务模型先进行抽象建模,通过数据模型先表述清楚业务形态,因为万事万物都是数据各种形态的集合。一言以蔽之,数据建模就是在设计合理的数据关系、使用合理的存储方式让程序世界能够高效、灵活地支持业务世界的运转。
站在不同的视角可以给数据进行多种分类,这里我们使用从原子到组合、从简单到复杂逐层递进剖析。
拿找工作时填写简历作为例子,每个人的名字、性别、年龄等都是最原子的数据表达,因为每个字段它都没有二义性,即使填写内容的名字可能重复、性别相同、年龄相仿也不影响它表达的就是你叫什么、是男还是女、多大岁数。
| 优缺点 | 描述 | 举例 |
|---|---|---|
| 优点 | 原子唯一性,理解成本低,数据表达的原子基石 | 数据库中符合三范式设计的字段;Redis键值对设计中的Key;Map结构中Key |
| 缺点 | 表达单一,承载能力不丰富 | - |
凡事都有两面性,如果只是在导出一个学校班级人员的姓名、成绩等简单数据就可以搞定,数据最本质的工作就是记录、传递、存储信息,而现实世界是丰富多彩错综复杂的,需要数据有更多的描绘能力以适配,但是无论多复杂的数据结构,都来源于最朴实无华的一个个小原子体。
再回到写简历的例子上,工作经历信息就是原子要素组合而来,因为工作经历里常见的会包含工作类型(实习/兼职/正式)、公司名称、工作起始时间等等,它是需要其他字段来做支持的,所以这里的工作经历是一个组合性的概念。
| 优缺点 | 描述 | 举例 |
|---|---|---|
| 优点 | 支持复杂多样的数据结构,描绘表达能力丰富 | Redis中有序集合、字典表等;JSON存储结构 |
| 缺点 | 结构复杂,有理解成本,对存储、查询、变更有性能诉求 | - |
数据的组合性更具有现实意义,通过组合我们可以建立起形态各异的模型关系,根据每一种模型关系的特点应用在不同的具体场景中,它拥有自配的数据存储方式和数据查询方式,是日常开发中涉及使用最多的。
数据结构如何分类?
在数据结构中根据数据关系、数据集合的不同一般划分四类:集合结构、线性结构、树形结构、图状结构,它是认识数据关系的基石,是进行数据建模的前提。
| 数据分类 | 数据特点 | 数据结构 | 举例 |
|---|---|---|---|
| 集合结构 | 数据同属一个类型,与其他数据无任何关系 | 集合 | 仓库中的商品 |
| 线性结构 | 数据之间存在一对一关系 | 数组、链表、队列、栈 | 编组的火车、叠放的盘子、买票的人群 |
| 树形结构 | 数据之间存在一对多关系 | 二叉树、红黑树、多叉树 | 家族谱、河流脉络、组织机构关系 |
| 图状结构 | 数据之间存在多对多关系 | 图 | 网络链路、社交关系 |
数据模型
数据模型一般有层次模型、文档模型、键值模型、图状模型、关系模型等,而关系模型是业务开发中涉及使用最多的,又可以分为一对一、一对多、多对多的逻辑关系。梳理清楚业务数据之间的关系,才能进行更上游的架构设计与流程驱动。