我了解了一个名为 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/json
    • NS: test
    • DB: test
  • 正文:SurrealQL 查询语句

HTTP 标头NSDB 指定命名空间和数据库名称。数据库名称是与 RDB 具有相同概念的多个表的集合。 SurrealDB 也有命名空间的概念,命名空间是多个数据库的集合。

查询示例

在上述 HTTP 请求的正文部分发送每个 SurrealQL 查询文本。

连接测试

超现实主义QL
INFO FOR DB;
回复
[
	{
		"time": "110.118µs",
		"status": "OK",
		"result": {
			"dl": {},
			"dt": {},
			"sc": {},
			"tb": {}
		}
	}
]

添加记录

与文档数据库相同无需预先创建表和字段定义.另一方面如果需要,您还可以定义模式和值约束.我们在这里不使用这些功能。

超现实主义QL
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 也可以明确指定。

超现实的QL
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,包括表名(记录链接)是在做。使用子查询指定帐户记录链接。

超现实主义QL
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"
			}
		]
	}
]

获取记录

超现实的QL
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 可以同时从多个表中检索记录。

超现实的QL
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并返回它。

超现实的QL
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 语句用于添加图边。

超现实主义QL
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 的另一种写入方式用于添加记录。

超现实主义QL
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获取所有尚未打开邮件的管理员。

超现实主义QL
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

相关文章:

  • 2021-09-10
  • 2021-08-23
  • 2021-09-01
  • 2021-11-06
  • 2021-10-16
  • 2021-11-14
  • 2021-09-11
  • 2021-12-03
猜你喜欢
  • 2021-04-06
  • 2021-12-08
  • 2021-10-12
  • 2021-11-17
  • 2021-12-02
  • 2021-08-29
相关资源
相似解决方案