6

我最近一直在使用 PostgreSQL,我认为很酷的一件事是,您可以使用 SQL 以外的语言来编写脚本功能等等。但这实际上什么时候有用呢?

例如,文档说 PL/Perl 的主要用途是它非常擅长文本操作。但这不是更多应该编程到应用程序中的东西吗?

其次,是否有任何正当理由使用不受信任的语言?似乎让任何用户都可以执行任何操作在生产系统上是个坏主意。

PS。如果有人可以使PL/LOLCODE看起来有用,则可以加分。

4

7 回答 7

5

@Mike:这种想法让我很紧张。我听过很多次“这应该是无限便携的”,但是当被问到问题时:你真的预见到会有任何移植吗?答案是不。

坚持最低公分母真的会损害性能,引入抽象层(ORM's、PHP PDO 等)也是如此。我的意见是:

  • 实际评估是否需要支持多个 RDBMS。例如,如果您正在编写一个开源 Web 应用程序,那么您可能至少需要支持 MySQL 和 PostgreSQL(如果不是 MSSQL 和 Oracle)
  • 评估后,充分利用您决定的平台

顺便说一句:您将关系数据库与非关系数据库混合在一起(例如,CouchDB不是可与 Oracle 相媲美的 RDBMS),这进一步说明了对可移植性的感知需求被大大高估了很多倍。

于 2008-09-02T16:56:03.460 回答
3

“那[文本操作]不是更多应该编程到应用程序中的东西吗?”

通常,是的。普遍接受的数据库“三层”应用程序设计表示您的逻辑应该位于客户端和数据库之间的中间层。但是,有时您需要在触发器中使用一些逻辑或需要对函数进行索引,这需要将一些代码放入数据库中。在那种情况下,所有通常的“我应该使用哪种语言?” 问题来了。

如果你只需要一点逻辑,可能应该使用最便携的语言(pl/pgSQL)。但是,如果您需要进行一些认真的编程,则最好使用更具表现力的语言(也许是 pl/ruby)。这将永远是一个判断电话。

“有任何正当理由使用不受信任的语言吗?”

如上所述,是的。同样,在可能的情况下,最好将直接文件访问(例如)放入中间层,但如果您需要根据触发器触发事件​​(可能需要访问中间层无法直接使用的数据),那么您需要不受信任语言。这并不理想,通常应该避免。而且您绝对需要保护对它的访问。

于 2008-09-02T14:17:55.990 回答
1

这些天来,DBMS 中的任何“独特”或“酷”功能都让我非常紧张。我突发皮疹,不得不停止工作,直到瘙痒消失。

我只是讨厌被不必要地锁定在一个平台上。假设您在数据库中使用 PL/Perl 构建系统的很大一部分。或者在 SQL Server 中的 C# 或 Oracle 中的 PL/SQL 中,有很多示例*。

现在您突然发现您选择的平台无法扩展。或者不够快。或者其他的东西。更糟糕的是,数据库块(比如 MonetDB、CouchDB、Cache 之类的东西,但更酷)可以解决你所有的问题(即使你唯一的问题,像我一样,是一个不酷的数据库平台)。如果不重新编码一半的应用程序,您就无法切换到它。

(*诚然,付费产品在一定程度上是想通过说服您使用其独特功能来锁定您,这不是可以直接指责免费提供者的指责,但效果是一样的)。

所以这是对问题第一部分的咆哮。虽有心机。

是否有任何正当理由使用不受信任的语言?似乎让任何用户都可以执行任何操作将是一个坏主意

我的天哪,是的!一种“Perl 注入攻击”?几乎值得这样做只是为了看看会发生什么,我想。

出于上述哲学原因,我想我会通过 PL/LOLCODE 挑战。虽然我有点惊讶地发现它是与现存事物的链接。

于 2008-09-02T13:54:57.030 回答
1

从我的角度来看,我想答案是“视情况而定”。

有一种说法是对数据的操作属于数据库层,因此业务逻辑不需要过分关心操作是如何发生的,它只知道它有。

在 db 层处理数据的另一个很好的理由是,如果处理的数据量意味着网络带宽将成为一个问题。我曾经不得不对大量数据进行分类。在应用程序层处理这个受到通过网络传输所有数据进行处理所需的时间的严重限制。

然后我在 PL/pgSQL 中编写了一个分箱算法,它的运行速度要快得多。

关于不受信任的语言,我听到了 Josh Berkus(postgres 倡导者)的播客,他讨论了 postgresql 的应用程序,该应用程序从 MySQL 中引入数据作为其处理的一部分,以便通信本身由 postgres 服务器处理。我不记得全部细节了,我想是在FLOSS Weekly 播客上,这是对 PostGRESQL 的历史和它所涉及的一些问题的非常有趣的讨论。

于 2008-09-05T11:18:50.233 回答
1

程序语言的不受信任版本允许您访问系统上的 I/O。如果您需要触发器或发送电子邮件或连接到套接字服务器以发送弹出通知,这可以派上用场。这种类型的东西有很多用途,并且由于 postgresql 隔离级别,你可以安全地做这样的事情。您可以在函数中放置检查点,以便在交易失败时发送电子邮件或任何不会发出的邮件。这样做的好处是它从客户端删除逻辑并将其放在服务器上。

于 2008-09-22T05:43:11.010 回答
0

我认为提供了大多数其他语言,因此如果您定期使用该语言进行开发,您可以轻松编写数据库函数、触发器等。这些功能的用处是提供对数据的控制,使其尽可能接近数据可能的。

于 2008-09-18T14:51:53.167 回答
0

我最近用一种外部语言编写的一个有用的存储过程的一个例子是 'df' 的一个版本,它允许 SQL 表生成器在运行时选择一个可用空间最多的表空间。

我使用了 plperlu,它相对简单,尽管我必须小心数据类型。

于 2012-07-24T15:20:47.963 回答