ブログ投稿、posts
、およびスキーマのテーブルがあるとします。
id
author
title
content
各post
は、いくつかのcategories
に属することができます
id
name
descrtiption
したがって、ブログ投稿は複数のカテゴリに属することができます。
明らかにtitle
のcontent
とposts
、およびname
のdescription
とcategories
は異なる言語に翻訳できます。
では、既存のdbスキーマ設計を踏まえて、多言語アプリケーションのサポートを拡張するための最も効率的で合理的な方法は何でしょうか。
最小限の作業は、各テーブルに言語コードを配置することです。その場合の問題は、たとえば、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
...
理想的には、投稿とそのカテゴリの両方を同時に翻訳する必要があります。宣言的な制約を使用して両方の存在を同時に強制することは困難です。これが要件である場合は、強制をアプリケーションにプッシュする方が簡単です。
投稿を表示する場合、対応するカテゴリは同じ言語のものである必要があります。このため、各ユーザーは言語を選択できます。アイテムがユーザーの優先言語に翻訳されていない場合にどうなるかを決定するルールが必要になります。たぶん、システムのデフォルト言語が定義されていますか?
多言語サポートには、次のスタイルのスキーマを使用しました。
+---------------+
| 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)
カテゴリ情報を挿入するときにすべての翻訳が利用可能でなかったときに、この方法を使用しました。また、すべてではないが複数の翻訳が利用可能な場合は、各言語にどの翻訳を使用するかを示しました。