我了解到PostgreSQL是用C语言编写的.我想扩展它
我担心到目前为止使用PostgreSQL是因为它是用C语言编写的.但是,我在PostgreSQL上看到了关于页面(http://www.postgresql.org/about/)的文章,他们支持"库接口",例如Java.因此,我可以使用Java来实现(至少)最近邻检索和自定义数据类型(我猜不是索引结构,因为它是非常低级别的)?
这里的答案是"它很复杂".实际上,你可以走很远了程序语言(包括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 CLASS和CREATE OPERATOR命令挂钩到现有的索引类型以基于其他PL函数添加对各种索引的支持.虽然我没有这方面的经验.)
性能
请记住,PL/Java意味着您在每个后端进程中运行JVM.在许多情况下,如果您可以在pl/pgsql中执行您想要执行的操作,您将获得更好的性能.当然,其他语言也是如此,因为在后端进程中需要解释器或其他环境.
| 归档时间: |
|
| 查看次数: |
657 次 |
| 最近记录: |