年纪大了

第4章 NoSQL数据架构模式 标注 (蓝色) - 4.1 键值存储 > 位置 1493

为什么键值存储如此强大,为什么它们被用于如此多的不同方向?总结起来:它们的简易性和通用性使你的注意力能够从架构设计转移到以下几点来降低数据服务成本,节省了你的时间和金钱。精确的服务级别。精确的服务监控和报警。可扩展性和可靠性。可移植性和低操作成本。 1.精确的服务级别当你拥有一个被许多应用所使用的单一数据服务接口,你就能专注于某些事情,如为数据服务建立精确的服务级别。一个服务级别并不会改变 API,它只会对服务在不同的负载条件下执行的速度和可靠性给出精确的标准。例如,对于任何数据服务你可能有以下规定。返回值的最大读取时间。存储一个新的键值对的最大写入时间。服务可以支持的每秒读操作的次数。服务可以支持的每秒写操作的次数。为增强可靠性,需要创建数据副本的数量。如果某些数据中心出现故障,是否需要进行跨多个地理区域的备份。是否采用数据一致性来保证事务可靠,或者最终一致性也是可以接受的。

第7章 用NoSQL搜索获取信息 标注 (蓝色) - 7.2 搜索分类 > 位置 3186

N- gram搜索—— N- gram搜索是指在搜索可能包含空白字符的内容时,先将需要搜索的内容中的长字符串分割成数个较短的定长字符串(通常是 3个字符)并对这些分割后的字符串建立索引,再在这些索引上执行完全匹配搜索的查找过程。 N- gram索引会占用大量磁盘空间,但它是快速搜索像软件源代码这种(包含空白符在内的所有字符都很重要的)文本数据的唯一方法。 N- gram索引也可用来搜寻存在于类似 DNA序列的长字符串中的潜在模式。

标注 (蓝色) - 7.3 提高NoSQL搜索效率的策略和方法 > 位置 3194

范围索引——范围索引是指用升序的方式为数据库中的所有记录创建索引的方式。范围索引非常适合条件是字母序关键字、日期、时间戳、等于或处于特定值之间的数量等的搜索。范围索引可以用来为任何能够按照某种逻辑顺序排序的数据类型创建索引,而为图片或全文本段落创建范围索引则不那么明智。倒排索引——倒排索引和书籍后面的索引比较类似。在一本书中,每个引用及其出现的页码都会按字母顺序被列在书的最后。可以根据索引中的条目在书中快速找到使用术语的地方。如果没有这些索引,你将不得不通过扫描整本书的方式进行查找。搜索软件也是使用相同的方式来利用倒排索引——针对一堆文本文档中的每个词都有一个包含了所有出现过这个词的文档列表。

标注 (蓝色) - 7.3 提高NoSQL搜索效率的策略和方法 > 位置 3203

类似 Apache Lucene的搜索框架的设计初衷之一就是能够用来创建并管理海量文本的倒排索引。这些倒排索引能够加速文档中的关键字搜索。

标注 (蓝色) - 7.3 提高NoSQL搜索效率的策略和方法 > 位置 3205

搜索排序——搜索排序是指根据用户期望结果相似度排序搜索结果的过程。如果一个文本中某个关键词密度越高,那么这个文本的内容越可能和这个关键词有关。术语“关键词密度”( keyword density)是指一个关键字在一个根据文本大小加权后的文档中出现的次数。如果只是单纯地计算一个文本中词的出现次数,那么内容越多关键词越多的文本总会拥有更高的排序。搜索排序要同时考虑文本中关键词出现次数和文本总词数两个方面,以此避免长文本一直处于搜索结果中前几位的可能。排序算法也考虑诸如文档类型、社交网络中的推荐、与某个特定任务的关联度等其他因素。提取词干——提取词干是指在搜索中将用户以多种形式提供的词干和该词的其他形式相匹配的过程。例如,如果一个人输入一个关键词“ walk”,那么包含 walks、 walked和 walking的文本也可能被包含在搜索结果中。同义词扩展——同义词扩展是指在搜索结果中引入包含搜索关键字同义词的文本的过程。例如,如果用户输入“阿司匹林”作为关键字,那么它的化学名称水杨酸、乙酰水杨酸也可能会被作为关键词进行搜索。 WordNet数据库就是一个利用词库在搜索结果中包含同义词的好例子。实体提取——实体提取是指查找文本中出现的实体并对其打上标签的过程。诸如日期、人名、组织、地理位置和产品名称等类型的对象都应该被实体提取程序打上标签。最常见的标记文本的方法是使用 XML包装元素。像 MarkLogic这样的纯 XML数据库就提供了在文本中自动查找实体并打上标签的功能。通配符搜索——通配符搜索是指通过添加特殊的字符来表明希望查询语句能够匹配上多种字符的过程。多数搜索框架支持后缀通配符。例如,用户输入“ dog*”,搜索程序将会匹配“ dog”、“ dogs”、“ dogged”。可以使用“*”来匹配 0个或多个的字符,而“?”则是匹配单一字符。 Apache Lucene允许在字符串中间使用通配符。多数搜索引擎不支持前导通配符或在一个字符前添加通配符。例如,“* ing”这样的用法是期望匹配所有以“ ing”结尾的词。因为这种类型的搜索的需求并不强烈,而支持这种功能会使现有索引的体积加倍,所以多数搜索引擎不支持这种通配符用法。邻近搜索——邻近搜索是指搜索与文档中某些词距离相近的词。例如,可以查找所有包含“ dog”和“ love”且这两个词之间不超过 20个词的文档。文档中这两个词的距离越近,它在返回的结果中的排序也就越靠前。上下文关键字( KWIC)——上下文关键字库是一种在搜索结果中高亮关键字的工具。一般是通过在搜索结果页面中出现搜索关键字的文档段落上添加一个元素装饰器的方式起到高亮的效果。错别字联想——如果用户在搜索框中输入了一个错别字并且这个字在字典中不存在,那么搜索引擎可能会以“你是不是想搜索……”的方式为用户提供一个替代关键字。这个功能要求搜索引擎能够找到和某个错别字相似的字。

第10章 NoSQL与函数式编程 标注 (蓝色) - 10.1 什么是函数式编程 > 位置 4252

这种可以重复执行多次且不改变数据的转化被称为幂等转化( indempotent transform)或幂等事务。幂等转化指在首次运行时会以固定方式改变环境状态但重复运行这一转化并不会损坏数据的转化过程。

标注 (橙色) - 10.1 什么是函数式编程 > 位置 4256

幂等转化也可以用在事务处理中。因为幂等转化不会更改外部状态,所以我们就不需要进行回滚操作。另外,可以用事务标识符来确保转化的完成状态。例如,如果你正在某个数据上执行一个递增银行账户数据的事务,你可以在银行账户事务历史中记录下这个事务的标识符。接下来,你就可以创建一条只执行事务标识符未被执行的事务的规则。这样就能保证一个事务不会被重复执行。

标注 (蓝色) - 10.1 什么是函数式编程 > 位置 4259

幂等事务允许使用引用透明( referential transparency)这个概念。说一个表达式是引用透明的,就是说在不改变程序行为的前提下可以将其替换为它的值。如果转化过程输出可以被执行实际转化过程的函数调用所替代,那么任何函数式编程语句都是符合这项概念的。引用透明可以使程序员和编译器两者都想出多种方法来优化相同数据集重复调用相同函数。但是这种优化技术的前提是使用函数式编程模式。

第12章 选择合适的NoSQL解决方案

标注 (蓝色) - 12.3 架构权衡分析步骤 > 位置 5066 架构权衡分析步骤现在,你已经组建好了一个客观且代表了多方利益相关者观点的架构选型团队,那么你也就为一个正式的架构权衡过程做好了准备。下面列出了这个流程中涉及的典型步骤。介绍流程——作为开始,为每个团队成员解释清楚架构权衡流程和团队使用这个流程的原因是很重要的。从这个阶段开始,团队应该就团队成员组成、决策制定流程以及过程产出达成一致。这个团队应该了解到这个方法已经久经考验并且有着可查询的正确成功案例。收集需求——接下来,在可操作的情况下收集尽可能多的需求,并将它们存放在一个可以搜索和生成报表的中央化存储结构中。需求数据是典型的半结构化 标注 (蓝色) - 12.3 架构权衡分析步骤 > 位置 5072

数据。因为它们包含了结构化的数据项和描述性文本两种数据。那些不用数据库存储需求的组织通常将他们的需求放在 Word文档或电子表格中,而这种方式使得这些数据非常难以管理。选出会影响架构的重要需求——在收集完需求之后,应该对它们进行审核并选出一个决定架构选择走向的需求子集。过滤出决定架构的核心需求的过程从某种程度来说是很复杂的,应该由团队中有相关经验的成员完成。有时一个很小的需求可能就会要求在架构上做出巨大的变更。选择出的影响架构的重要需求的确切数目取决于项目,但范围一般限制在 10~ 20个。选择 NoSQL架构——选出你想纳入候选项的 NoSQL架构。最可能的候选项一般会包括标准关系型数据库、 OLAP系统、键值存储、列族存储、图存储和文档存储。在这个阶段,不深入具体的产品或实现细节而是了解架构是否契合当前业务问题就显得非常重要了。多数情况下,你可以首先剔除一些明显不合适的架构。例如,如果需要实现事务性更新,那么可以直接将 OLAP实现方式剔除掉。如果

标注 (蓝色) - 12.3 架构权衡分析步骤 > 位置 5081

需要根据键值对中的值部分搜索,那么你还可以将键值存储剔除出去。但这并不意味着你不可以在一个混合系统中引入这些架构,而仅仅是说明它们自身不能解决当前问题。为关键需求创建用例——用例是阐述用户或机会如何与系统交互的描述性文档。它们由清楚业务细节的领域专家( subject matter expert)或业务分析师( business analyst)编写。用例应该足够详尽,这样才方便工作量的分析。根据项目大小和需要的细节,用例可以是简单的句子,也可以是长达数页的文档。许多用例都是围绕数据的生命周期构建的。例如,你可能会有 4个用例:一个添加新记录用例,一个展示记录列表用例,一个搜索数据用例,还有一个导出数据用例。估计每个用例在每个架构下所需要的工作量级别——针对每个用例,需要确定一个粗略的工作量需求级别并制定一个打分标准,例如, 1表示最难, 5表示最容易。在确定好工作量后,需要将为每个用例选择一个合适的数字并填入一个像图 12- 3一样的电子表格中

。 标注 (蓝色) - 12.3 架构权衡分析步骤 > 位置 5092

用加权后的打分结果排名候选架构——在这个阶段,你将结合工作量和某种加权策略为每个架构计算出一个得分。与项目成功相关的关键性元素和易于实现的元素的得分最高,而低优先级和不易实现的元素则会得到较低的分数。通过像图 12- 4这样将加权后的得分相加的方式,你将会得到可以用于比较每个架构的综合性得分。

标注 (蓝色) - 12.3 架构权衡分析步骤 > 位置 5098

在第一次加权时,工作量的估计可能比较粗略。可以先用一个像高、中、低这样的简单级别分类。随着对结果的估计越来越准确,就可以选用一个像 1~ 5这样的较细粒度的分类,其中数字越大则工作量越少。每个用例相对其他用例的加权结果也应该能帮助你的团队在每项功能的相对重要性上达成共识。用例还可以用来理楚项目中存在的风险因素。在做项目风险管理的时候,被标记为关键的功能需要项目经理加以特别重视。文档输出——在架构权衡过程的每个步骤都会产出一系列文档。这些文档可以综合到一份报表中并被发给利益相关者。这份报表将会包含一些与你需要和利益相关者沟通交流的话题有关的背景信息。这些文档可以以各种形式进行共享,如报表构成的网站、 Word文档、电子表格、幻灯片、墙面大小的彩色海报以及我们在本章稍后的部分会提到的质量树。结果交流——一旦准备好相关文档,你就

标注 (蓝色) - 12.3 架构权衡分析步骤 > 位置 5106

你就可以展示最终结果了。选用的展示方式的关注点应该集中在体现选型团队决定的可信度。用电子邮件附件的方式发送一份长达 100页的报告不会引起相关人士的兴趣,但如果通过一种互动的方式展示结果,就可以用一些听众可以理解的词汇使他们感到事情的紧迫性。