50.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 組合了擴展性和通用性,以及代碼復用和一個幹淨的界面。