使用Java扩展PostgreSQL的索引结构,数据类型,检索类型等?

nav*_*ige 4 java postgresql

我了解到PostgreSQL是用C语言编写的.我想扩展它

  • 定制的索引结构
  • 定制的最近邻检索(具有各种距离函数)
  • 自定义数据类型

我担心到目前为止使用PostgreSQL是因为它是用C语言编写的.但是,我在PostgreSQL上看到了关于页面(http://www.postgresql.org/about/)的文章,他们支持"库接口",例如Java.因此,我可以使用Java来实现(至少)最近邻检索和自定义数据类型(我猜不是索引结构,因为它是非常低级别的)?

Chr*_*ers 5

这里的答案是"它很复杂".实际上,你可以走很远了程序语言(包括PL/Java的),但你永远不会得到相当可以用C.什么是从根本上缺少的是能够在PL/java做适当的索引支持获得的灵活性,因为一个无法创建新的基元.还有更多,你可能想看看我的博客,虽然大多数例子都在pl/pgsql中.

类型

现在你可以用PL/Java(或PL/Perl,或者PL/Python,或者你喜欢的任何东西)来实现目标,但是有一些东西是遥不可及的.这也是对数据库中的过程语言可能实现的内容以及不是什么的概述.

有两种有效的方法可以处理过程语言中的类型.您可以使用域(基元的子类型),也可以使用复杂类型(具有属性的对象,每个属性都是另一种类型,基本类型,域或复杂类型本身).一般来说,在索引复杂类型本身方面你不能真正做很多事情,但你可以索引他们的成员.另一件不安全的事情是输出格式,但您可以提供其他功能来替换它.

例如,假设我们想要一个类型来存储PNG文件并为数据库中的某些属性处理它们.我们可以通过以下方式执行此操作:

CREATE DOMAIN png_image as bytea check value like [magic number goes here];
Run Code Online (Sandbox Code Playgroud)

然后我们可以创建一堆存储过程来以各种方式处理png.例如,我们可能会在函数is_sunset中查找顶部附近的橙色.我们或许可以这样做:

SELECT name FROM landmark l
  JOIN landmark s ON (s.name = 'San Diego City hall' 
                      and  ST_DISTANCE(l.coords, s.coords) < '20')
 WHERE is_sunset(photo)
 ORDER BY name;
Run Code Online (Sandbox Code Playgroud)

没有理由不能用Java,Perl或您喜欢的任何语言处理is_sunset.由于is_sunset返回bool,我们甚至可以:

CREATE INDEX l_name_sunset_idx ON landmark (name) where is_sunset(photo);
Run Code Online (Sandbox Code Playgroud)

这将通过允许我们缓存日落照片的名称索引来加速查询.

在Java中你不能做的是创建新的基元类型.请记住,之类的东西指数支撑位在原始的水平,因此,你不能,例如,创建一个新的IP地址格式支持的GiST索引(不是你需要的,因为ip4r可用).

因此,如果您可以重复使用并使用已存在的原语,您可以使用Java或任何您喜欢的方式进行开发.你真的只受限于可用的原语,并且有足够多的人用C编写新的原语,你可能根本不需要触及它们.

索引

索引代码与原语一样只是C语言.您无法使用过程语言自定义索引行为.你可以做的是使用其他开发人员的原语等等.这是您最有可能必须降到C的区域.

(更新:正如我想的那样,有可能使用CREATE OPERATOR CLASSCREATE OPERATOR命令挂钩到现有的索引类型以基于其他PL函数添加对各种索引的支持.虽然我没有这方面的经验.)

性能

请记住,PL/Java意味着您在每个后端进程中运行JVM.在许多情况下,如果您可以在pl/pgsql中执行您想要执行的操作,您将获得更好的性能.当然,其他语言也是如此,因为在后端进程中需要解释器或其他环境.