删除元素时 SurrealDB 和 SQL-Views 中预计算表的区别?

问题描述 投票:0回答:1

根据SurrealDB-Documentation,SurrealDB 中的预计算表类似于关系数据库中的视图。但当元素被删除时,它们的行为似乎有点不同。

基本上,预计算表似乎是 SELECT 语句的捷径(也可以视为 SQL 视图)。但我不明白,预计算表如何对已删除的项目进行不同的处理。请给我一个提示好吗?

我在[surrealist.app](surrealist.app)的“沙盒”中做了以下操作:

  1. 定义简单的
    item
    表,其中包含类别和金额字段:
DEFINE TABLE item SCHEMAFULL;
DEFINE FIELD category ON TABLE item TYPE string;
DEFINE FIELD amount ON TABLE item TYPE number;
  1. 我创建了一个预先计算的表
    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;
  1. 我添加了两项“绿色”类别和一项(项目:C)“蓝色”类别。
CREATE item:A SET category="green", amount=2;
CREATE item:B SET category="green", amount=3;
CREATE item:C SET category="blue", amount=4;
  1. 我删除了
    item:C
    。因此,没有留下“蓝色”类别的项目。
DELETE item:C;
  1. 简单选择 TABLE
    item
    显示删除项目:C(以及类别“蓝色”):
SELECT * FROM item;

我得到:

[
    {
        "amount": 2,
        "category": "green",
        "id": "item:A"
    },
    {
        "amount": 3,
        "category": "green",
        "id": "item:B"
    }
]
  1. 但是当我在预先计算的表上执行 SELECT
    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
    }
]
  1. 我所期望的,可以通过 SELECT 语句本身来重现,它作为预计算表定义的基础:
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 表和关系数据库视图之间的“相似性”是什么?处理删除元素有什么区别?

view surrealdb
1个回答
0
投票

来自 SurrealDB 的 Alexander。

我们的“预计算表视图”类似于物化视图,而不是典型视图。将在文档中更新。

它们在插入/删除数据时增量更新,这比典型视图的性能更高,因为您不需要每次都运行整个 select 语句。

话虽如此,这里似乎可能存在错误,我们将对此进行调查。

我为此创建了一个错误问题,您可以在此处跟踪: https://github.com/surrealdb/surrealdb/issues/3546

© www.soinside.com 2019 - 2024. All rights reserved.