The C
pemeriksaan adalah pilihan yang tepat.
Semuanya sedikit lebih cepat tanpa lokal. Dan karena tidak ada susunan yang benar, buat basis data tanpa susunan , artinya dengan C
.
Mungkin menyusahkan harus menyediakan pemeriksaan untuk banyak operasi. Seharusnya tidak ada perbedaan yang mencolok dalam kecepatan antara susunan standar dan susunan ad-hoc. Lagi pula itu hanya data yang tidak disortir, dan aturan pemeriksaan diterapkan saat menyortir.
Ketahuilah bahwa Postgres dibuat berdasarkan pengaturan lokal yang disediakan oleh OS yang mendasarinya, jadi Anda perlu membuat lokal yang dihasilkan untuk setiap lokal yang akan digunakan. Lebih banyak jawaban terkait pada SO di sini dan di sini .
Namun, seperti @Craig sudah sebutkan , indeks adalah hambatan dalam skenario ini. Susunan indeks harus cocok dengan susunan operator yang diterapkan dalam banyak kasus yang melibatkan data karakter.
Anda dapat menggunakan COLLATE
specifier dalam indeks untuk menghasilkan indeks yang cocok. Indeks parsial mungkin merupakan pilihan yang sempurna jika Anda mencampur data dalam tabel yang sama.
Misalnya, tabel dengan string internasional:
CREATE TABLE string (
string_id serial
,lang_id int NOT NULL
,string text NOT NULL
);
Dan Anda sebagian besar tertarik pada satu bahasa pada satu waktu:
SELECT *
FROM string
WHERE lang_id = 5 -- 5 being German / Germany here
AND string > 'foo' COLLATE "de_DE"
ORDER BY string COLLATE "de_DE";
Kemudian buat indeks parsial seperti:
CREATE INDEX string_string_lang_id_idx ON string (string COLLATE "de_DE")
WHERE lang_id = 5;
Satu untuk setiap bahasa yang Anda butuhkan.
Sebenarnya, pewarisan mungkin merupakan pendekatan yang unggul untuk tabel seperti ini. Kemudian Anda dapat memiliki indeks biasa pada setiap tabel yang diwarisi yang hanya berisi string untuk satu lokal. Anda harus merasa nyaman dengan aturan khusus untuk tabel yang diwarisi, tentu saja.