
什么是视图?
视图是一个已保存的查询,它在数据库中充当虚拟表。你可以像操作真实表一样与视图进行交互,但视图本身不存储数据——相反,每次引用视图时,数据库都会运行底层查询。
数据库视图允许你组合来自多个表的信息,并以最适合需要查询它的人的方式格式化这些信息。你可以(或数据库管理员)创建一个视图来隐藏杂乱表格中不必要的字段,或连接表格以汇集相关数据。通过将视图作为起点,人们就不需要每次都运行相同的复杂查询来回答他们实际的数据问题。
查询视图的缺点是,这些查询可能需要很长时间才能运行,特别是如果该视图是由多个表或多个联接的结果构成的。
数据库管理员还出于安全目的使用视图,例如创建隐藏基本表中某些字段的视图。这样,其他用户仍然可以访问和查询他们需要的数据,而无需访问敏感字段或行。
视图与物化视图
如果视图是虚拟表(按需计算),那么物化视图就像数据库中的常规表。视图需要每次引用时都重新运行查询,而物化视图是一个已预先计算并保存在数据库中的视图。因此,物化视图会占用数据库空间,但由于数据库不必每次都计算物化视图,因此在查询时它们的性能比标准数据库视图快得多(这就像查询一个普通表)。
何时应该(以及不应该)使用数据库视图
在数据库中创建视图是一个好主意,如果
-
你需要定期访问复杂查询的结果,并且不想每次都输入该查询。
-
你想通过限制对敏感信息的访问来加强数据库安全性。
-
你想在不更改数据库底层结构的情况下创建自定义列。
-
你想通过隐藏不太可能被查询的字段来简化表格的外观。
但是,如果数据库的底层结构会发生变化,你可能不想依赖视图;一旦字段名称更改,你建立为视图的查询可能会中断。
你的 BI 工具可能也有类似视图的功能,无论是模型、已保存的问题还是SQL 片段。这里重要的区别是,这些功能都存在于 BI 工具的世界中,而视图(无论是物化还是非物化)都内置于数据库本身。
示例视图
使用 Metabase 的示例数据库,假设我们想基于 People 表创建一个视图,让宾夕法尼亚州的团队可以访问 PA 客户的姓名、地址、生日和电子邮件等信息,但不包括用户密码。
此练习依赖于预定义的示例数据集,但你也可以使用AI 数据集生成器生成自己的练习数据。
我们将在数据库中通过运行下面的查询来创建该视图,该查询将创建名为 pennsylvania_customers 的视图,仅包含 People 表中我们想要的列,并且仅显示 State 字段值是宾夕法尼亚州(PA)缩写的记录。
CREATE VIEW pennsylvania_customers
AS
SELECT
id
address
email
name
city
state
birth_date
zip
created_at
FROM
people
WHERE state = 'PA'
然后,在未来的查询中,宾夕法尼亚州的团队可以通过以 pennsylvania_customers 作为起点来访问有关其客户群的所需信息。
虽然视图是任何基于 SQL 的数据库或数据仓库的一个非常基本的功能,但创建、物化和维护它们的具体方法可能会因你使用的数据库软件或数据仓库而异。