SurreAldB的改变生活的魔力 - 记录ID
#database #data #surrealdb

在SurreAldB,我们都是为了为开发人员带来欢乐的事情 -
不断令人惊讶和喜悦的事物之一是谦虚的记录ID,我们在our live stream中讨论了。

远非无聊的数字,您的查询可能是神奇的。

不进一步的ADO,那么,让我们学习一些超现实的魔法! -

外观和感觉

首先要意识到的是,在SursteLDB中,记录ID具有两个部分,一个表名和一个记录标识符,看起来像该table:record

默认情况下,当您创建表格create internet时,分配了一个随机ID。这不同于您可能习惯的自动插入或串行ID的传统默认值。

这使您可以避免常见问题,例如:

  • 对数据库的并发性和可扩展性的影响。
  • 通过使用URL中使用ID,提供数据大小和速度的意外信息披露。
  • 跨表或表碎片的非唯一性跨分布式节点

典型的解决方案是使用诸如我们默认的rand()之类的加密保护的随机生成的标识符,但是您也可以使用ulid()uuid()

简而

让我们退后一步,查看比较SQL和SERTEALQL的最简单示例,在其中我们从表中选择一个ID。

sql

select * from internet
where id = 1337

只是一个完全普通的例子,没有什么特别的。

超级Ql

select * from internet:leet

在这里,我们可以看到一些新的东西。我们可以从语句中过滤到记录!

这将是:
的速记示例

select * from internet
where id = internet:leet

现在让我们加强一点。如果我们需要选择一系列ID怎么办?

sql

-- Over 9000!
select * from internet
where id > 9000

-- less than 9000
select * from internet
where id < 9000

-- between 9000 and 10000
select * from internet
where id > 9000
and id < 10000

超级Ql

-- Over 9000!
select * from internet:9000..

-- less than 9000
select * from internet:..9000

-- between 9000 and 10000
select * from internet:9000..10000

但是,这不仅仅是一些句法糖!

要了解为什么,我们需要谈论算法复杂性...不用担心。并不是那么复杂ð

大规模表现

在最简单的术语中,算法只是一系列步骤的配方(执行此操作,然后是)。因此,算法复杂性(通常是用asymptotic/big O notation进行的)只是一种估计序列中可能存在多少步骤的方法。步骤越越好。

使用SurstealQl,在使用记录ID进行CRUD时,您不必进行表扫描,这会慢慢获得更多的数据。这是因为算法大多数数据库都使用的是O(log n),而不是sursealdb中的O(1)键值查找,无论规模如何,它都具有接近恒定的性能。

big-o

这使得随着扩展并打开新用例时使用IDS非常快。

灵活性

现在是时候做一些真正的魔术了

morpheus-free-your-mind

是时候到达free your mind并重新考虑ID的可能。

SurreAldB的复杂记录ID支持动态表达式,允许参数和函数表达式用作ID中的值!

这在各种方式上很有用,例如时间序列上下文或表格中特定记录之间的位置。随着ID查找的性能,无论大小如何!

虽然这不能替换数据的传统索引或分区,但它提供了以表现方式对数据进行建模的额外灵活性。

让我们看一个创建基于对象的记录ID的示例

-- Set a new parameter
LET $now = time::now();
-- Create a record with a complex ID using an object
CREATE temperature:{ location: 'London', date: $now } SET
    location = 'London',
    date = $now,
    temperature = 23.7
;

您还可以创建基于数组的记录ID

-- Set a new parameter
LET $now = time::now();
-- Create a record with a complex ID using an array
CREATE temperature:['London', $now] SET
    location = 'London',
    date = $now,
    temperature = 23.7
;

您可以像这样查询

-- Select all records for a particular location, inclusive
SELECT * FROM temperature:['London', NONE]..=['London', time::now()];

-- Select all temperature records with IDs between the specified range
SELECT * FROM temperature:['London', '2022-08-29T08:03:39']..['London', '2022-08-29T08:09:31'];

,您可以看到,几乎唯一的记录ID的限制是your imagination

未来

我们刚刚划过了您可以使用记录ID的表面。如果您想更深入地挖掘,请看一下our stream about Record IDs,具有更强大的功能,或者查看our documentation

如果这引发了一些想法,也许您一直想要的东西是可能的,我们很乐意收到您的来信!

您会在所有通常的地方找到我们,包括我们的discordGitHub