根据SurrealDB-Documentation,SurrealDB 中的预计算表类似于关系数据库中的视图。但当元素被删除时,它们的行为似乎有点不同。
基本上,预计算表似乎是 SELECT 语句的捷径(也可以视为 SQL 视图)。但我不明白,预计算表如何对已删除的项目进行不同的处理。请给我一个提示好吗?
我在[surrealist.app](surrealist.app)的“沙盒”中做了以下操作:
item
表,其中包含类别和金额字段:DEFINE TABLE item SCHEMAFULL;
DEFINE FIELD category ON TABLE item TYPE string;
DEFINE FIELD amount ON TABLE item TYPE number;
categories
,其中包含 GROUP BY 子句和一些窗口函数。DEFINE TABLE categories AS
SELECT category,
math::sum(amount) AS sum,
count() as count,
math::max(amount) as max
FROM item
GROUP BY category;
CREATE item:A SET category="green", amount=2;
CREATE item:B SET category="green", amount=3;
CREATE item:C SET category="blue", amount=4;
item:C
。因此,没有留下“蓝色”类别的项目。DELETE item:C;
item
显示删除项目:C(以及类别“蓝色”):SELECT * FROM item;
我得到:
[
{
"amount": 2,
"category": "green",
"id": "item:A"
},
{
"amount": 3,
"category": "green",
"id": "item:B"
}
]
categories
时,类别“蓝色”仍然存在(与我的预期相反)。正如预期的那样,它没有行(计数)且总和为 0。但是,再次与我的预期相反,“蓝色”类别具有最大值:SELECT * FROM categories;
我得到:
{
"category": "blue",
"count": 0,
"id": "categories:['blue']",
"max": 4,
"sum": 0
},
{
"category": "green",
"count": 2,
"id": "categories:['green']",
"max": 3,
"sum": 5
}
]
SELECT category,
math::sum(amount) AS sum,
count() as count,
math::max(amount) as max
FROM item
GROUP BY category;
我只得到“绿色”类别:
[
{
"category": "green",
"count": 2,
"max": 3,
"sum": 5
}
]
最后,文档想要说明预计算的 SurrealDB 表和关系数据库视图之间的“相似性”是什么?处理删除元素有什么区别?
来自 SurrealDB 的 Alexander。
我们的“预计算表视图”类似于物化视图,而不是典型视图。将在文档中更新。
它们在插入/删除数据时增量更新,这比典型视图的性能更高,因为您不需要每次都运行整个 select 语句。
话虽如此,这里似乎可能存在错误,我们将对此进行调查。
我为此创建了一个错误问题,您可以在此处跟踪: https://github.com/surrealdb/surrealdb/issues/3546