典型 Schema 设计

虫神天敌 2023-08-10 14:28:17

 

时间设计

 

如何设计一个高性能的 schema

 

现在有个场景,有一堆发生过的事件,现在想查询在某个月,或者是某个时间段内,发生了哪些事件,我们该如何设计 Schema 呢?也许我们可以在时间属性上创建个索引,把这个时间当作索引来存储,但这样的话,查询速度不会很快,尤其是数据量较大的情况下。那我们应该怎么做呢?Neo4j 给了一种设计思路叫做时间树,就是说时间本身是有层级关系的。如上图所示,时间有个层级,想要查询某个事件同时间段内的其他事件,可以通过这个层级快速找到。

上图右侧则是一个时序关系,可以快速找寻某事件发生的时间前后有哪些事情发生,而在 NebulaGraph 中,你可以通过 rank 来实现时序图功能。

上面的例子只是给大家一个参考,并不代表会应用在青藤云实际业务中。

地址设计

 

如何设计一个高性能的 schema

 

上面这个是地址的设计,可能大家都会遇到。假如,现在我们要查询北京朝阳太阳宫在发生事件 A 时,同一个地理位置有多少用户 / IP 在这。传统的设计方法中,添加属性是无法满足该业务需求的。那怎么实现呢?其实这些地址划分可以作为实体,而且地址之间是有关系的。以上述的物流为例,上面的例子:中国-北京-朝阳-太阳宫,就可以通过集散中心-派送点-派送区域-派送段形式进行查询。如果你要查询同一个街道或者是同个市,也可以按照这个关系快速进行查询。

像我们遇到的地址位置,或者是网络层问题,都可以参考这种设计。之前在 BOSS 直聘(分享嘉宾曾就职 BOSS 直聘)中,我们就是参考了类似的实现来找寻某个区域的相关用户。

图最佳实践

上面讲述的内容主要是围绕 Schema 设计,下面这块当作补充资料,主要讲的是图的最佳实践。

命名规范

如果你要编写一个比较长的语句,不知道你有没有注意过,这个语句该如何快速区分哪些是实体,哪些是关系,哪些又是属性。所以,这里就要提一下命名规范问题。一旦命名规范了,一条长查询语句也可能快速辨别实体、关系、属性。

你可以参考下面的命名规范: 1. 实体采用驼峰方式,例如:User、Email、Process; 2. 关系采用全部大写,包含动词和副词,例如:HAS_IP; 3. 属性采用英文小写简写,例如:title、sid、pid

图计算

 

如何设计一个高性能的 schema

 

上图给出了图数据库和图计算的工作流,可以直观地查看到二者的区别。图数据库的工作流相对简单,拿我们常见的一个场景举例,已知某个有问题的进程 A,要溯源找寻它的源头。对应到图这边,图数据库的查询一般会 GO / LOOKUP / MATCH / FETCH 锚定某个起始点,比如这里的进程 A,然后管道 / WITCH 进行下一步的处理,最后用 RETURN / YIELD 来返回基本结构。但,注意,这个基本结构会进行二次加工。刚设计 Schema 的时候提到过,并不是所有的属性都会设计进去,只有和业务相关的核心属性才会设计进入。像请求接口之类的操作,都会在下一步过滤 / 扩展处理时完成。

上面说的是图的直接业务简单查询,但还有一种场景是用图来进行机器学习,比如 GNN 和 GCN 用图来做 feature / 特征,这块本文就不展开讲述,流程和上面有所不同。

那,什么时候用图数据库,什么时候用图计算呢?

 

如何设计一个高性能的 schema

 

如上图所示,有限点的拓展就比较适合用图数据库,或者说 NebulaGraph 来实现;而全局挖掘就比较适合用图计算。从图计算的流程上来看,简单粗暴地讲,图计算就是把一批数据捞到内存中,一次性计算完,然后“吐”出来,再进行下一步的过滤和处理。至于它是如何计算的,图计算里面配有计算引擎。

现在我们来问个问题,如果要找全图点度 Top10 的点,应该用什么?

自然是图计算,图计算也就是 OLAP 主打的是吞吐,即一次性能处理多少数据;而图数据库,主要是应对 OLTP 场景,侧重低延迟,就是查询有多快,以及支持多大量的并发请求 QPS

只要我们记住图数据库和图计算各自的擅长场景,就比较好处理相关的业务。

大图优化

像传统关系型数据库中,业务无限膨胀的话,就需要做分库分表。图也是类似的,在大图上做某些查询时,你会发现性能很差,这时候你就需要进行分图处理。像上面说到过的关系细化和加速查询,比如我现在只关心进程关系,在特定业务场景下就需要将进程关系单独设计成一张图。这就是图的一个优化手段。或者,你也可以进行业务隔离。像现在的业务是针对推荐场景,剩下的安全场景是否要放置在同一个图空间下呢?如果业务量不大的情况下,是可以的。但是如果是数据量大的话,还是需要同传统数据库一样进行业务隔离,什么业务进入什么图。

这里延伸一下,分图场景下如何进行多图查询呢?简单来说就是进程一张图,网络是一张图,这时候要查询进程和网络的关系。业界的话,管这个叫做查询端融合。虽然你要查询的数据是 2 张图,但是我假装你是在一张图上进行查询。

...全文
178 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

1,540

社区成员

发帖
与我相关
我的任务
社区描述
图数据社区,不定期分享和收录图数据库相关文章,也欢迎大家投稿; 最后,欢迎大家的加入;
社区管理员
  • 杂说
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

现如今图数据库资料较少,一般都是官网的文章和基于官网衍生出来的文章,导致开发图数据库相关业务,基本上是一步一坑…

为了便于码友们的交流,创建了一个图数据库交流社区;不定期分享和收录图数据库相关文章,也欢迎大家投稿;

最后,欢迎大家的加入;

 

试试用AI创作助手写篇文章吧