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:
我认为这是这种情况下的最佳选择,还是我错了? (加分问题:在查询本身中选择排序规则是否太慢?). 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可能是一种优越的方法.然后,您可以在每个继承的表上包含一个普通索引,该索引仅包含单个语言环境的字符串.当然,您需要熟悉继承表的特殊规则. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |