Postgres中SQL以外的语言
我最近一直在使用PostgreSQL,我认为很酷的一件事是,我们可以使用SQL以外的其他语言来编写脚本功能和其他功能。但是,什么时候真正有用?
例如,文档说PL / Perl的主要用途是它非常擅长文本操作。但是,难道不是应该在应用程序中编写更多的东西吗?
其次,有没有正当理由使用不受信任的语言?看起来让所有人都可以执行任何操作在生产系统上似乎不是一个好主意。
PS。如果有人可以使PL / LOLCODE看起来有用,则可加分。
解决方案
回答
如今,DBMS中的任何"独特"或者"酷"功能都使我感到异常紧张。我出疹子,必须停止工作,直到瘙痒消失。
我只是讨厌不必要地锁定平台。假设我们在数据库内部的PL / Perl中构建了很大一部分系统。在Cwithin SQL Server或者Oracle的PL / SQL中,有很多示例*。
现在,我们突然发现所选平台无法扩展。还是不够快。或者其他的东西。更糟糕的是,数据库块上有一个新手(像MonetDB,CouchDB,Cache这样的东西,但是比它酷得多)可以解决所有问题(即使像我这样的唯一问题是拥有一个不酷的数据库平台)。而且,如果不对应用程序进行一半的编码,就无法切换到它。
(*诚然,付费产品在某种程度上试图通过说服我们使用其独特功能来锁定我们,这并不是可以直接向免费提供商提起诉讼的指控,但效果是一样的)。
这是问题的第一部分。不过,真心。
is there any valid reason to use an untrusted language? It seems like making it so that any user can execute any operation would be a bad idea
天哪,是的!一种" Perl注入攻击"?我曾想过,仅仅为了看看会发生什么,这几乎是值得做的。
出于上面概述的哲学原因,我认为我将继续进行PL / LOLCODE挑战。尽管我惊讶地发现它与现存的东西有联系。
回答
"不是[文本操作]更多应在应用程序中编程的东西吗?"
通常是的。数据库的普遍接受的"三层"应用程序设计说,逻辑应该在客户端和数据库之间的中间层。但是,有时我们需要在触发器中添加一些逻辑,或者需要在函数上建立索引,这要求将一些代码放入数据库中。在那种情况下,所有通常的"我应该使用哪种语言?"问题来了。
如果只需要一点逻辑,就应该使用最可移植的语言(pl / pgSQL)。但是,如果我们需要进行认真的编程,则最好使用更具表现力的语言(例如pl / ruby)。这将永远是一个判断电话。
"有没有使用不可信语言的正当理由?"
如上所述,是的。同样,在可能的情况下,最好将直接文件访问(例如)放入中间层,但如果我们需要根据触发器触发操作(这可能需要访问中间层不直接可用的数据),那么我们就需要不受信任语言。这并不理想,通常应避免使用。而且我们绝对需要保护对它的访问。
回答
@迈克:这种想法让我感到紧张。我已经多次听到"这应该是无限可移植的",但是当问到这个问题时:我们实际上预见到会有移植吗?答案是不。
坚持最低的公分母确实会损害性能,引入抽象层(ORM,PHP PDO等)也可能会损害性能。我的看法是:
- 实际评估是否需要支持多个RDBMS。例如,如果我们正在编写一个开源Web应用程序,则可能至少需要支持MySQL和PostgreSQL(如果不是MSSQL和Oracle,则可能)。
- 评估之后,充分利用我们决定的平台
顺便说一句:我们将关系数据库与非关系数据库混合在一起(例如,CouchDB不是可与Oracle相提并论的RDBMS),这进一步说明了人们对可移植性的需求被多次高估了。
回答
从我的角度来看,我猜答案是"取决于情况"。
有一个论点是,对数据的操作属于数据库层,因此业务逻辑不必过分担心操作的发生方式,只需知道它有。
在db层上处理数据的另一个很好的理由是,如果数据量受到限制,则意味着网络带宽将成为问题。我曾经不得不对大量数据进行分类。在应用程序层中进行此处理的时间受到了在网络上传输所有数据进行处理所需的时间的严重限制。
然后,我在PL / pgSQL中编写了分箱算法,它的运行速度快得多。
关于不受信任的语言,我听见Josh Berkus(postgres倡导者)的播客,他讨论了postgresql的应用程序,该应用程序从MySQL引入数据作为其处理的一部分,以便通信本身由postgres服务器处理。我不记得完整的细节,我认为这是在FLOSS每周播客上,它是关于PostGRESQL的历史以及它所涉及的一些问题的非常有趣的讨论。
回答
我认为提供了大多数其他语言,因此,如果我们定期使用该语言进行开发,则可以轻松编写db函数,触发器等。这些功能的用途是提供对数据的控制,使其尽可能接近数据。可能的。
回答
程序语言的不受信任版本使我们可以访问系统上的I / O。
如果我们需要触发器或者其他东西来发送电子邮件或者连接到套接字服务器以发送弹出通知,这可能会派上用场。这种事情有很多用途,并且由于PostgreSQL隔离级别,我们可以安全地执行这样的事情。
我们可以在函数中放置检查点,这样,如果交易未能通过电子邮件或者其他任何事情都不会失败。这样做的好处是,它从客户端删除了逻辑,并将其放在服务器上。