|
|
2#

楼主 |
发表于 2010-3-2 13:10:15
|
只看该作者

执行较少的索引查询
要查询姓 Silver 的学生的名,应该使用类似于 清单 2 中的 XPath 表达式。
清单 2. 查询姓 Silver 的学生的 XPath 表达式
: /class-info/students/student/name[last = "Silver"]/first
如果将数据限制为 清单 1 中单个文档中的可见数据,那么计算 清单 2 中的 XPath 表达式总是正确地返回 清单 3 中的结果。
清单 3. XPath 结果
<first>Andrew</first>
<first>Bruce</first>
如果数据没有被索引,那么 清单 2 总是获得结果的最快方法。这个表达式限制了数据库找到相关结果所必须搜索的分支的数量。
但是,如果数据已经索引,并且根据您使用的特定数据库实现,假设您有一个非常大的数据集,那么类似于 清单 4 中的表达式可能计算速度更快。
清单 4. 数据已索引时使用的 XPath 表达式
: //name[last = "Silver"]/first
性能可能会改进的原因是,系统只需检查索引中较少的元素。但是,鉴于 清单 1 中文档的设计(使用非唯一元素名称),清单 4 中的 XPath 表达式将返回错误的结果:包含一个教师的名字 Dan。这种设计阻止您编写利用较少索引的查询。更好的设计是使用唯一元素名称替换 清单 1 中的非唯一元素名称,如 清单 5 所示。
清单 5. 使用唯一元素名称替换清单 1 中的非唯一元素名称
//teacher/name => //teacher/teacher-name
//teacher/name/first => //teacher/teacher-name/teacher-first
//teacher/name/last => //teach/teacher-name/teacher-last
//student/name => //student/student-name
//student/name/first => //student/student-name/student-first
//student/name/last => //student/student-name/student-last
支持面搜索结果
面搜索的目标是显示一些链接,允许用户沿各种轴快速直观地缩小搜索的范围。在一个支持面搜索结果的应用程序中,一个列出数据库中所有教师的查询可能在用户界面中返回类似于 清单 6 中的信息。
清单 6. 面搜索
Tabor, Gavin
Nance, Jamey
Haas, Carlene
Davies, Yesenia
Singer, Lupe
Narrow your search:
School
Lusher Elementary School (35)
Academy of the Sacred Heart (34)
Isidore Newman School (32)
Audubon Charter School (28)
Benjamin Franklin Elementary Math-Science Magnet (25)
Grades
9 (5)
10 (6)
11 (6)
12 (6)
清单 6 提供了两个面:School 和 Grades。每个面包含 4 到 5 个值,这些值链接到一个搜索,该搜索用于缩小最近的搜索的范围。每个面值旁边有一个数字(位于圆括号中),表示单击这个链接将会找到的教师总数。面搜索结果通常只显示每个面的几个可能值。如果一个面的确切值的数量很少,比如说 Grades 面,那么应用程序通常会显示所有面,并按照各个面的重要程度排序。但是,如果一个面包含许多可能值,那么应用程序通常只显示将返回最多结果的那些值,并根据结果数量按降序排列。
一些原生 XML 数据库正在包含对面搜索的支持,但是它们需要特殊的索引才能提供最佳性能。随着数据库中的记录数量的增加和一个面的可能值的数量增加,获取一个面的显示值的典型 XQuery 算法很快成为一个瓶颈。对于一个拥有多个包含数千个值的面的大型数据库来说,这样的算法是行不通的。要发挥面搜索的威力,原生 XML 引擎需要能够从一个元素在数据库中具有的值构建词典。这些词典可以从特殊的索引实现,而索引又需要唯一元素名称。
如果您拥有一个相对较小的不支持面搜索的原生 XML 数据库,并且需要自己编写代码来支持这种功能,那么您将明白,唯一元素名称对您的代码有多么重要,就跟它们对更高级的数据库中当前存在的面搜索支持代码一样重要。 |
|