49.2. 扩展性

通常,实现一种新的索引访问方法意味着大量的艰苦工作。我们必须理解数据库 的内部工作机制,比如锁的机制和预写日志。GiST 接口有 一个高层的抽象,只要求访问方法的实现者实现被访问的数据类型的语意。 GiST 层本身会处理并发,日志和搜索树结构的任务。

我们不要把这个扩展性和其它标准搜索树的扩展性混淆在一起,比如它们所能处理的 数据等方面。比如,PostgreSQL 支持可以扩展的 B+-trees 和 R-trees。这就意味着呢可以用 PostgreSQL 在任意你需要的数据类型上建立 B+-tree 或者 R-tree。但是 B+-trees 只支持范围谓词 ((<=>), 而 R-trees 只支持 n-D (n-维)范围查询(包含,被包含,相等)。

所以,如果你用 PostgreSQL B+-tree 索引了一个图象 集,那么你就只能发出类似"图象 x 和 图象 y 相等吗""图象 x 是不是比图象 y 小""图象 x 是否大于图象 y"?这样的查询。 根据你在这个环境下定义的"等于""小于""大于" 的含义,上面这些查询可能有意义。但是,使用一个基于 GiST 的索引, 你可以创建一些方法来发出和域相关的问题,比如"找出所有马的图象" 或者"找出所有曝光过头的图象"

要让一种 GiST 访问模式跑起来的方法只是实现七个用户定义 的方法,这七个方法定义了树里面的键字的行为。当然,为了支持那些怪异的查询,这些方法 也会相当怪异,但是对于所有标准的查询(B+-trees,R-trees 等),他们是相当直接的。 简单说,GiST 组合了扩展性和通用性,以及代码复用和一个干净的界面。