database - PostgreSQL:可以用该语言定义一个 session 变量并在 View 中使用它吗?

标签 database database-design postgresql localization internationalization

这是一个简化的架构示例:

Table l10n ( l10n_id SMALLINT, code VARCHAR(5) )  
Table product ( product_id INT, ..language-neutral columns.. )  
Table product_l10n ( product_id INT, l10n_id SMALLINT, ..language-specific columns.. )

查询具有本地化数据的产品是这样完成的:

    SELECT *
    FROM product a
        LEFT JOIN product_l10n b ON b.id = a.id
        LEFT JOIN l10n c ON c.id = b.id
    WHERE c.code = 'en-US';

为了避免大查询,我想使用 View 。
基本思想是根据上面的查询创建一个 View ,不带 where 子句。
查询产品将变为:

    SELECT * FROM product_view WHERE c.code = 'en-US';

另一个想法是有一个包含语言标签的变量,为每个数据库连接/ session 定义。
该 View 将基于使用 where 子句中的变量的第一个查询。
在当前数据库 session 中设置的变量,查询产品将像这样简单:

    SELECT * FROM product_view;

所以我的问题是:可以这样做吗?怎么办?

在postgresql.conf 中使用自定义变量是可行的。请参阅文档 Customized Options .

在 postgresql.conf 中:

    custom_variable_classes = 'myproject'
    myproject.l10n_id = 'en-US'

在数据库 session 开始时(参数默认设置在 session 级别):

    SET myproject.l10n_id = 'en-US';

在 View 中:

    WHERE c.code = current_setting('myproject.l10n_id')

但是...我不喜欢必须为整个服务器定义一个变量。有没有办法在每个数据库的基础上实现相同的目标?

提前致谢,
帕斯卡

PS:我已经发布了另一个关于将 l10n_id 用作 SMALLINT 或直接用作 VARCHAR(5) 中的 ISO 代码的问题。请参阅 http://stackoverflow.com/questions/1307087/how-to-store-language-tag-ids-in-databases-as-smallint-or-varchar(抱歉,新用户只有 1 个 URL :- )

最佳答案

那么,为整个服务器创建变量到底有什么问题?它不会影响任何其他连接/查询,因此应该没问题。

可以使用另一种方法,每个连接都可以使用后端 pid 找到,可以通过以下方式获得

select pg_backend_pid();

因此,您可以创建一个表,其中的列如下:

  • backend_pid int4
  • 变量名文本
  • 可变值文本

使用主键(backend_pid,variable_name)并提供一组获取值和设置值的函数,在内部检查 pg_backend_pid。

如果连接在没有“清理”(删除所有变量)的情况下关闭,并且新连接将启动 - 从而从以前的连接获取变量,这仍然是一个问题,但这通常不太可能。

我想了一下,写了blog post使用将创建表和使其工作所需的函数的确切 sql。

关于database - PostgreSQL:可以用该语言定义一个 session 变量并在 View 中使用它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1307582/

相关文章:

sql - 复制长表条目表设计注意事项

database-design - 用于创建关系模型图的工具

mysql - 交易目的地外键的在线信用系统表布局

mysql - MySQL 存储过程中的数据值不正确

php - Mysql条件查询

c# - 在 DataGridView 中显示数据

mysql - 如何解决mysql中的时间数据类型

sql - 在 PostgreSQL 中更新具有非空和唯一约束的列的特殊情况

sql - 主键的顺序扫描和索引扫描返回不同的行

postgresql - 将 Amazon RDS 用于 GeoDjango?