持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情
1. 什么是图数据库
我们最常用的数据库是关系型数据库,例如MySQL。在关系型数据库中,我们能非常方便的以图表的形式存储数据。
但是,在特定的场景下,例如表示某个帖子的点赞信息或者某个用户的关注者信息,关系型数据虽然能完成存储的要求,但是在信息查询的时候,会导致问题复杂化,例如我们需要查询关注“树獭叔叔”这一用户的关注着,并且按照关注时间排序,就会涉及到多表join
的联合查询。
图数据库能方便高效的表示这一关系并且完成查询过程,我们可以将“树獭叔叔”与他的关注者的信息建立成有向有权图的形式:
- 在图结构中,用户以点的形式表示,我们可以在点的数据结构中存储需要的信息
- 另一个重要的结构是边,它可以存储我们需要的信息(例如创建时间)以及本身的属性,此外,边的关系可能是单向的(如上图),也可能是双向的(例如好友关系)
2. 图数据库的存储方式
对于图数据库,我们有了基本的概念性的认识,那么,其点与边的数据究竟要以什么形式存储呢?
图数据库的底层存储上,不同数据库的选择也各不相同,例如Facebook使用MySQL存储,每条边对应MySQL的一行,Nebula使用KV存储等等,这里,我们以KV存储的形式,做一个简单的介绍。
如上图所示,“树獭叔叔”与六个用户有三种关系,真实情况往往会更加复杂可能一个用户会和几万甚至更多用户有成百上千种关系,如果我们将所有边都抽象为一种数据结构,那么他就会很庞大,而且遍历的成本会很高,所以在这种情况下,我们可以将中间节点与边的关系共同组成key键,采取B+树或者其他的数据结构,来进行数据的存储。
这样,我们就可以建立起很多棵树组成的“森林”,来表示图数据库之中的各种关系。
3. 其他拓展
3.1 索引
与关系型数据库类似,为了提高搜索效率,我们也可以对图数据库建立索引,索引可以以图数据库中边的某种属性为参考进行建立,索引的形式也可以用B+树。
3.2 数据查询
就像关系型数据库一般使用SQL语句来查询一样,图数据库也会有自己的查询语句,这些可以针对具体的数据库文档进行学习。