多言語をサポートする予定のウェブサイトを構築しています。 UIだけでなく、コンテンツも使用します。
「タイトル」、「名前」、「説明」、「本文」などのテキスト列があるいくつかのテーブルがあります。そうするための最良の方法は何ですか?翻訳したいテキストデータがあるテーブルごとに追加のテーブルを作成する必要がありますか?例えば:
articles(id)
articles_content(article_id, title, description, body, language_id)
comments(id)
comments_content(comment_id, body, language_id)
したがって、各テーブルについて翻訳したいと思います。
このソリューションの欠点はありますか?
より良い、しかしより簡単な方法はありますか?
各「テーブル」を(非翻訳可能な要素を含む)基本テーブルおよび変換テーブルとして作成します。言語テーブルには、ベーステーブルの主キーと言語IDが含まれます。次に、特定の言語用に2つを結合する(そしてUIが駆動する)ビューレイヤーを作成できます。このシナリオでは、翻訳不可能な要素の重複メンテナンスを回避します。
ベーステーブルごとに個別の多言語テーブルを用意しないことをお勧めします。多言語の文字列を表すsingleテーブルと、各言語でその文字列の値を格納するsingleテーブルを用意することをお勧めします。
たとえば、Postgresのテーブル作成ステートメントは次のようになります。
create table articles (
id serial primary key,
title int not null references multilingual (id),
description int not null references multilingual (id),
body int not null references multilingual (id)
);
create table multilingual (
id serial primary key
);
create table string (
id int not null references multilingual (id),
lang lang not null, -- custom lang type defined as enum
contents text not null,
primary key (id, lang)
);
articles_content(article_id, title, description, body, language_id)
このアプローチには、ベーステーブルごとの多言語テーブルよりも多くの結合が含まれるため、許容できないほどパフォーマンスが低下する可能性があります。ただし、スキーマはよりシンプルに保たれます。