web-dev-qa-db-ja.com

多言語コンテンツのための効率的なデータベーススキーマ?

ブログ投稿、posts、およびスキーマのテーブルがあるとします。

id
author
title
content

postは、いくつかのcategoriesに属することができます

id
name
descrtiption

したがって、ブログ投稿は複数のカテゴリに属する​​ことができます。

明らかにtitlecontentposts、およびnamedescriptioncategoriesは異なる言語に翻訳できます。

では、既存のdbスキーマ設計を踏まえて、多言語アプリケーションのサポートを拡張するための最も効率的で合理的な方法は何でしょうか。

5
Yoga

最小限の作業は、各テーブルに言語コードを配置することです。その場合の問題は、たとえば、612(英語)の投稿が943(スペイン語)の翻訳であることを示す方法がないということです。

そのレベルの相互参照を実現するには、投稿の存在とそのコンテンツを分離する必要があります。これらのテーブルがあります:

Language
  Language_id
  Name

Post
  Post_id

Category
  Category_id

PostCategory
  Post_id
  Category_id

CategoryLanguage
  Category_id
  Language_id
  Name
  Description
  ...

PostLanguage
  Post_id
  Language_id
  Title
  Content
  ...

理想的には、投稿とそのカテゴリの両方を同時に翻訳する必要があります。宣言的な制約を使用して両方の存在を同時に強制することは困難です。これが要件である場合は、強制をアプリケーションにプッシュする方が簡単です。

投稿を表示する場合、対応するカテゴリは同じ言語のものである必要があります。このため、各ユーザーは言語を選択できます。アイテムがユーザーの優先言語に翻訳されていない場合にどうなるかを決定するルールが必要になります。たぶん、システムのデフォルト言語が定義されていますか?

6
Michael Green

多言語サポートには、次のスタイルのスキーマを使用しました。

     +---------------+
     | CATEGORIES_B  |
     +---------------+
     | category_id   |
     | category_code |
     | ...           |
     +---------------+
             |
             |
+-------------------------+
| CATEGORIES_T            |    +---------------+
+-------------------------+    | LANGUAGES     |
| category_id             |    +---------------+
| translation_language_id |----| language_id   |
| category_name           |    | language_code |
| category_description    |    +---------------+
| ...                     |          |   |
+-------------------------+          |   |
             |                       |   |
             |                       |   |
+-------------------------+          |   |
| CATEGORIES_L            |          |   |
+-------------------------+          |   |
| category_id             |          |   |
| language_id             |----------+   |
| translation_language_id |--------------+
+-------------------------+

LANGUAGESには、アプリケーションでサポートするすべての言語が含まれ、language_idの主キーがあります。

1 ENG
2 FRA
3 ESP

CATEGORIES_Bには、各カテゴリの翻訳不可能な属性が含まれています。主キーはcategory_idです。

1 DBDES

レコードは、利用可能な翻訳ごとにCATEGORIES_Tに挿入され、category_idとtranslation_language_idの複合主キーがあります。

1(DBDES)  1(ENG)  Database Design  The logical and/or physical design of a database

サポートされている言語ごとに、レコードがCATEGORIES_Lに挿入されます。これが使用する翻訳であることを示します。 category_idとlanguage_idの複合主キーがあります。

1(DBDES)  1(ENG)  1(ENG)
1(DBDES)  2(FRA)  1(ENG)
1(DBDES)  3(ESP)  1(ENG)

CATEGORIES_Lには、CATEGORIES_BとLANGUAGESのデカルト積のすべての値が含まれている必要があります。

翻訳が利用可能になると、CATEGORIES_TテーブルとCATEGORIES_Lテーブルのレコードが適切に修正されます。

1(DBDES)  1(ENG)  Database Design  The logical and/or physical design of a database
1(DBDES)  2(FRA)  Database Design  La conception logique et/ou physique d'une base de données

1(DBDES)  1(ENG)  1(ENG)
1(DBDES)  2(FRA)  2(FRA)
1(DBDES)  3(ESP)  1(ENG)

そして最終的に:

1(DBDES)  1(ENG)  Database Design          The logical and/or physical design of a database
1(DBDES)  2(FRA)  Database Design          La conception logique et/ou physique d'une base de données
1(DBDES)  3(ESP)  Diseño de base de datos  El diseño lógico y/o física de una base de datos

1(DBDES)  1(ENG)  1(ENG)
1(DBDES)  2(FRA)  2(FRA)
1(DBDES)  3(ESP)  3(ESP)

カテゴリ情報を挿入するときにすべての翻訳が利用可能でなかったときに、この方法を使用しました。また、すべてではないが複数の翻訳が利用可能な場合は、各言語にどの翻訳を使用するかを示しました。

4
DrabJay