在工作中,我们目前有一个PostgreSQL数据库,我们通过一些Perl绑定访问它来访问数据库并编组对Perl类型的响应。这很好用,但由于种种原因,我们对Perl感到不满。我们一直在考虑的一个选择是将此API中的大部分工作作为plpgsql
存储过程移至数据库本身。
例如,我们可能在数据库中有以下内容:
-- This matches our 'Entity::Artist' object
CREATE TYPE loaded_artist (
artist_id uuid,
revision_id integer,
artist_tree_id integer,
name text,
sort_name text,
artist_type_id integer,
-- etc
);
-- This gets the latest 'master' version of an artist and joins in basic data
-- from the artist tree
CREATE FUNCTION get_latest_artist_by_mbid(in_mbid UUID)
RETURNS SETOF loaded_artist AS $$
BEGIN
RETURN QUERY
SELECT
artist_id, revision_id, artist_tree_id, name.name,
sort_name.name AS sort_name, artist_type_id
FROM artist
JOIN artist_revision USING (artist_id)
JOIN artist_tree USING (artist_tree_id)
JOIN artist_data USING (artist_data_id)
WHERE artist.master_revision_id = revision_id
AND artist_id = in_mbid;
END;
$$ LANGUAGE 'plpgsql';
现在,我们当前的Perl API可以简化为以下内容:#And in Perl
package Data::Artist;
sub get_latest_by_mbid {
my ($self, $mbid) = @_;
return $self->new_from_row(
$self->sql->select_single_row_hash(
'SELECT * FROM get_latest_artist_by_mbid(?)',
$mbid));
}
从表面上看,我喜欢这个。我们:
RETURNS SETOF loaded_artist
有一些缺点:
有人做过这样的工作吗?你会鼓励它,还是充满危险?
这是一个开源网站。我们分发数据库的转储,供人们导入PostgreSQL数据库。我们没有计划很快离开PG,所以数据库无关的决定并不真正适用于我们。我们是一个非常小的团队(2个付费开发人员,更多的开源贡献者),这使我们在部署策略方面非常灵活。
答案 0 :(得分:4)
优点:
SELECT
个查询。缺点:
最佳组合是在数据库端实现业务逻辑,而不仅仅是包装函数。
可以使用模式版本控制。在配置表中对数据进行版本化更加棘手。在我参与的一个项目中,这是通过外部工具(基于perl)完成的,该工具为我们处理这部分:
我们正在对提取文件进行版本控制(这是一个普通的SQL),并在安装脚本中有一个特殊步骤来加载新配置。
答案 1 :(得分:0)
到便携性: