Обычно языки хранятся следующим образом (псевдокод):
posts (
id serial pkey,
pubdate datetime
)
posts_lang (
id int fkey posts (id),
lang char(2),
title varchar,
content text,
pkey (id, lang)
)
Альтернативный подход, который я видел несколько раз, таков:
posts (
id serial pkey,
parent int fkey posts (id),
lang char(2),
pubdate datetime
title varchar,
content text
)
Его преимущество в том, что он позволяет работать со специфичными для локали атрибутами (например, английские теги / мета против испанских тегов / мета). Но это быстро превращается в кошмар обработки деревьев. Так что не рекомендуется.
И, конечно, есть тот, который вы используете, с языком по умолчанию прямо в таблице:
posts (
id serial pkey,
pubdate datetime
title varchar,
content text,
)
posts_lang (
id int fkey posts (id),
lang char(2),
title varchar,
content text,
pkey (id, lang)
)
Я вижу рациональное требование языка по умолчанию прямо в таблицу. Но по моему опыту, это приводит к дублированию кода - то есть вы постоянно делаете вещи двумя способами - и, таким образом, ошибки / причуды. Так что на самом деле не могу рекомендовать.
Моя предпочтительная альтернатива - ничего из вышеперечисленного, и для каждого языка используется отдельная схема (или БД, или префикс таблицы):
en.posts (
id serial pkey,
pubdate datetime
title varchar,
content text
)
es.posts (
id serial pkey,
pubdate datetime
title varchar,
content text
)
Причина, по которой я предпочитаю, состоит в том, что у сайта часто есть непереведенные страницы и тому подобное, или страницы, которые существуют на одном сайте, но не на другом. И чаще всего ваш контент не должен совпадать с из одной страны в другую - в любом случае, вы не общаетесь со своей аудиторией одинаково.