1、关系模型

数据被组织成关系,其中每个关系是元组的无序集合。

具有代表性的数据模型就是 SQL,基于关系模型,将数据组织成表(关系),其中每个关系为行(元组)的无序集合。

1.1 NoSQL

NoSQL 被解释为 Not Only SQL,不仅仅是 SQL,在几个原因的驱使下尝试推翻关系模型的统治地位:

  • 需要更好的伸缩性、更高的写入吞吐量;

  • 支持一些特殊的查询操作;

  • 根据动态性和表现力的数据模型。

但实际上一个用例的最佳技术可能不同于另一个用例的最佳技术选择,NoSQL 和 SQL 进行混合使用(混合持久化)。

1.2 对象关系不匹配

目前的开发基本都是面向对象编程,这就会导致在关系存储时存在 阻抗不匹配,也就是外键关联关系,例如在人员简历的对象中,一个人可能会有很多份工作(一对多),在进行数据库拆分的时候需要将工作拆分成独立表,从而使用外键来关联。即使有外部框架来进行转换,但是不能完全隐藏这两个模型之间的差异。

上述的关系用 Json 存储具有更好的局部性,Json 的数据全部组织在一起,检索一次即可,可以清晰将这种一对多的关系进行展示。

2、数据查询语言

  • 声明式查询语言:只需要告诉数据库需要什么结果,而不关心数据库怎么去实现,更适合于并行执行;

  • 命令式查询语言:就像编写代码一样,需要编写固定的逻辑来进行查询,限制执行方式,依赖于特定的执行顺序。

3、图数据模型

一个图由两种对象组成:顶点(vertices)、边(edges),为此,多种数据可以建模为一个图形,常见的有:

  • 社交图谱:顶点是人,边表示认识关系;

  • 网络图谱:顶点是网页,边表示指向的跳转;

  • 铁路网络:顶点是交叉路口,边表示道路。

3.1 属性图

  • 顶点(vertex):包含唯一标识符,一组出入边以及属性;

  • 边(edge):包含唯一标识符,起始和结束顶点,描述两个顶点之间关系的标签以及属性。

该种模型有三个重要点,一是任意两个顶点之间都可以用一条边相连,二是从任意顶点出发可以高效完成图遍历,三是一个图中可以依靠不同的关系存储不同的信息。

3.2 三元组

三元组以(主语谓语宾语)的形势进行存储,其中宾语可以为两类对象:

  1. 原始数据类型中的值,在此情况下三元组就相当于是一个属性值;

  2. 图中的另外一个顶点,这个时候的三元组就可以表示为一个边连接关系。