多言語データベースを作成する最良の方法は何ですか?すべてのテーブルのローカライズされたテーブルを作成すると、デザインとクエリが複雑になり、他の場合、各言語の列を追加するのは簡単ですが動的ではありません。エンタープライズアプリケーションに最適なものを理解してください。
多言語データベースを作成する最良の方法は何ですか?すべてのテーブルのローカライズされたテーブルを作成すると、デザインとクエリが複雑になり、他の場合、各言語の列を追加するのは簡単ですが動的ではありません。エンタープライズアプリケーションに最適なものを理解してください。
回答:
私たちがしていることは、多言語オブジェクトごとに2つのテーブルを作成することです。
たとえば、最初のテーブルには言語中立データ(主キーなど)のみが含まれ、2番目のテーブルにはローカライズされたデータと言語のISOコードを含む、言語ごとに1つのレコードが含まれます。
場合によっては、DefaultLanguageフィールドを追加して、指定した言語でローカライズされたデータが利用できない場合にその言語にフォールバックできるようにします。
例:
Table "Product":
----------------
ID : int
<any other language-neutral fields>
Table "ProductTranslations"
---------------------------
ID : int (foreign key referencing the Product)
Language : varchar (e.g. "en-US", "de-CH")
IsDefault : bit
ProductDescription : nvarchar
<any other localized data>
このアプローチを使用すると、必要な数の言語を処理できます(新しい言語ごとにフィールドを追加する必要はありません)。
更新(2014-12-14):多言語データをアプリケーションにロードするために使用される実装に関する追加情報については、この回答をご覧ください。
id
:D という単一の列を持つテーブルを作成します。説明すると、それぞれid
がリレーショナルテーブルの任意の言語からの単語を付加できる意味を表すため、meaning
(id)とword
(id、senseing_id)の2つのテーブルを取得id
しword
ます。テーブルのは単語idを表し、id
はをmeaning
表します普遍的な意味。
マーティンが投稿した答えをお勧めします。
しかし、クエリが複雑になりすぎることを心配しているようです。
すべてのテーブルに対してローカライズされたテーブルを作成することは、設計とクエリを複雑にします...
したがって、次のような単純なクエリを作成する代わりに、
SELECT price, name, description FROM Products WHERE price < 100
...そのようなクエリを書き始める必要があります:
SELECT
p.price, pt.name, pt.description
FROM
Products p JOIN ProductTranslations pt
ON (p.id = pt.id AND pt.lang = "en")
WHERE
price < 100
とてもきれいな視点ではありません。
ただし、手動で行う代わりに、独自のデータベースアクセスクラスを開発する必要があります。これにより、特別なローカリゼーションマークアップを含むSQLが事前に解析され、データベースに送信する必要がある実際のSQLに変換されます。
そのシステムを使用すると、次のようになります。
db.setLocale("en");
db.query("SELECT p.price, _(p.name), _(p.description)
FROM _(Products p) WHERE price < 100");
そして、あなたはそれをもっとうまくできると確信しています。
重要なのは、テーブルとフィールドに統一された方法で名前を付けることです。
私はこのタイプのアプローチが私にとってうまくいくと思います:
製品ProductDetail国 ========= ================== ========= ProductId ProductDetailId CountryId -etc-ProductId CountryName CountryId言語 ProductName-など- 製品説明 -など-
ProductDetailテーブルは、サポートしたい言語でのすべての翻訳(製品名、説明など)を保持します。アプリの要件によっては、国の表を細かく分類して地域の言語を使用することもできます。
マーティンの解決策は私のものと非常に似ていますが、目的の翻訳が見つからない場合、デフォルトの説明をどのように処理しますか?
それには、フィールドごとにIFNULL()と別のSELECTステートメントが必要ですか?
デフォルトの翻訳は同じテーブルに保存されます。「isDefault」のようなフラグは、現在の言語で何も見つからなかった場合の説明がデフォルトの説明であることを示します。