C
Звірка є правильним вибором.
Все трохи швидше без локалу. А оскільки жодне зіставлення так і не підходить, створіть базу даних без зіставлення, тобто з C
.
Для багатьох операцій може бути болем, щоб забезпечити порівняння. Не повинно бути помітної різниці у швидкості між типовим порівнянням та тимчасовим порівнянням. Зрештою, це лише несортовані дані, а при сортуванні застосовуються правила зіставлення.
Майте на увазі, що Postgres ґрунтується на налаштуваннях локалі, що надаються базовою ОС, тому вам потрібно створити локалі для кожного використовуваного локалу. Детальніше у відповіді на ТАК тут і тут .
Однак, як @Craig вже згадував , індекси є вузьким місцем у цьому сценарії. Порівняння індексу має відповідати порівнянню застосованого оператора у багатьох випадках, що містять символьні дані.
Ви можете використовувати COLLATE
специфікатор в індексах для створення відповідних індексів. Часткові індекси можуть бути ідеальним вибором, якщо ви змішуєте дані в одній таблиці.
Наприклад, таблиця з міжнародними рядками:
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;
По одному для кожної потрібної вам мови.
Насправді успадкування може бути чудовим підходом для такої таблиці. Тоді ви можете мати простий індекс у кожній успадкованій таблиці, що містить лише рядки для однієї локалі. Вам, звичайно, потрібно погодитися зі спеціальними правилами для успадкованих таблиць.