微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我正在设计一个以不同语言存储数据的数据库(使用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 herehere的相关答案.

但是,如@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可能是一种优越的方法.然后,您可以在每个继承的表上包含一个普通索引,该索引仅包含单个语言环境的字符串.当然,您需要熟悉继承表的特殊规则.

原文地址:https://www.jb51.cc/postgresql/192237.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐