加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

postgresql – 如何为国际数据库选择排序规则?

发布时间:2020-12-13 16:20:07 所属栏目:百科 来源:网络整理
导读:我正在设计一个以不同语言存储数据的数据库(使用UTF-8),所以我认为显示查询结果的最佳方法是在查询本身( because there are more than one correct ways to do that)期间根据用户的语言对其进行排序,如下所示: SELECT a b COLLATE "de_DE" FROM test1; 假设
我正在设计一个以不同语言存储数据的数据库(使用UTF-8),所以我认为显示查询结果的最佳方法是在查询本身( because there are more than one correct ways to do that)期间根据用户的语言对其进行排序,如下所示:
SELECT a < b COLLATE "de_DE" FROM test1;

假设这是使用国际数据的正确方法,这是数据库本身的最佳排序规则? PostgreSQL documentation says:

The C and POSIX collations both specify “traditional C” behavior,in which only the ASCII letters “A” through “Z” are treated as letters,and sorting is done strictly by character code byte values.

我认为这是这种情况下的最佳选择,还是我错了?

(加分问题:在查询本身中选择排序规则是否太慢?).

C collation是正确的选择.

没有语言环境,一切都快一点.并且由于无论如何都没有正确的排序规则,因此无需整理即可创建数据库,这意味着使用C.

为许多操作提供整理可能是一种痛苦.但是,默认排序规则和临时排序规则之间的速度不应该有明显的差异.毕竟它只是未排序的数据,并且在排序时应用排序规则.

请注意,Postgres基于底层操作系统提供的语言环境设置,因此您需要为每个要使用的语言环境生成语言环境.更多关于SO here和here的相关答案.

但是,如@Craig already mentioned所示,索引是此方案的瓶颈.在许多涉及字符数据的情况下,索引的排序规则必须与应用运算符的排序规则相匹配.

您可以使用索引中的COLLATE说明符来生成匹配的索引.如果要在同一个表中混合数据,Partial indexes可能是完美的选择.

例如,包含国际字符串的表:

CREATE TABLE string (
   string_id serial,lang_id   int NOT NULL,string    text NOT NULL
);

而且你最常对一种语言感兴趣:

SELECT *
FROM   string
WHERE  lang_id = 5  -- 5 being German / Germany here
AND    string > 'foo' COLLATE "de_DE"
ORDER  BY string COLLATE "de_DE";

然后创建部分索引,如:

CREATE INDEX string_string_lang_id_idx ON string (string COLLATE "de_DE")
WHERE lang_id = 5;

每种语言都需要一个.

实际上,对于像这样的表格来说,inheritance可能是一种优越的方法.然后,您可以在每个继承的表上包含一个普通索引,该索引仅包含单个语言环境的字符串.当然,您需要熟悉继承表的特殊规则.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读