我了解了一个名为 SurrealDB 的 Rust 数据库,所以我将介绍它。这个数据库太棒了。它可以处理关系、文档、图形、各种数据结构,并且可以运行在内存、单节点和分布式环境中。此外,通过HTTP和WebSocket的访问以及灵活的用户认证和授权功能都包含在DB主体中,因此它可以用作可以从浏览器直接连接的WebDB。无论如何,它感觉就像一个可以做任何事情的梦想数据库。
特征
列出的功能太多了,所以我将列出最有趣的部分。
- 虽然您可以拥有包含嵌套数组和对象的复杂数据结构,但通过使用称为记录链接的函数支持关系,您可以编写比 SQL 或 MongoDB 更简洁的查询。
- 它没有架构,每条记录都可以有任意字段,但您也可以根据需要定义架构。此外,还可以使用表达式对每个字段的值设置约束。
- DB本身包含HTTP连接功能和用户认证/授权功能,所以也可以作为WebDB直接从浏览器连接。此外,如果您使用 WebSocket 连接,它将是一个实时数据库,可以立即反映来自另一个连接的数据库更新。
- 有很多内置函数,您甚至可以在查询中发出 HTTP 请求,还可以使用 JavaScript 定义自己的函数,还可以将后端函数合并到 DB 中。
- 可以在单个节点上运行,也可以在分布式多个节点上运行。它也可以在内存中工作。
功能
官网下面也有写。
操作环境
- 单节点
- 分布式多个节点
- 内存中单节点
数据结构
- 由表、记录和字段组成(与 Document DB 相同)
- 您可以为表定义架构,虽然可以拒绝不符合架构的记录,但也可以不使用架构插入任何结构的记录。
- 可用作 RDB 和文档 DB
- 使用表达式约束表字段值
- 字段具有数组类型、对象类型(以字符串为键的字典)和嵌套它们的复杂结构。
- 通过使用记录链接类型,您可以为 RDB 执行类似外键的操作
- 但是,外键约束验证可能是不可能的
- 您可以像图表数据库一样在图表中表达记录之间的关系
- 例如一个数据结构,其中两个人用记录表示,如果两个人认识,则在记录之间添加一条边,并在边上附加相识日期。
- 这允许直接处理记录之间的多对多关系
- 您不必使用 RDB 等中间表自行实现
- 可以处理GeoJSON(表示直线和平面)类型
- 可以定义在查询时计算的只读字段
- 例如从出生日期计算并返回查询时的年龄
询问
- 使用类似于 SQL 扩展的专有语言,称为 SurrealQL
- 带有记录链接的关系查询(SQL 中的 JOIN)
- 即使是使用多对多关系和多重关系的深层关系查询也可以比 SQL 更简洁、更短。
- 可以使用事务
- 通过简单地将
BEGIN TRANSACTION;和COMMIT TRANSACTION;括起来,您可以在一个事务中进行多项操作。
- 通过简单地将
- 执行更改操作时可以返回差异
- 进行更改时可以引发事件
- 您可以对 IF 语句使用条件分支
功能
- 有很多函数可以在数据库中的表达式中使用
- GeoJSON中还有计算平面面积的函数,返回字符串是否为email地址的函数,在字段值约束中很有用,还有发送HTTP请求并返回的函数结果。
- 您可以将自己的逻辑放入 JavaScript
认证/授权
- 用户身份验证可以在数据库中使用表达式使用灵活的逻辑完成
- 使用表达式灵活判断每个表的登录用户是否可以读取、添加、更新或删除每条记录
连接方式
- 基于 HTTP 的 SurrealQL
- GraphQL over HTTP(开发中)
- WebSockets
- 更改 DB 的内容时发生事件(实时 DB)
- 从浏览器访问的 GUI 管理屏幕(开发中)
玩弄
请参考下面的官方文档。
启动
使用用户:root,密码:root 启动 SurrealDB。与 Docker 合影。
$ docker run --rm -p 8000:8000 surrealdb/surrealdb:latest start --user root --pass root
联系
您可以使用 HTTP 连接,因此可以使用 curl 命令,但我使用 GUI HTTP 客户端使事情变得更容易。仅供参考,我使用失眠症。
HTTP 请求
- 网址:
http://localhost:8000/sql - 方法:POST
- 基本身份验证:用户:root,密码:root
- 标题
Accept: application/jsonNS: test-
DB: test
- 正文:SurrealQL 查询语句
HTTP 标头NS 和DB 指定命名空间和数据库名称。数据库名称是与 RDB 具有相同概念的多个表的集合。 SurrealDB 也有命名空间的概念,命名空间是多个数据库的集合。
查询示例
在上述 HTTP 请求的正文部分发送每个 SurrealQL 查询文本。
连接测试
INFO FOR DB;
[
{
"time": "110.118µs",
"status": "OK",
"result": {
"dl": {},
"dt": {},
"sc": {},
"tb": {}
}
}
]
添加记录
与文档数据库相同无需预先创建表和字段定义.另一方面如果需要,您还可以定义模式和值约束.我们在这里不使用这些功能。
CREATE account SET
name = 'ACME Inc',
created_at = time::now()
;
[
{
"time": "11.469948ms",
"status": "OK",
"result": [
{
"created_at": "2022-10-18T03:02:11.384926367Z",
"id": "account:5h9wuul5zogoeavmckzv",
"name": "ACME Inc"
}
]
}
]
正如您在响应中看到的,记录被分配了一个 ID(上面的account:5h9wuul5zogoeavmckzv)。ID 包含表名是一个特性,在 SurrealDB 中这个您可以通过 ID 直接访问记录. ID 也可以明确指定。
CREATE author:john SET
name.first = 'John',
name.last = 'Adams',
name.full = string::join(' ', name.first, name.last),
age = 29,
admin = true,
signup_at = time::now()
;
[
{
"time": "479.957µs",
"status": "OK",
"result": [
{
"admin": true,
"age": 29,
"id": "author:john",
"name": {
"first": "John",
"full": "John Adams",
"last": "Adams"
},
"signup_at": "2022-10-18T03:09:23.304462683Z"
}
]
}
]
创建博客文章。将您刚刚创建的作者和帐户与文章相关联。在下面作者的例子中直接指定记录ID,包括表名(记录链接)是在做。使用子查询指定帐户记录链接。
CREATE article SET
created_at = time::now(),
author = author:john,
title = 'Lorem ipsum dolor',
text = 'Donec eleifend, nunc vitae commodo accumsan, mauris est fringilla.',
account = (SELECT id FROM account WHERE name = 'ACME Inc' LIMIT 1)
;
[
{
"time": "2.360989ms",
"status": "OK",
"result": [
{
"account": "account:5h9wuul5zogoeavmckzv",
"author": "author:john",
"created_at": "2022-10-18T03:23:20.987274481Z",
"id": "article:l6fvtj92ex720r1n8239",
"text": "Donec eleifend, nunc vitae commodo accumsan, mauris est fringilla.",
"title": "Lorem ipsum dolor"
}
]
}
]
获取记录
SELECT * FROM article;
[
{
"time": "1.255926ms",
"status": "OK",
"result": [
{
"account": "account:5h9wuul5zogoeavmckzv",
"author": "author:john",
"created_at": "2022-10-18T03:23:20.987274481Z",
"id": "article:l6fvtj92ex720r1n8239",
"text": "Donec eleifend, nunc vitae commodo accumsan, mauris est fringilla.",
"title": "Lorem ipsum dolor"
}
]
}
]
SurrealDB 可以同时从多个表中检索记录。
SELECT * FROM article, account;
[
{
"time": "119.372µs",
"status": "OK",
"result": [
{
"account": "account:5h9wuul5zogoeavmckzv",
"author": "author:john",
"created_at": "2022-10-18T03:23:20.987274481Z",
"id": "article:l6fvtj92ex720r1n8239",
"text": "Donec eleifend, nunc vitae commodo accumsan, mauris est fringilla.",
"title": "Lorem ipsum dolor"
},
{
"created_at": "2022-10-18T03:02:11.384926367Z",
"id": "account:5h9wuul5zogoeavmckzv",
"name": "ACME Inc"
}
]
}
]
SurrealQL 的功能之一很容易理解关系有一点。在下面的例子中,对关系目的地的其他表的记录的字段附加条件,并且指示当场扩展关系目的地的记录而不是ID并返回它。
SELECT * FROM article WHERE author.age < 30 FETCH author, account;
[
{
"time": "475.681µs",
"status": "OK",
"result": [
{
"account": {
"created_at": "2022-10-18T03:02:11.384926367Z",
"id": "account:5h9wuul5zogoeavmckzv",
"name": "ACME Inc"
},
"author": {
"admin": true,
"age": 29,
"id": "author:john",
"name": {
"first": "John",
"full": "John Adams",
"last": "Adams"
},
"signup_at": "2022-10-18T03:09:23.304462683Z"
},
"created_at": "2022-10-18T03:23:20.987274481Z",
"id": "article:l6fvtj92ex720r1n8239",
"text": "Donec eleifend, nunc vitae commodo accumsan, mauris est fringilla.",
"title": "Lorem ipsum dolor"
}
]
}
]
图形
添加表示邮件的记录并添加表示邮件已发送给作者的边。 RELATE 语句用于添加图边。
CREATE email:hoge SET
subject = 'Hoge',
text = 'hoge fuga piyo'
;
RELATE email:hoge->to->author:john SET
opened = false
;
[
{
"time": "518.011µs",
"status": "OK",
"result": [
{
"id": "email:hoge",
"subject": "Hoge",
"text": "hoge fuga piyo"
}
]
},
{
"time": "2.689115ms",
"status": "OK",
"result": [
{
"id": "to:czoy6a5pqzbtsf2ipiyj",
"in": "email:hoge",
"opened": false,
"out": "author:john"
}
]
}
]
添加另一位作者以代表您自己作为这封电子邮件的发件人。使用CONTENT 的另一种写入方式用于添加记录。
CREATE author:jane CONTENT {
name: { first: 'Jane', last: 'Smith' }
};
RELATE author:jane->send->email:hoge CONTENT {
time: '2022-10-18T07:31:49Z',
};
[
{
"time": "230.283µs",
"status": "OK",
"result": [
{
"id": "author:jane",
"name": {
"first": "Jane",
"last": "Smith"
}
}
]
},
{
"time": "113.366µs",
"status": "OK",
"result": [
{
"id": "send:apm1mvavmlpr0jkkn9s4",
"in": "author:jane",
"out": "email:hoge",
"time": "2022-10-18T07:31:49Z"
}
]
}
]
从Jane获取所有尚未打开邮件的管理员。
SELECT ->send->(email as email)->(to WHERE opened = false)->(author WHERE admin = true as receiver) FROM author:jane FETCH email, receiver
[
{
"time": "313.026µs",
"status": "OK",
"result": [
{
"email": [
{
"id": "email:hoge",
"subject": "Hoge",
"text": "hoge fuga piyo"
}
],
"receiver": [
{
"admin": true,
"age": 29,
"id": "author:john",
"name": {
"first": "John",
"full": "John Adams",
"last": "Adams"
},
"signup_at": "2022-10-18T03:09:23.304462683Z"
}
]
}
]
}
]
还有很多其他有趣的功能,例如字段值约束、用户认证/授权、WebSocket 的更改通知,但我不能全部写出来,所以我就到此为止。每个人都应该尝试一下。
后记
正如官网所说,它是终极数据库。官方文档还很少,还有很多部分没有具体写出来,但确实看起来很神奇,我很兴奋。这只是性能如何的问题。但是,我认为在很多情况下,易用性和系统的简单性比性能更具有决定性意义。另一方面,SurrealDB 可以用更简单的查询语言和免费的开源软件,用一个 DB 实现多功能和灵活的后端,所以我认为仅此一项是值得的。
原创声明:本文系作者授权爱码网发表,未经许可,不得转载;
原文地址:https://www.likecs.com/show-308630869.html