Azure设计模式之实例化视图

实例化视图模式


当数据不是查询的理想格式时,可以在一个或多个数据存储区中生成填充视图。用以支持高效的数据提取,并提高应用程序性能。


问题背景
在存储数据时,开发人员和数据管理员通常会关注数据的存储方式,而不是它的读取方式。而存储格式通常与数据格式、数据大小和数据完整性要求以及所使用的存储类型密切相关。例如,当使用NoSQL时,数据通常表示为一系列文档,每个文档包含某实体的所有信息。


但是,这会对查询带来负面影响。当查询只需要来自实体的某数据子集(如某些客户的订单只有概要信息而没有详细信息)时,必须先查询相关实体的所有数据再来提取所需的信息。


解决方案
为了进行高效查询,一个常见的解决方案是预先生成一个视图,用以适配结果集的数据格式。实例化视图模式用于当由于存储环境原因或源数据格式无法进行查询,或查询有性能问题时,可以提供查询视图来满足需求。这些实例化视图只包含查询所需的数据,用于应用程序快速获取所需的信息。除了表连接或合并数据实体外,实例化视图还可以包括用于计算的列或数据项的当前值、组合值或对数据项执行转换的结果,或其他特殊值.实例化视图也可以仅针对单个查询进行优化。


一个关键点在于,实例化视图和它所包含的数据完全可释放,因为它可以基于源数据存储区被重建。实例化视图不由应用程序直接更新,因此它可被看做是特殊的缓存。


当视图的源数据更改时,必须更新视图以更新信息。可以将其实现为自动更新,或者当系统检测到原始数据的更改时执行更新。在某些情况下,可能需要手动重新生成视图。下图显示了使用实例化视图模式的例子。



问题和注意事项
在决定如何实现此模式时,请考虑以下几点:
如何以及何时更新视图。理想情况下,在响应对源数据的事件更改时会被重新生成,但如果源数据经常更改,可能会导致系统过多的性能开销。或者可以考虑使用计划任务、外部触发器或手动操作来重新生成视图。


在某些系统中,例如当使用事件源模式来维护存储的事件时,实例化视图是必需的。通过查询所有事件来确定系统当前状态,填充视图可能是从事件存储中获取信息的唯一方法。如果没有使用事件源,考虑一下实例化视图是否有用。实例化视图往往是专门针对一个或少量查询而设计的。如果使用了许多查询,则实例化视图可能会导致耗费大量的存储成本。


需要考虑生成视图时对数据一致性的影响,以及在更新视图时是否是按计划进行的。如果源数据在生成视图时发生变化,则视图中的数据副本需要与原始数据保持同步。


考虑存储视图的位置。视图不必与原始数据位于同一存储区或分区中。它可以是由几个不同分区组合而成的子集。如果丢失,可以重建视图。因此,如果视图是瞬态的,并且只用于反映数据的当前状态或为了提高可伸缩性或提高查询性能,则可以将其放在缓存中或相对不太可靠的位置。


在定义实例化视图时,应根据现有数据的计算或转换、查询中传递的值或适时对这些值的组合,向其添加数据项或列,从而使它的价值最大化。


在存储机制支持它的地方考虑对实例化视图进行索引,从而提高性能。大多数关系数据库支持对视图创建索引,就像基于ApacheHadoop大型数据解决方案一样。


何时使用此模式
此模式在以下情况下很有用:
对难以直接查询的数据创建实例化视图,或者查询非常复杂,需要查询的数据是结构化和非结构化的组合。
创建一个临时试图,可以显著提高查询性能,或者可以直接用于UI、报表或源数据呈现。


在数据传输时,连接连接到数据源的连接偶尔会断开使其不可用。在这种情况下,可以在本地缓存视图。


以不需要知道源数据格式的情况下,需要封装简化查询。例如,通过在一个或多个数据库中加入不同的表,或NoSQL中的一个或多个域,然后对数据进行格式化以适合最终用途。


提供对源数据中特定子集的访问,出于安全或隐私方面的原因,不希望完全暴露给用户。


桥接不同的数据存储,以使用各自的功能。例如,使用可以使用云存储作为高效的写存储,使用关系数据库来提供查询,并持有实例化视图。


在下列情况下,此模式不适用:
源数据简单且易于查询。


源数据变化非常快,或者可以在不使用视图的情况下进行访问。在这些情况下,应避免产生视图处理的开销。


一致性的优先级很高。而视图可能并不能保证与原始数据完全一致。


例子
下图显示了使用实例化视图模式生成销售汇总的示例。在Azure存储帐户的单独分区中,将订单、订单项和客户表中的数据合并在一起生成一个视图,其中包含每个产品的总销售额,以及每一项购买信息。



创建此实例化视图需要复杂的查询。但是,通过将查询结果公开为实例化视图,用户可以轻松地获取结果并直接使用或将其归并到另一个查询中。该视图可以在报表或仪表板中使用,并且可以按指定频率(如每周)更新。


虽然此示例使用的是Azure的表存储,但许多关系数据库系统也为实例化视图提供了本地部署的支持。


相关阅读
在实现此模式时, 以下模式也可能是相关的:
数据一致性入门(https://msdn.microsoft.com/library/dn589800.aspx)。需要维护实例化视图中的概要信息,以便反映基础数据值。随着数据值的变化,实时更新汇总的数据可能不切实际,因此必须采用最终一致的方法。这篇文章将关于分布式数据保持一致性的问题进行了汇总,并阐述了不同一致性模型的优缺点。


命令和查询职责隔离(CQRS)模式(https://docs.microsoft.com/en-us/azure/architecture/patterns/cqrs)。通过对数据值更改时发生的事件进行响应来更新实例化视图。


事件源模式(https://docs.microsoft.com/en-us/azure/architecture/patterns/event-sourcing)。通常与CQRS模式一起使用,以在实例化视图中维护信息。当实例化视图的数据值被更改时,系统可以引发这些更改的事件并将它们保存在事件存储区中。


索引表模式(https://docs.microsoft.com/en-us/azure/architecture/patterns/index-table)。实例化视图中的数据通常由主键进行组织,但查询中可能也需要检索其他字段数据来拿到视图信息。这个模式可以为不支持二级索引的数据存储来创建索引。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值