21个稳定版本
2.0.20240611 | 2024年6月12日 |
---|---|
2.0.20240610 | 2024年6月11日 |
2.0.20240530 | 2024年5月31日 |
2.0.20240416 | 2024年4月16日 |
#110 in 数据库实现
3.5MB
104K SLoC
是明天应用的终极云
数据库
更容易开发。 更快构建。 更快扩展。
一个可扩展的、分布式的、协作的文档图数据库,适用于实时网络。
什么是SurrealDB?
SurrealDB是一个面向Web、移动、无服务器、Jamstack、后端和传统应用程序的全端云原生数据库。通过简化数据库和API堆栈,SurrealDB减少了现代应用程序的开发时间,移除了大多数服务器端组件,让您能够更快、更便宜地构建安全、高性能的应用。SurrealDB既可以作为单个服务器运行,也可以在高度可用、可伸缩的分布式模式下运行,支持从客户端设备进行SQL查询、GraphQL、ACID事务、WebSocket连接、结构化和非结构化数据、图查询、全文索引、地理空间查询以及基于行的权限访问。
功能
- 数据库服务器或嵌入式库
- 多行、多表ACID事务
- 单节点或高度可伸缩的分布式模式
- 记录链接和有向类型图连接
- 存储结构化和非结构化数据
- 用于预计算高级分析的增量计算视图
- 实时API层,内置安全权限
- 以表格、文档和图形的方式存储和建模数据
- 简单的前端和后端开发模式定义
- 直接从网页浏览器和客户端设备连接和查询
- 使用嵌入式JavaScript函数实现自定义高级功能
文档
有关安装、开发、部署和管理指南,请参阅我们的文档。
安装
SurrealDB 设计得易于安装和运行 - 只需在终端运行一条命令。除了传统安装外,SurrealDB 还可以使用 HomeBrew、Docker 或其他任何容器编排工具(如 Docker Compose、Docker Swarm、Rancher 或 Kubernetes)进行安装和运行。
在 macOS 上安装
在 macOS 上快速开始使用 SurrealDB 的最佳方法是使用 Homebrew。这将安装命令行工具和 SurrealDB 服务器作为单个可执行文件。如果您不使用 Homebrew,请按照下面 Linux 的说明安装 SurrealDB。
brew install surrealdb/tap/surreal
在 Linux 上安装
在 Unix 操作系统上快速开始使用 SurrealDB 的最简单和首选方法是安装和使用 SurrealDB 命令行工具。在您的终端中运行以下命令,并遵循屏幕上的说明。
curl -sSf https://install.surrealdb.com | sh
在 Windows 上安装
在 Windows 上快速开始使用 SurrealDB 的最简单和首选方法是安装和使用 SurrealDB 命令行工具。在您的终端中运行以下命令,并遵循屏幕上的说明。
iwr https://install.surrealdb.com -useb | iex
使用 Docker 运行
可以使用 Docker 来管理和运行 SurrealDB 数据库实例,无需安装任何命令行工具。SurrealDB Docker 容器包含完整的命令行工具,用于从运行中的服务器导入和导出数据,或自行运行服务器。
docker run --rm -p 8000:8000 surrealdb/surrealdb:latest start
更新镜像到最新版本
docker pull surrealdb/surrealdb:latest
入门指南
入门使用 SurrealDB 与启动 SurrealDB 数据库服务器、选择您的平台并将 SDK 集成到您的代码一样简单。您可以通过阅读我们的教程之一轻松开始使用您选择的平台。
客户端应用程序
- 使用 JavaScript 入门
- 使用 WebAssembly 入门
- 使用 Ember.js 入门
- 使用 React.js 入门
- 使用 Angular.js 入门
- 使用 Vue.js 入门
- 使用 Apollo GraphQL 入门
服务器端代码
- 使用 JavaScript 入门
- 使用 Node.js 入门
- 使用 Golang 入门
- 使用 Rust 入门
- 使用 Deno 入门
- 使用 Python 入门 (即将推出)
- 使用 C 语言入门 (即将推出)
- 使用 Java 入门 (即将推出)
- 使用 Ruby 入门 (即将推出)
- 使用 PHP 入门 (即将推出)
- 使用 Swift 入门 (即将推出)
- 使用 R 语言入门 (即将推出)
快速浏览
使用强类型数据类型,可以在数据库中完全建模数据。
UPDATE person SET
waist = <int> "34.59",
height = <float> 201,
score = <decimal> 0.3 + 0.3 + 0.3 + 0.1
;
存储动态计算的字段,在检索时进行计算。
CREATE person SET
birthday = "2007-06-22",
can_drive = <future> { time::now() > birthday + 18y }
;
轻松处理无结构或结构化数据,在无模式或全模式模式下工作。
-- 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 = $this, 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
;
社区
加入我们全球不断壮大的社区,获取关于 SurrealDB 的帮助、想法和讨论。
- 查看我们的官方 博客
- 在 Twitter 上关注我们
- 在 LinkedIn 上与我们联系
- 在 YouTube 上访问我们
- 加入我们的 开发者社区
- 在 Discord 上与我们进行实时聊天
- 在 Stack Overflow 上标记 #surrealdb 的问题
贡献
我们 希望你参与 SurrealDB 的开发!如果你愿意帮忙,你可以在 贡献指南 中了解更多关于如何为此项目做出贡献的信息。
安全
对于安全问题,请通过电子邮件发送到 [email protected],而不是在 GitHub 上发布公开问题。
许可证
SurrealDB 的源代码在不同的许可证下有各种各样的许可。每个存储库中都可以找到每种许可证的副本。
- 库和SDK分别位于其独立的仓库中,并分别以Apache License 2.0或MIT License发布。
- 某些核心数据库组件,每个组件位于其独立的仓库中,以Apache License 2.0发布。
- SurrealDB的核心数据库代码位于此仓库,以Business Source License 1.1发布。
有关更多信息,请参阅许可信息。
依赖项
~35–62MB
~1M SLoC