Materialized-View Pattern

Materialized-View模式是在要求数据格式不利于查询操作的情况下,根据多个数据仓库的数据生成预生成的视图的一种模式。这种模式可以帮助支持高效的查询和数据提取,提高应用程序的性能。

问题

在存储数据时,开发人员和数据管理员考虑的第一优先级通常集中在如何存储数据,而不是如何读取数据。所选择的存储格式通常与数据的格式、管理数据大小和数据完整性的要求,以及存储的类型密切相关。例如,使用NoSQL存储文档时,数据通常被表示为多个元素的聚合结构,其中包含了所有的实体的信息。

然而,这可能会对查询产生负面影响。当一个查询需要从多个实体的数据获取他们的子集的时候,如需要一些客户的订单摘要信息,但是不需要所有的订单细节,查询仍然需要提取相关实体的所有数据,才能获得所需的信息。

解决方法

为了支持高效的查询,常见的解决方法是提前生成所需要的数据格式的结果集。Materialized-View模式描述了在那种源数据格式不适用于查询的数据格式,或是生成合适的查询比较困难,或是查询性能低下的的环境中,生成在预填充的视图。

这些Materialized视图只包含查询所需的数据,允许应用程序快速获取所需信息。除了Join表或组合数据实体外,Materialized视图还可以计算列或数据项的当前值、数据项的值组合或执行转换的结果,以及指定为查询的一部分的值等等。一个Materialized视图甚至可以仅针对一个查询进行优化。

Materialized视图的关键就在于它所包含的数据完全是自由使用的,因为它可以完全从源数据存储重建。一个Materialized视图永远不会被应用程序直接更新,所以它实际上是一种特殊的缓存。

当视图的源数据更改时,视图必须更新以包含新信息。更新操作可以通过定时任务来调度,或当系统检测到原始数据的变化时触发。在其他情况下,可能需要手动重新生成视图。

图1.Materialized-View模式

问题和实现Materialized-View模式需要考虑的问题

在决定如何实现这个模式时,考虑以下几点:

何时使用Materialized View模式

Materialized-View模式非常适合以下的一些场景:

Materialized-View模式在如下场景不适合:

使用举例

图2展示了一个使用Materialized-View模式的例子。在Windows Azure存储账户中,Order,OrderItem以及Customer表中不同分区的数据组合了一个视图,生成了一个包含了每种电子产品总销量的数据,同时包含了购买的客户的数量。

图2.使用Materialized-View模式生成销售摘要

创建满足这样需求的视图需要复杂的查询。然而,通过将查询结果显示为Materialized视图,用户可以很容易地得到结果并直接使用它们或将它们合并到另一个查询中。该视图可能被用于报表系统或仪表板,还可以在预定的基础上如每周更新。

虽然这个例子利用Windows Azure表存储,许多关系型数据库管理系统也对Materialized视图提供了本地支持。

相关的其它模式

在考虑实现Materialized-View模式的时候,也可以参考如下其它模式: