在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)
键值查找,无论规模如何,它都具有接近恒定的性能。
这使得随着扩展并打开新用例时使用IDS非常快。
灵活性
现在是时候做一些真正的魔术了
是时候到达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。
如果这引发了一些想法,也许您一直想要的东西是可能的,我们很乐意收到您的来信!