Metabase 如何与您的数据库协同工作

Metabase 不存储您的数据。了解 Metabase 如何查询数据库中的数据,如何使用元数据实现一些神奇的功能,以及如何通过缓存查询和持久化模型来加速处理。

Metabase and your database

Metabase 不存储您的数据

Metabase 是一个用于查询数据库数据并可视化结果的工具(Metabase 还有许多其他功能,但我们现在不关注这些)。但它不像其他一些 BI 工具那样会存储您的数据。通过 Metabase,基本设置是:

  • 您将 Metabase 连接到您的数据库。
  • 您在 Metabase 中编写查询(可以在查询生成器或原生代码编辑器中完成)
  • Metabase 将 SQL 发送到数据库。
  • 您的数据库处理查询,然后将结果发送回 Metabase。
  • Metabase 将您的数据转化为漂亮的图表(仪表板上的图表)。

Metabase 本身不会从您的数据库中提取数据来处理您的查询——所有这些处理都发生在您数据库的内部。Metabase 只会看到您编写的查询以及查询返回的结果。

这里有几个细微之处,因为 Metabase 确实会对您数据库的元数据进行一些轻量级的查询,以便它知道如何处理数据库返回给它的结果。所以我们来逐一讲解。

使用 Metabase 查询数据库

在 Metabase 中创建查询有两种方式:使用 SQL(如果您连接到 MongoDB,则是 MongoDB 查询语言),以及使用图形化查询生成器。

原生查询

当您用 SQL(或 MongoDB 查询语言)编写查询时,Metabase 只是将该查询发送到您的数据库。

您在原生编辑器中编写的代码就像一个黑盒子:Metabase 不会解析您的 SQL,所以它不知道查询中实际发生了什么,比如您连接了哪些表、选择了哪些列,或者您如何过滤和聚合数据。由于该查询是一个黑盒子,Metabase 也无法了解太多关于结果的信息,因此它无法提供诸如细分、钻取或自动图表之类的功能。

查询构建器

查询生成器中,您将查询从连接、过滤器或摘要等构件组装起来。

Query builder

但是,如果您使用查询生成器,那么 Metabase 会确切地知道您的查询中发生了什么——涉及哪些表、列的类型是什么、执行了哪些操作以及顺序如何——它可以使用这些信息为您提供更多功能。例如,如果 Metabase 知道您的查询中有一个聚合,它可以为您提供一个反聚合结果的选项——以便钻取到单个记录;或者,如果 Metabase 发现您正在根据日期列进行筛选,它可以为您提供一个日历小部件;如果它注意到您正在按类别变量分组,它可以自动构建一个带有这些类别的条形图。

Bar chart with categories, and a calendar filter widget

查询生成器中的所有这些按钮点击都会转化为发送到数据库的 SQL(您可以查看它生成的 SQL),但是能够访问每个单独的查询元素是实现 Metabase 大部分神奇功能的原因。

但现在您可能会问:如果 Metabase 不存储我的数据,它是如何知道我有一个日期列,或者我有哪些类别的?

Metabase 如何了解您的数据

Metabase 使用同步来了解您的数据库模式:例如数据库中有哪些表、它们的列和类型是什么等等。从基本层面来说,同步仍然是 Metabase 发送并由您的数据库执行的查询,但这是一种特殊的查询:这些查询不是返回数据本身,而是返回元数据。

Metabase 还运行扫描来对列中的值进行采样。这使得 Metabase 能够为您提供诸如过滤器中的下拉选项之类的功能。

Filter dropdown

值得注意的是,Metabase 只从列中获取样本,它不会存储完整的列——这些列仍然在您的数据库中。它只扫描人们使用的字段(例如,仪表板上过滤器中使用的字段的值)。您也可以关闭这些同步。

由于 Metabase 需要在向数据库发送查询之前了解有关您数据的信息(以便为日期列提供日历小部件),因此它需要将此信息存储在某处并定期更新。这个地方就是 Metabase 的应用程序数据库

Metabase 应用程序数据库

Metabase 的应用程序数据库是一个数据库(独立于您连接 Metabase 的数据库),Metabase 在其中存储其所有应用程序数据:用户的账户、设置、保存的问题、日志——以及有关您连接的数据库的元数据(例如列及其类型)。

当您在查询生成器中构建查询时,Metabase 可以在应用程序数据库中查找有关您数据的信,并使用该信息为您提供过滤器小部件、图表类型和钻取功能。

(如果您使用的是 Metabase Cloud,您永远不必考虑应用程序数据库——Metabase Cloud 会为您处理。但如果您是自托管,则需要配置一个单独的数据库作为应用程序数据库。)

缓存查询结果

也许您的团队经常查看某个仪表板,例如包含公司指标的仪表板。每次有人打开仪表板时,Metabase 都会将查询发送到数据库,让数据库执行它们,并检索结果。但是,如果结果不经常更改——例如,您可能显示的是每三个月才更改一次的季度指标——那么就没有必要每天都让数据库重新计算这些数字。

您可以告诉 Metabase 将结果缓存到其应用程序数据库中(而不是您连接的数据库)。这样,当有人访问缓存的仪表板时,仪表板会加载得更快,因为您的数据库只会将预先计算好的结果返回给 Metabase。

Metabase 只会缓存结果。例如,如果您的查询计算了上个月售出的商品数量,Metabase 只会缓存这个数字,而不是关于商品的数据。您的数据仍然在您的数据库中。

将模型持久化回您的数据库

Metabase 有模型——您在 Metabase 中构建的派生数据集,以便人们更容易提出问题。要构建模型,您可以编写一个查询(使用 SQL 或查询生成器),然后人们就可以使用该模型作为数据源,就像它是一个表一样。

由于模型是从查询构建的,因此每当有人基于模型提出问题时,Metabase 都需要执行一些额外的处理。例如,如果有人请求 Orders 模型中的订单计数,发送到数据库的查询会比简单的SELECT COUNT(*) FROM orders更复杂,因为 Orders 模型本身是由一个查询定义的。

对于大型模型来说,这可能会变得昂贵且耗时。因此,对于某些数据库,您可以启用模型持久化,这意味着 Metabase 将这些模型存储在您的数据库中作为实际的表。例如,如果您持久化了 Orders 模型,那么 Metabase 将在您的数据库中创建一个实际的orders表(好吧,它不一定叫orders,但您懂我的意思),并且每当有人请求 Orders 模型中的订单计数时,您的数据库就可以直接返回该预先计算好的表。

后续步骤

这有帮助吗?

感谢您的反馈!
订阅新闻通讯
Metabase 的更新和新闻
© . This site is unofficial and not affiliated with Metabase, Inc.