web-dev-qa-db-ja.com

多言語ウェブサイトのデータベーススキーマを設計するための推奨される方法は何ですか?

多言語をサポートする予定のウェブサイトを構築しています。 UIだけでなく、コンテンツも使用します。

「タイトル」、「名前」、「説明」、「本文」などのテキスト列があるいくつかのテーブルがあります。そうするための最良の方法は何ですか?翻訳したいテキストデータがあるテーブルごとに追加のテーブルを作成する必要がありますか?例えば:

articles(id)
articles_content(article_id, title, description, body, language_id)


comments(id)
comments_content(comment_id, body, language_id)

したがって、各テーブルについて翻訳したいと思います。

このソリューションの欠点はありますか?

より良い、しかしより簡単な方法はありますか?

3
Raj

各「テーブル」を(非翻訳可能な要素を含む)基本テーブルおよび変換テーブルとして作成します。言語テーブルには、ベーステーブルの主キーと言語IDが含まれます。次に、特定の言語用に2つを結合する(そしてUIが駆動する)ビューレイヤーを作成できます。このシナリオでは、翻訳不可能な要素の重複メンテナンスを回避します。

1
Egret

ベーステーブルごとに個別の多言語テーブルを用意しないことをお勧めします。多言語の文字列を表す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)

このアプローチには、ベーステーブルごとの多言語テーブルよりも多くの結合が含まれるため、許容できないほどパフォーマンスが低下する可能性があります。ただし、スキーマはよりシンプルに保たれます。

0