Here I am creating table product_feature_text
, having a 1:N relation with table product
. As the application must support several user languages, a lang_code
column is added to segment english texts from other language texts.
As I want to present the product features alphabetically ordered in every language, I have created four partial indexes with their specific collate
. It is expected that all products features have title
in all of the four languages, i.e., there will be 25% of rows with lang_code = 'ES'
, for example.
This is an oversimplification of the real case but enough to depict the situation.
create table product_feature_text (
id bigint generated by default as identity primary key,
-- reference to the parent product
product_id bigint not null,
-- language dependent columns
lang_code char(2),
title varchar,
foreign key (product_id) references product (id)
);
create index on product_feature_text (title collate "en-US") where lang_code = 'EN';
create index on product_feature_text (title collate "es-ES") where lang_code = 'ES';
create index on product_feature_text (title collate "fr_FR") where lang_code = 'FR';
create index on product_feature_text (title collate "de_DE") where lang_code = 'DE';
Is this the best index approach for the case?
Addendum from a comment: a typical query would be
select text
from product_feature
where product_id = 1024
and lang_code = 'FR'
order by title collate "fr_FR"
where product_id
could be anything.
It depends on the intended use of the indexes.
If you want to use them for
your indexes might be useful.
Also, if your query looks like
it might help.
However, for most cases that I can envision, a single index whose collation doesn't matter would be better.
For the query in the addendum, the perfect index would be: