Đối C
chiếu là sự lựa chọn đúng đắn.
Mọi thứ nhanh hơn một chút mà không cần địa phương. Và vì dù sao không có đối chiếu là đúng, hãy tạo cơ sở dữ liệu mà không cần đối chiếu, có nghĩa là với C
.
Nó có thể là một nỗi đau khi phải cung cấp một đối chiếu cho nhiều hoạt động. Tuy nhiên, không nên có sự khác biệt đáng chú ý về tốc độ giữa đối chiếu mặc định và đối chiếu đặc biệt. Sau tất cả, đó chỉ là dữ liệu chưa được sắp xếp và quy tắc đối chiếu được áp dụng khi sắp xếp.
Xin lưu ý rằng Postgres xây dựng trên các cài đặt ngôn ngữ được cung cấp bởi HĐH cơ bản, do đó bạn cần phải tạo các địa điểm cho từng miền được sử dụng. Thêm trong câu trả lời liên quan về SO ở đây và ở đây .
Tuy nhiên, như @Craig đã đề cập , các chỉ mục là nút cổ chai trong kịch bản này. Đối chiếu của chỉ mục phải khớp với đối chiếu của toán tử được áp dụng trong nhiều trường hợp liên quan đến dữ liệu ký tự.
Bạn có thể sử dụng bộ COLLATE
xác định trong các chỉ mục để tạo các chỉ mục phù hợp. Các chỉ mục một phần có thể là lựa chọn hoàn hảo nếu bạn trộn dữ liệu trong cùng một bảng.
Ví dụ: bảng có chuỗi quốc tế:
CREATE TABLE string (
string_id serial
,lang_id int NOT NULL
,string text NOT NULL
);
Và bạn chủ yếu quan tâm đến một ngôn ngữ tại một thời điểm:
SELECT *
FROM string
WHERE lang_id = 5 -- 5 being German / Germany here
AND string > 'foo' COLLATE "de_DE"
ORDER BY string COLLATE "de_DE";
Sau đó tạo các chỉ mục một phần như:
CREATE INDEX string_string_lang_id_idx ON string (string COLLATE "de_DE")
WHERE lang_id = 5;
Một cho mỗi ngôn ngữ bạn cần.
Trên thực tế, thừa kế có thể là một cách tiếp cận ưu việt cho một bảng như thế này. Sau đó, bạn có thể có một chỉ mục đơn giản trên mỗi bảng được kế thừa chỉ chứa các chuỗi cho một miền địa phương. Tất nhiên, bạn cần phải thoải mái với các quy tắc đặc biệt cho các bảng được kế thừa.