什么是视图?
“视图”(**view**)是一种保存的查询,在数据库中像虚拟表一样发挥作用。您可以像操作真实表一样操作视图,但视图本身并不存储数据,而是每次引用视图时,数据库都会运行底层查询。
数据库视图允许您组合来自多个表的信息,并以最适合需要查询这些信息的人员的方式格式化这些信息。您(或数据库管理员)可以创建一个视图,隐藏杂乱表中不需要的字段,或连接表以整合相关数据。通过使用视图作为起点,人们无需每次都运行相同的复杂查询,就可以直接获取他们对数据的实际问题。
查询视图的缺点是,这些查询可能非常耗时,特别是如果该视图是多个表或多个连接的结果。
数据库管理员还出于安全目的使用视图,例如创建视图来隐藏基础表中存在的某些字段。这样,其他用户仍然可以访问和查询他们需要的数据,而无需获得敏感字段或行的访问权限。
视图 vs. 物化视图
如果视图是虚拟表(按需计算),那么**物化视图**则像数据库中的常规表。视图每次引用时都需要重新运行查询,而物化视图是预先计算并保存在数据库中的视图。因此,物化视图会占用数据库空间,但由于数据库无需每次都计算物化视图,因此在查询时其性能比标准数据库视图快得多(就像查询普通表一样)。
何时应该(或不应该)使用数据库视图
如果出现以下情况,在数据库中创建视图是个好主意:
-
您需要定期访问复杂查询的结果,并且不想每次都手动输入该查询。
-
您希望通过限制对敏感信息的访问来加强数据库安全性。
-
您想创建自定义列,而无需更改数据库的底层结构。
-
您希望通过隐藏不太可能被查询的字段来简化表的显示。
然而,如果数据库的底层结构可能发生变化,您可能不应该依赖视图;一旦字段名称发生变化,您已建立为视图的查询就可能失效。
您的 BI 工具可能也具有类似视图的功能,无论是模型、保存的查询还是SQL 片段。这里重要的区别在于,这些都是 BI 工具世界中存在的功能,而视图(无论是物化视图还是非物化视图)则内置于数据库本身。
视图示例
使用 Metabase 的示例数据库,假设我们想基于 People
表创建一个视图,供我们宾夕法尼亚州的团队使用,以访问我们宾夕法尼亚州客户的姓名、地址、生日和电子邮件等信息,但不包括用户密码。
此练习依赖于预定义的示例数据集,但您也可以使用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 的数据库或数据仓库的非常基本的功能,但创建、实现和维护它们的具体方式可能因您使用的数据库软件或数据仓库而异。