云计算设计模式(十二)——索引表模式

创建索引过的被查询条件经常被引用的数据存储等领域。这种模式可以通过允许应用程序更快速地定位数据来从数据存储中检索提高查询性能。

背景和问题

许多数据存储通过使用主键组织为实体的集合的数据。应用程序可以使用此键来查找和检索数据。图1显示了一个数据存储区保持顾客的信息的例子。主键是客户ID。

图1  - 按主键组织的客户信息(客户ID)

而主键是该取基于该关键字的值的数据的查询宝贵的,应用程序可能不能够使用主键是否需要基于其它字段来检索数据。在顾客例如,应用程序不能使用该客户ID主键来检索客户,如果它通过指定引用的一些其他属性的值,如在其中客户位于镇标准查询数据完全。要执行一个查询,如这可能需要申请获取并检查每一个客户的记录,这可能是一个缓慢的过程。

许多关系数据库管理系统支持二级索引。一种二次指数是由一个或多个非主(辅助)键领域举办一个单独的数据结构,它表示,其中每个索引值的数据被存储。在一第二索引的项目通常排序方法的第二个键的值,使数据的快速查找。这些指标通常是由数据库管理系统自动进行维护。

由于需要支持您的应用程序执行不同的查询,您可以创建任意多个二级指标。例如,在一个关系数据库中凡客ID是主键的表的客户,也可能是有益的补充辅助指数在镇域如果应用程序频繁查找的客户在其居住的小镇。

然而,尽管二级指标是关系型系统的共同特征,使用云应用大部分NoSQL数据存储不提供同等的功能。

解决方案

如果数据存储不支持??二级索引,你可以通过创建自己的索引表手动效仿他们。索引表由指定的键组织数据。三种策略通常用于构建一个索引表,这取决于所需要的二次索引的数目和该应用程序执行的查询的性质: 
•重复数据的每个索引表中,而是由不同的密钥(完全非规范化)组织它。图2显示了索引表的组织包括城市和姓氏相同的客户信息:

图2 - 索引表执行二级指标的客户数据。数据被复制到每个索引表中。

如果比较的时候,它是通过使用每个键查询的数目的数据是相对静态的这一策略可能是适当的。如果数据是更加动态,保持每个索引表的处理开销可能会变得太大,这种方法是有用的。此外,如果数据量非常大,空间来存储重复的数据所需要的量将显著。

•创建由不同的密钥组织的归索引表和通过使用主键而不是重复它引用原始数据,如示于图3中的原始数据被称为一个事实表:

图3 - 索引表执行二级指标的客户数据。该数据是由每个索引表所引用。

这种技术可以节省空间,降低了维护的重复数据的开销。的缺点是,一个应用程序具有通过使用第二密钥来执行两个查找操作以查找数据(找到的主键的索引表中的数据,然后查找在事实表中的数据通过使用主键)。

•创建由重复的频繁检索的字段不同的按键组织的部分归索引表。引用原始数据来访问较少频繁访问的字段。图4示出了这种结构。

图4 - 索引表执行二级指标的客户数据。经常访问的数据是重复的每个索引表中。

使用这种技术,你可以前两种方法之间取得平衡。可以快速地检索到通过使用单个查找,常用的查询数据,而空间和维护开销是不一样大,复制整个数据集。

如果应用程序通过指定值的组合频繁地查询数据(例如,“查找生活在雷德蒙和具有史密斯的姓所有客户”),则可以实现键的索引表中的项目作为一个级联城市属性和姓氏属性的,如示于图5中的键由镇排序,然后通过名字为那些具有镇相同的值的记录。

图5 - 基于复合主键索引表

索引表可以加快了分片的数据查询操作,并在那里的碎片密钥散列特别有用。图6显示了一个示例,其中分片密钥是客户ID的散列。索引表可以由非散列值(城市和名字)组织数据,并提供该哈希分片键作为查找数据。这样可以节省从重复计算散列键的应用(其可以是昂贵的操作),如果它需要检索的数据落在一个范围之内,或者它需要读取的数据,以便在非散列密钥。例如,诸如“查找生活在雷德蒙所有客户”可以由通过定位在索引表中的匹配项(其全部存储在一个连续的块),并按照引用的客户数据尽快解决的查询使用存储在索引表中的碎片的键。

图6  - 索引表中提供了快速查找的分片数据

问题和注意事项

在决定如何实现这个模式时,请考虑以下几点: 
•保持辅助索引的开销可能是显著。你必须分析和了解,您的应用程序使用的查询。只创建他们很可能被经常使用的索引表。不要投机创建索引的表,以支持应用程序不执行查询,或者一个应用程序只执行非常偶然。 
•在索引表中复制的数据所用的存储成本和维护数据的多个副本所需的工作条件添加显著开销。 
•执行一个索引表,作为标准化的结构,引用原始数据可能需要的应用程序,以执行两个查找操作以查找数据。第一操作搜索索引表来检索主键,第二个使用的主密钥来获取数据。 
•如果系统包含大量索引表在非常大的数据集,也可以是难以维持索引表和原始数据之间的一致性。有可能设计围绕最终一致性模型的应用。例如,插入,更新或删除数据,一个应用程序可以发送一条消息给一个队列,并让一个独立的任务执行操作和维护引用该数据不同步的索引表。有关实现最终一致性的更多信息,请参阅数据一致性底漆。

注意:

微软Azure存储表支持事务更新到同一个分区中保存的数据进行更改(简称实体组的事务)。如果你可以存储一个事实表和在同一个分区的一个或多个索引表中的数据,您可以使用此功能来帮助确保一致性。

•索引表可以自行进行分区或分片。

何时使用这个模式

使用这种模式来提高查询性能,当应用程序经常需要使用一键以外的主(或子库)键来检索数据。

这种模式可能不适合时: 
•数据是不稳定的。索引表可能变得过时的速度非常快,使其无效,或者使保持在索引表大于用它制成的任何节省的开销。 
•选作索引表中的二级密钥的场是非常不鉴别,只能有一个小的值的集合(例如,性别)。 
•数据值的选择为一个索引表中的二级密钥的场的平衡是高度倾斜。例如,如果90%的记录中包含相同的值中的一个字段,然后创建和维护一个索引表中查找基于该字段中的数据可以施加更大的开销比通过数据扫描顺序。然而,如果查询非常频繁地针对位于对剩余的10%的值,该索引可以是有用的。你必须明白的疑问,您的应用程序正在执行,以及如何他们经常执行。

例子

Azure存储表在云中运行的应用程序提供了一个高度可扩展的键/值数据存储。应用程序存储,并通过指定一个键检索数据值。的数据值可以包含多个字段,但一个数据项的结构是不透明的表存储,这仅仅处理一个数据项作为一个字节数组。

Azure存储表还支持分片。分片密钥包括两个元件,一个分区键和行密钥。有相同的分区键的数据项都存储在同一分区(碎片),并且项目被存储在一个子库中排键顺序。表存储优化用于执行获取数据下降分区中的连续范围的行键值范围内的查询。如果您正在构建存储在Azure的表的信息的云应用,你应该组织你的数据在考虑这个功能。

例如,考虑存储有关电影的信息的应用程序。应用程序经常按流派查询电影(动作片,纪录片,历史,喜剧,戏剧,等等)。可以通过使用类型作为分区键,并指定电影的名称作为行密钥创建一个天青表的分区的每个类型,如图7。

图7  - 存储在Azure Table中的电影数据,按流派划分和排序的电影名称

这种方法不太有效,如果该应用程序还需要通过演员主演查询电影。在这种情况下,你可以创建一个单独的Azure表作为一个索引表。分区键是演员和行关键是电影的名字。对于每个演员的数据将被存储在单独的分区。如果一个电影明星不止一个演员,同一部电影会出现在多个分区。

可以通过采用上面的解决方案部分中所述的第一种方式重复在每个分区中保存的值的电影数据。然而,很可能是每个影片将(对于每个演员一次)重复几次,所以它可能是更有效的,以部分非规范化,以支持最常见的查询(如其他演员的姓名)的数据,并实现一个应用程序由包括必要找到在体裁分区的完整信息,分区键来检索任何剩余的细节。这种方法是通过在解决方案部分中的第三项中的说明。图8描述了这种方法。

图8  - 演员分区作为索引表的影像数据

本文翻译自MSDN:http://msdn.microsoft.com/en-us/library/dn589791.aspx

时间: 2024-10-06 10:30:48

云计算设计模式(十二)——索引表模式的相关文章

设计模式 ( 十二 ) 职责链模式(Chain of Responsibility)(对象行为)

 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决.不能解决就推卸给另外个一个部门(对象).至于究竟谁来解决问题呢?政府部门就是为了能够避免屁民的请求与官员之间耦合在一起,让多个(部门)对象都有可能接收请求,将这些(部门)对象连接成一条链,而且沿着这条链传递请求.直到有(部门)对象处理它为止. 样例1:js的事件浮升机制 样例2: 2.问题 假设有多个对象都有

云计算设计模式(二)——断路器模式

云计算设计模式(二)--断路器模式 处理故障连接到远程服务或资源时,可能需要耗费大量的时间.这种模式可以提高应用程序的稳定性和灵活性. 背景和问题 在分布式环境中,如在云,其中,应用程序执行访问远程资源和服务的操作,有可能对这些操作的失败是由于瞬时故障,如慢的网络连接,超时,或者被过度使用的资源或暂时不可用.这些故障一般之后的短时间内纠正自己,和一个强大的云应用应该准备使用的策略来处理它们,例如,通过重试模式进行说明. 但是,也可以是其中的故障是由于那些不容易预见的突发事件的情况下,这可能需要更

设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型)

1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就推卸给另外个一个部门(对象).至于到底谁来解决这个问题呢?政府部门就是为了可以避免屁民的请求与官员之间耦合在一起,让多个(部门)对象都有可能接收请求,将这些(部门)对象连接成一条链,并且沿着这条链传递请求,直到有(部门)对象处理它为止. 例子1:js的事件浮升机制 例子2: 2.问题 如果有多个对象都有可能接受请求,如何避免避免请求发送者与接收者耦合在一起呢? 3.解决方案 职责链模式(Ch

JAVA设计模式十二--State(状态模式)

状态模式(State Pattern)是设计模式的一种,属于行为模式. 定义(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化.意图:允许一个对象在其内部状态改变时改变它的行为适用场景: 1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为. 2.一个操作中含有庞大的多分支结

云计算设计模式(二十四)——仆人键模式

云计算设计模式(二十四)——仆人键模式 使用一个令牌或密钥,向客户提供受限制的直接访问特定的资源或服务,以便由应用程序代码卸载数据传输操作.这个模式是在使用云托管的存储系统或队列的应用中特别有用,并且可以最大限度地降低成本,最大限度地提高可扩展性和性能. 背景和问题 客户端程序和网络浏览器经常需要读取和写入文件或数据流,并从一个应用程序的存储空间.通常,应用程序将处理的运动数据,或者通过从存储读取它,并将其传输到客户端,或通过从客户机读取该载流并将其存储在数据存储中.然而,这种方法吸收了宝贵的资

云计算设计模式(二十)——调度程序代理管理者模式

云计算设计模式(二十)——调度程序代理管理者模式 协调一系列在分布式服务集和其他远程资源的的行为,试图透明地处理故障,如果这些操作失败,或撤销,如果系统不能从故障中恢复执行工作的影响.这种模式可以分布式系统中增加弹性和灵活性,使之恢复和重试失败是由于短暂的异常,持久的故障和处理故障等操作. 背景和问题 应用程序执行其包括多个步骤,其中的一些可以调用远程服务或访问远程资源的任务.各个步骤可以是相互独立的,但它们是由实现该任务的应用程序逻辑编排. 只要有可能,应用程序应该确保任务运行完成和解决远程访

云计算设计模式(二十三)——Throttling节流模式

云计算设计模式(二十三)——Throttling节流模式 控制由应用程序使用,一个单独的租户或整个服务的一个实例的资源的消耗.这种模式可以允许系统继续运行并满足服务水平协议,即使当增加需求的资源放置一个极端载荷. 背景和问题 在云应用负载通常上变化的基础上的活动用户的数量或他们正在执行的活动类型的时间.例如,多个用户可能会在工作时间被激活,否则系统可能被要求在每月结束时执行计算昂贵的分析.也有可能是突然和意外的突发活动.如果系统的处理要求超过了可用的资源的能力,其将遭受性能不佳,甚至会失败.该系

设计模式(十二)外观模式(结构型)

概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性.例子:一个电源总开关可以控制四盏灯.一个风扇.一台空调和一台电视机的启动和关闭.该电源总开关可以同时控制上述所有电器设备,电源总开关即为该系统的外观模式设计. 问题 为了降低复杂性,常常将系统划分为若干个子系统.但是如何做到各个系统之间的通信和相互依赖关系达到最小呢?  解决方案                                    

云计算设计模式(二十一)——Sharding分片模式

云计算设计模式(二十一)——Sharding分片模式 将一个数据存储到一组水平分区或碎片.存储和访问大量数据时,这个模式可以提高可扩展性. 背景和问题 由一个单一的服务器托管的数据存储区可能会受到以下限制:•存储空间.一种数据存储为一个大型云应用可以预期含有数据量巨大,可以随着时间的推移显著增加.服务器通常提供的磁盘存储仅是有限的,但它可以是能与较大的取代现有的磁盘,或者添加另外的磁盘的机器作为数据量的增加.然而,由此,不能够容易地增加一个给定的服务器上的存储容量的系统最终将达到一个硬限制.•计

【COCOS2DX-LUA 脚本开发之十二】Hybrid模式-利用AssetsManager实现在线更新脚本文件lua、js、图片等资源(免去平台审核周期)

转载自:http://www.himigame.com/iphone-cocos2dx/1354.html 首先说明一个问题: 为什么要在线更新资源和脚本文件!? 对于此问题,那要说的太多了,简单概括,如果你的项目已经在google play 或Apple Store 等平台上架了,那么当你项目需要做一些活动或者修改前端的一些代码等那么你需要重新提交一个新版本给平台,这时候你的上架时候是个不确定的时候,具体什么时候能上架,主要跟平台有关,你再着急,也没有用的. 那么如果你的项目是使用脚本语言进行