surrealdb/surrealdb

GitHub: surrealdb/surrealdb

一个用 Rust 编写的多模型数据库,整合文档、图、关系、向量检索等多种数据模型,支持实时推送、嵌入式部署和分布式集群。

Stars: 31431 | Forks: 1162

SurrealDB Hero SurrealDB Hero

     

           

Discord   X   Dev   LinkedIn   YouTube

Blog   Github   LinkedIn   X   YouTube   Dev   Discord   Stack Overflow


  What is SurrealDB?

SurrealDB 是一个用 Rust 构建的多模型数据库,旨在将多种数据模型统一到一个引擎中。SurrealDB 结合了文档、图、关系、时间序列、地理空间和键值数据类型,以及强大的搜索和检索功能(全文、向量、混合)以及实时和事件驱动能力,使开发者能够更快、更高效地构建强大的应用程序。鉴于其支持最终用户身份验证,SurrealDB 也可以用作 Backend-as-a-Service。由于它是单个 Rust 二进制文件,SurrealDB 可以嵌入运行(应用内)、在浏览器中运行(通过 WebAssembly)、在边缘端运行、作为单个后端节点自托管,或者在云中的分布式集群中运行。 SurrealDB 用于数据密集型系统,例如需要多种数据类型的应用程序、AI 智能体的数据层、知识图谱、实时应用程序(例如推荐引擎、欺诈检测系统)以及嵌入式/边缘系统。使用 SurrealDB,您可以简化数据库和 API 基础设施,减少开发时间,并快速且经济高效地构建安全、高性能的应用程序。 **SurrealDB 的主要功能包括:** - **减少开发时间**:SurrealDB 通过消除对大多数服务器端组件的需求来简化您的数据库和 API 技术栈,使您能够更快、更低成本地构建安全、高性能的应用程序。 - **多模型**:原生支持文档、图、关系(强制模式和 Schemaless)、时间序列、地理空间和检索(全文、向量、混合)。这是通过 SurrealQL(SurrealDB 的类 SQL 直观查询语言)原生提供的。 - **实时协作 API 后端服务:** SurrealDB 既可以用作数据库,也可以用作 API 后端服务,从而实现实时协作。 - **支持多种查询语言**:SurrealDB 支持从客户端设备进行 SQL 查询、GraphQL、ACID 事务、WebSocket 连接、结构化和非结构化数据、图查询、全文和向量索引以及地理空间查询。 - **细粒度访问控制**:SurrealDB 提供基于行级权限的访问控制,使您能够精确管理数据访问。 查看[功能](https://surrealdb.com/features)、最新[版本](https://surrealdb.com/releases)和[文档](https://surrealdb.com/docs)。 Surrealist

  Contents

- [功能](#features) - [文档](#documentation) - [入门指南](#getting-started) - [服务端代码](#server-side-code) - [客户端应用](#client-side-apps) - [SurrealDB Cloud](#surrealdb-cloud) - [安装](#installation) - [在 macOS 上安装](#install-on-macos) - [在 Linux 上安装](#install-on-linux) - [在 Windows 上安装](#install-on-windows) - [使用 Docker 运行](#run-using-docker) - [快速浏览](#quick-look) - [为什么选择 SurrealDB](#why-surrealdb) - [数据库、API 和权限](#database-api-and-permissions) - [表、文档和图](#tables-documents-and-graph) - [高级文档间关系](#advanced-inter-document-relations-and-analysis-no-joins-no-pain) - [简单的 Schema 定义](#simple-schema-definition-for-frontend-and-backend-development) - [直接从 Web 浏览器连接](#connect-and-query-directly-from-web-browsers-and-client-devices) - [多种不同的查询方法](#query-the-database-with-the-tools-you-want) - [实时 Live 查询和数据变更](#realtime-live-queries-and-data-changes-direct-to-application) - [轻松扩展以实现高可用性](#scale-effortlessly-to-hundreds-of-nodes-for-high-availability-and-scalability) - [使用 JavaScript 扩展您的数据库](#extend-your-database-with-javascript-functions) - [设计为嵌入式或云端运行](#designed-to-be-embedded-or-to-run-distributed-in-the-cloud) - [社区](#community) - [贡献](#contributing) - [安全](#security) - [许可证](#license)

  Features

- [x] 数据库服务器或嵌入式库 - [x] 多行、多表 ACID 事务 - [x] 单节点或高度可扩展的分布式模式 - [x] 记录链接和有向类型图连接 - [x] 存储结构化和非结构化数据 - [x] 增量计算视图,用于预计算的高级分析 - [x] 内置实时 API 层和安全权限 - [x] 使用表、文档和图以任何方式存储和建模数据 - [x] 面向前端和后端开发的简单 Schema 定义 - [x] 直接从 Web 浏览器和客户端设备连接和查询 - [x] 使用嵌入式 JavaScript 函数实现自定义高级功能

  Documentation

有关安装、开发、部署和管理的指导,请查看以下资源: - 文档:https://surrealdb.com/docs - SurrealDB University:https://surrealdb.com/learn - Aeon's Surreal Renaissance(交互式书籍):https://surrealdb.com/learn/book

  Getting started

开始使用 SurrealDB 就像启动 SurrealDB 数据库服务器、选择您的平台并将其 SDK 集成到您的代码中一样简单。您可以通过阅读我们的教程之一,轻松开始使用您选择的平台。 **服务端代码**

                 

**客户端应用**

       

  SurrealDB Cloud

SurrealDB Cloud SurrealDB Cloud SurrealDB 提供托管的[云服务](https://app.surrealdb.com/overview)。无需担心基础设施运维、监控、备份或容量规划。[SurrealDB Cloud](https://surrealdb.com/cloud) 让您只需点击几下,即可利用 SurrealDB 的强大功能和灵活性,专注于构建出色的产品。从原型扩展到企业级规模。SurrealDB Cloud 的可扩展架构允许您的数据库随着应用程序的增长而演进,确保您始终领先于需求。但是,如果您想自己部署 SurrealDB,请继续阅读下文。

  Installation

SurrealDB 旨在简单安装和运行 - 只需在终端中使用一条命令。除了传统安装方式外,SurrealDB 还可以通过 HomeBrew、Docker 或使用任何其他容器编排工具(如 Docker Compose、Docker Swarm、Rancher 或 Kubernetes)进行安装和运行。

 Install on macOS

在 macOS 上开始使用 SurrealDB 的最快方法是使用 Homebrew。这将安装命令行工具和 SurrealDB 服务器作为单个可执行文件。如果您不使用 Homebrew,请按照下面的 Linux 说明安装 SurrealDB。 ``` brew install surrealdb/tap/surreal ``` 如果您想测试每晚发布的具有最新功能的版本,请安装 `nightly` 版本: ``` brew install surrealdb/tap/surreal-nightly ```

 Install on Linux

在 Unix 操作系统上开始使用 SurrealDB 的最简单且首选的方法是安装并使用 SurrealDB 命令行工具。在终端中运行以下命令并按照屏幕上的说明操作。 ``` curl --proto '=https' --tlsv1.2 -sSf https://install.surrealdb.com | sh ``` 如果您想在下一个版本发布之前运行 beta 版本,请使用 `beta` 版本: ``` curl --proto '=https' --tlsv1.2 -sSf https://install.surrealdb.com | sh -s -- --beta ``` 如果您想测试每晚发布的具有最新功能的版本,请安装 `nightly` 版本: ``` curl --proto '=https' --tlsv1.2 -sSf https://install.surrealdb.com | sh -s -- --nightly ```

 Install on Windows

在 Windows 上开始使用 SurrealDB 的最简单且首选的方法是安装并使用 SurrealDB 命令行工具。在终端中运行以下命令并按照屏幕上的说明操作。 ``` iwr https://windows.surrealdb.com -useb | iex ``` 如果您想测试每晚发布的具有最新功能的版本,请安装 `nightly` 版本: ``` iex "& { $(irm https://windows.surrealdb.com) } -Nightly" ```

 Run using Docker

Docker 可用于管理和运行 SurrealDB 数据库实例,而无需安装任何命令行工具。SurrealDB docker 容器包含完整的命令行工具,用于从运行中的服务器导入和导出数据,或用于运行服务器本身。 ``` docker run --rm --pull always --name surrealdb -p 8000:8000 surrealdb/surrealdb:latest start ``` 对于刚刚开始在内存中运行开发服务器的情况,您可以向容器传递一个基本初始化配置,将用户和密码设置为 root 并启用日志记录。 ``` docker run --rm --pull always --name surrealdb -p 8000:8000 surrealdb/surrealdb:latest start --log info --user root --pass root memory ```

  Quick look

借助强类型数据类型,数据可以直接在数据库中完全建模。 ``` UPDATE person SET waist = "34", height = 201, score = 0.3 + 0.3 + 0.3 + 0.1 ; ``` 存储在检索时计算的动态计算字段。 ``` DEFINE FIELD can_drive ON TABLE person COMPUTED time::now() > birthday + 18y; CREATE person SET birthday = d"2007-06-22"; ; ``` 以 Schema-less 或 Schema-full 模式轻松处理非结构化或结构化数据。 ``` -- Create a schemafull table DEFINE TABLE user SCHEMAFULL; -- Specify fields on the user table DEFINE FIELD name ON TABLE user TYPE object; DEFINE FIELD name.first ON TABLE user TYPE string; DEFINE FIELD name.last ON TABLE user TYPE string; DEFINE FIELD email ON TABLE user TYPE string ASSERT string::is_email($value); -- Add a unique index on the email field preventing duplicate values DEFINE INDEX email ON TABLE user COLUMNS email UNIQUE; -- Create a new event whenever a user changes their email address DEFINE EVENT email ON TABLE user WHEN $before.email != $after.email THEN ( CREATE event SET user = $value, time = time::now(), value = $after.email, action = 'email_changed' ); ``` 使用完全有向图边连接将记录连接在一起。 ``` -- Add a graph edge between user:tobie and article:surreal RELATE user:tobie->write->article:surreal SET time.written = time::now() ; -- Add a graph edge between specific users and developers LET $from = (SELECT users FROM company:surrealdb); LET $devs = (SELECT * FROM user WHERE tags CONTAINS 'developer'); RELATE $from->like->$devs UNIQUE SET time.connected = time::now() ; ``` 通过高级表达式和图查询灵活地查询数据。 ``` -- Select a nested array, and filter based on an attribute SELECT emails[WHERE active = true] FROM person; -- Select all 1st, 2nd, and 3rd level people who this specific person record knows, or likes, as separate outputs SELECT ->knows->(? AS f1)->knows->(? AS f2)->(knows, likes AS e3 WHERE influencer = true)->(? AS f3) FROM person:tobie; -- Select all person records (and their recipients), who have sent more than 5 emails SELECT *, ->sent->email->to->person FROM person WHERE count(->sent->email) > 5; -- Select other products purchased by people who purchased this laptop SELECT <-purchased<-person->purchased->product FROM product:laptop; -- Select products purchased by people in the last 3 weeks who have purchased the same products that we purchased SELECT ->purchased->product<-purchased<-person->(purchased WHERE created_at > time::now() - 3w)->product FROM person:tobie; ``` 存储 GeoJSON 地理数据类型,包括点、线和多边形。 ``` UPDATE city:london SET centre = (-0.118092, 51.509865), boundary = { type: "Polygon", coordinates: [[ [-0.38314819, 51.37692386], [0.1785278, 51.37692386], [0.1785278, 51.61460570], [-0.38314819, 51.61460570], [-0.38314819, 51.37692386] ]] } ; ``` 使用 JavaScript 函数编写自定义嵌入式逻辑。 ``` CREATE film SET ratings = [ { rating: 6, user: user:bt8e39uh1ouhfm8ko8s0 }, { rating: 8, user: user:bsilfhu88j04rgs0ga70 }, ], featured = function() { return this.ratings.filter(r => { return r.rating >= 7; }).map(r => { return { ...r, rating: r.rating * 10 }; }); } ; ``` 为客户端和应用程序访问指定细粒度的访问权限。 ``` -- Specify access permissions for the 'post' table DEFINE TABLE post SCHEMALESS PERMISSIONS FOR select -- Published posts can be selected WHERE published = true -- A user can select all their own posts OR user = $auth.id FOR create, update -- A user can create or update their own posts WHERE user = $auth.id FOR delete -- A user can delete their own posts WHERE user = $auth.id -- Or an admin can delete any posts OR $auth.admin = true ; ```

  Why SurrealDB?

### 数据库、API 和权限 SurrealDB 将数据库层、查询层以及 API 和身份验证层结合到一个平台中。基于高级表和行的可定制访问权限允许为不同类型的用户提供细粒度的数据访问模式。无需复杂的数据库开发即可编写自定义后端代码和安全规则。 ### 表、文档和图 作为多模型数据库,SurrealDB 使开发者能够使用多种技术来存储和建模数据,而无需预先选择一种方法。通过使用表,SurrealDB 与关系数据库有相似之处,但具有高级嵌套字段和数组的附加功能和灵活性。文档间记录链接允许简单易懂且高性能的相关查询,而无需使用 JOIN,从而消除了 N+1 查询问题。

### 高级文档间关系和分析。无 JOIN。无痛苦。 凭借完整的图数据库功能,SurrealDB 支持更高级的查询和分析。记录(或顶点)可以通过边相互连接,每条边都有自己的记录属性和元数据。对传统 SQL 查询的简单扩展允许在数据库中高效地进行多表、多深度文档检索,而无需使用复杂的 JOIN,也无需将数据下移到客户端。 ### 面向前端和后端开发的简单 Schema 定义 使用 SurrealDB,在一个地方指定您的数据库和 API Schema,并仅定义一次列规则和约束。定义 Schema 后,将自动向相关用户授予数据库访问权限。不再需要自定义 API 代码,也不需要 GraphQL 集成。简单、灵活,并在几分钟而不是几个月内准备好投入生产。

### 直接从 Web 浏览器和客户端设备连接和查询 直接从任何最终用户客户端设备连接到 SurrealDB。直接在 Web 浏览器中运行 SurrealQL 查询,确保用户只能查看或修改他们被允许访问的数据。高性能的 WebSocket 连接允许高效的双向查询、响应和通知。 ### 使用您想要的工具查询数据库 您的数据,您做主。SurrealDB 设计灵活,支持 SurrealQL、GraphQL(即将推出)、通过 REST 的 CRUD 支持,以及通过 WebSockets 的 JSON-RPC 查询和修改。通过内置权限的直接客户端连接,SurrealDB 加快了开发过程,并无缝融入任何技术栈。

### 实时 Live 查询和数据变更直接推送到应用程序 SurrealDB 使每个客户端设备与实时推送到客户端、应用程序、最终用户设备和服务端库的数据修改保持同步。实时 SQL 查询允许对客户端订阅的变更进行高级过滤,而高效的数据格式(包括 DIFFing 和 PATCHing)实现了高性能的基于 Web 的数据同步。 ### 轻松扩展到数百个节点以实现高可用性和可扩展性 SurrealDB 可以作为单个内存节点运行,也可以作为分布式集群的一部分运行 —— 提供高可用性和高可扩展性的系统特性。SurrealDB 从底层设计为在分布式环境中运行,在处理多表事务和文档记录 ID 时采用了特殊技术 —— 不使用表锁或行锁。

### 使用 JavaScript 函数扩展您的数据库 嵌入式 JavaScript 函数允许实现高级、自定义的功能,并将计算逻辑移至数据层。这改进了在应用任何计算逻辑之前将数据移动到客户端设备的传统方法,确保仅将必要的数据远程传输。这些支持 ES2020 标准的高级 JavaScript 函数允许任何开发者以更简单而高级的方式分析数据。 ### 设计为嵌入式或分布式云端运行 SurrealDB 完全用 Rust 构建为单个库,设计为既可用作具有高级查询功能的嵌入式数据库库,也可用作可在分布式集群中运行的数据库服务器。凭借较低的内存和 CPU 占用,系统需求经过特别考虑,适用于在所有类型的环境中运行。 我们    希望您能参与 SurrealDB 的开发!如果您愿意提供帮助,可以在[贡献指南](CONTRIBUTING.md)中了解更多关于如何为本项目做贡献的信息。 **对于维护者**:有关执行发布的信息,请参阅[发布流程文档](doc/RELEASING.md)。

  Security

有关安全问题,请查看我们的[漏洞政策](https://github.com/surrealdb/surrealdb/security/policy),查看我们的[信任与安全页面](https://surrealdb.com/legal/category/security),并通过 [security@surrealdb.com](mailto:security@surrealdb.com) 温馨邮件通知我们,而不是在 GitHub 上发布公开 issue。

  License

SurrealDB 的源代码根据多个不同的许可证进行许可。每个许可证的副本可以在[每个仓库](https://github.com/surrealdb)中找到。 - 库和 SDK,各自位于其独立的仓库中,根据Apache License 2.0](https://github.com/surrealdb/license/blob/main/APL.txt) 或 [MIT License](https://github.com/surrealdb/license/blob/main/MIT.txt) 发布。 - 某些核心数据库组件,各自位于其独立的仓库中,根据 [Apache License 2.0](https://github.com/surrealdb/license/blob/main/APL.txt) 发布。 - SurrealDB 的核心数据库代码,位于[本仓库](https://github.com/surrealdb/surrealdb)中,根据 [Business Source License 1.1](/LICENSE) 发布。 有关更多信息,请参阅[许可信息](https://github.com/surrealdb/license)。
标签:ACID, AI工具, Docker, GraphQL, JS文件枚举, NewSQL, RESTful, Rust, SQL, SurrealDB, Syscall, Web开发, 代理服务器, 分布式数据库, 协作, 可视化界面, 后端开发, 多人体追踪, 多模型数据库, 大数据, 安全防御评估, 实时数据库, 嵌入式数据库, 开源, 数据可视化, 数据库, 文档数据库, 日志审计, 目录扫描, 系统审计, 网络流量审计, 请求拦截, 逆向工具, 通知系统