Nebula·利器 | Norm 知乎开源的 ORM 工具

本文整理于 Norm on nLive 播客

Norm 是由知乎反欺诈团队工程师——吴振胜开源的 ORM 工具。项目由 Golang 编写,对分布式图数据库 Nebula Graph 的查询语言 nGQL 进行映射封装,极大地降低了后端工程师使用图数据库的门槛,只用实例对象即可进行图数据查询。GitHub 地址:https://github.com/zhihu/norm

ORM 是什么

对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的资料之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。

关于 Norm 的作者

吴振胜,现就职知乎,在反欺诈团队任工程师。

Norm 的由来

早在 19 年时,出于更好展示网站信息的关联性的需要,吴振胜第一次接触了图数据库。随后知乎反欺诈业务所需的图谱关联、图实时计算能力都依赖于图数据库、图技术提供,在此过程中他发现 ORM 存在大量的需求。无论在知乎内部,或者是 Nebula 社区中,ORM 的需求讨论一直很热烈。而 Nebula 官方提供的 SDK 提供了一些核心的功能,比如连接池的创建、数据库的交互。倘若在业务上直接使用,会增加业务同学的心智负担——需要解析语句的结构体、拼接 SQL、nGQL 等等

而另外一个原因则是 ORM 是一个好玩的功能需求,实现它的话需要了解反射机制,这是他一直感兴趣的技术点。于是便动手实现,将其开源了。

Norm GitHub 地址:https://github.com/zhihu/norm

Norm 的开发

Norm 这个项目的代码部分一共花了不到一周的时间完成。从周一开始写的,大概周四的时候就上线了第一版。但测试、文档编写部分,花的时间就比较久,主要是陆陆续续地在做。

由于吴振胜对 ORM 这块相对比较了解,所以整个项目主要是由吴振胜一人完成,开发过程中有个热心的社区同学提了个 bug 并修复掉了。

吴振胜表示,Norm 开发的主要难点在于两方面,一部分是学习成本,要去学一些技术才能去解决对应的问题。需要学习的点主要是三个方面,第一个是反射,做 ORM 项目的话肯定离不开反射:怎么去把值反射到结构体、map…。第二个就是常见的怎么做分层,比如说,把数据库连接同 ORM 分开,以便支持更多使用 nGQL 场景,这是一种连接的方式。另外一种连接是链式调用的编程方式,如何实现链式编程、链式调用,都是思考点。基本上技术难点就这三个,其中比较可能学的比较多的是反射。

Norm 的难点还有个方面是业务上的问题,当中最大的难点是性能和功能的权衡、业务边界、应用场景。比如说,满足功能 A 的时候,可能存在部分性能损耗,这就会出现性能损耗和便携性到底是哪个比较重要的问题。什么情况下可以牺牲便携性,什么情况下牺牲性能,这是一个需要权衡的地方,也是个比较复杂的点。

此外业务边界问题还涉及了功能规划问题,这个产品要提供哪些功能、不提供哪些功能,都是需要考量的点。如果 ORM 提供的功能一开始就很丰富,就要开发花很多开发时间。而且过于丰富的功能需求,也会存在一些需求遗漏问题。

最后是应用场景,只有研发在很多场景中用过 ORM 才能知道哪些地方是真正需要的,哪些地方是可有可无的。顺便提一嘴,在 Norm 开发过程中,知乎更多的是把图数据库当作数据库去用的,去查询关系、做些 count 计数不涉及图模型的算法(这种情况下不适合用 ORM)。

此外,Norm 的开发主要参考了知名 ORM 项目——gorm 的设计思路和实现方式。当然 Norm 还有不完善的地方,欢迎大家来 Norm 项目的 GitHub 提功能或者问题修复 pr:https://github.com/zhihu/norm

Norm 下阶段的规划

下一个阶段现在主要是优化链式调用,因为链式调用这个版本只是做了下简单实现,并没有完善一些功能,比如说,WHERE、MATCH 更好地组合使用。另外个方面是连接池,就之前说的 session 连接池。剩下的就是文档的完善和单元测试。

知乎的开源态度

在此之前,先说下吴振胜的开源看法:

知乎的开源和主产品类似,帮助大家更好的找到答案——开源也是这样,它会让充满好奇心的人,或者说需要开发中遇到问题的人,在社区开源社区找到自己的答案。

而知乎也有自己的开源愿景:让代码流动,让开源发生。知乎开源需要更好地结合并服务技术规划,促进架构落地。同时,通过开源,我们希望赋予每名知乎工程师透明共创的氛围感、舵向明确的归属感、专业声誉提升的自豪感;通过开源,我们希望向外传达知乎开源精神,使开源成为塑造知乎技术影响力的新引擎。我们致力于让这个时代充满好奇心的开发者能够通过开源,找到答案

最后这是知乎开源组织:https://github.com/zhihu

以上。

本文中如有任何错误或疏漏,欢迎去 GitHub:https://github.com/vesoft-inc/nebula issue 区向我们提 issue 或者前往官方论坛:https://discuss.nebula-graph.com.cn/建议反馈 分类下提建议 :clap:;交流图数据库技术?加入 Nebula 交流群请先填写下你的 Nebula 名片,Nebula 小助手会拉你进群~~

1 个赞

有没有java的?

有的,参考这个 GitHub - nebula-contrib/graph-ocean: ORM of nebula-java

1 个赞