Dgraph:用 GraphQL 查询的分布式图数据库
文章目录
- Dgraph:用 GraphQL 查询的分布式图数据库
- 1、 它解决什么问题
- 2、 能做什么
- 3、 怎么装
- 4、 适合什么场景
- 5、 生态和社区
Dgraph:用 GraphQL 查询的分布式图数据库
Dgraph 在 GitHub 上有 21,707 个 Star。
这是一个用 Go 写的分布式图数据库,原生支持 GraphQL 查询语法,能做 ACID 事务,线性一致性读取,已经在多家世界 500 强企业的生产环境里跑着了。
1、 它解决什么问题
传统关系型数据库处理关联数据的方式是 JOIN。表越多,JOIN 越多,查询越慢。10 张以上的表通过外键连起来,性能就开始往下掉。数据稀疏的时候更麻烦,SQL 表里到处是空字段,结构臃肿,维护成本高。
Dgraph 的思路不一样。它把数据存成图结构,节点和边直接表达关系。查一个用户的订单、订单里的商品、商品的评价,不需要 JOIN,顺着图的边走就行。分布式架构下数据自动分片,查询跨节点的时候由引擎自己协调,不用应用层操心。
2、 能做什么
Dgraph 支持 GraphQL 查询语法,返回 JSON 或 Protocol Buffers 格式的数据,走 gRPC 或 HTTP 协议。
它的核心能力包括:分布式 ACID 事务、全文检索、正则匹配、地理搜索。这些功能都是原生内置的,不需要外挂索引系统。
和 Neo4j 比,Dgraph 是分片分布式架构,Neo4j 社区版是单机加副本(企业版才有)。Dgraph 的分片重平衡是自动的,Neo4j 每台服务器存全量数据。查询语言方面,Dgraph 用类 GraphQL 语法,Neo4j 用 Cypher。
和 Janus Graph 比,Janus Graph 本身不存储数据,得搭在别的分布式数据库上面。事务、全文检索、地理搜索这些能力依赖底层数据库,或者要接外部索引。Dgraph 这些全是自己实现的,开箱即用。
3、 怎么装
最简单的方式是 Docker:
dockerpull dgraph/dgraph:latest跑一个单机测试环境:
dockerrun-it-p8080:8080-p9080:9080-v~/dgraph:/dgraph dgraph/standalone:latest如果要从源码编译,需要 Go 1.24 以上版本。Ubuntu 上先装 build-essential,然后 clone 仓库,make setup,make install。
官方支持 Linux/amd64 和 Linux/arm64 两个平台。Mac 和 Windows 在 2021 年停止了官方支持,但还是可以自己编译使用。生产环境建议用 Docker 或 Kubernetes 部署。
4、 适合什么场景
几个判断标准:
你的 SQL 表超过 10 张,而且通过外键关联。你的数据稀疏,塞进 SQL 表里结构别扭。你需要灵活可维护的 schema。你对查询速度和大规模下的性能有要求。
如果这几点都符合,Dgraph 值得试一试。
它兼具 NoSQL 的扩展能力和 SQL 级别的事务保证,再加上分布式 JOIN 和图遍历能力,做社交网络、推荐系统、知识图谱这类关联密集的应用比较合适。
5、 生态和社区
Dgraph 有官方维护的多语言客户端库,社区也有非官方的实现。文档在 docs.dgraph.io,问题和功能讨论走 GitHub Discussions,Bug 提交走 GitHub Issues。
目前版本是 v25,已经进入生产就绪状态。
Discussions,Bug 提交走 GitHub Issues。
目前版本是 v25,已经进入生产就绪状态。
