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

时间:2013-01-28 14:54:56

标签: java postgresql

我了解到PostgreSQL是用C语言编写的。我想通过

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

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

1 个答案:

答案 0 :(得分:5)

这里的答案是“它很复杂。”你实际上可以使用过程语言(包括pl / java)走得很远,但是你永远不会得到你可以获得的灵活性。从根本上缺少的是能够在PL / Java中进行适当的索引支持,因为一个无法创建新的基元。还有一点,你可能想看看my blog,尽管大多数例子都在pl / pgsql中。

<强>类型

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

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

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

CREATE DOMAIN png_image as bytea check value like [magic number goes here];

然后我们可以创建一堆存储过程以各种方式处理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;

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

CREATE INDEX l_name_sunset_idx ON landmark (name) where is_sunset(photo);

这将允许我们缓存日落照片名称的索引,从而加快查询速度。

您在Java中无法做的是创建新的基元类型。请记住,像索引支持这样的东西是原始级别,因此你不能,例如,创建一个支持GiST索引的新IP地址类型(不是你需要的,因为ip4r可用)。

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

<强>索引

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

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

<强>性能

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

相关问题