1

データベースを拡張して多言語サポートを作成したいのですが、これを行う方法がわかりません。データベースは次のようになります。

ID – 名前 – 説明 – (無関係な列がたくさんあります)

オプション 1 は、テーブルに xml 列を追加することです。この列には、次のように必要な情報を格納できます。

<translation>
    <language value=’en’&gt;
        <Name value=’’&gt;
        <Description value=’’&gt;
    </language>
    <language value=’fr’&gt;
        <Name value=’’&gt;
        <Description value=’’&gt;
    </language>
</translation>

トリックと利点は、行を削除すると翻訳も削除されることです。

オプション 2 は、追加のテーブルを追加することです。情報を格納するテーブルを作成するのは簡単ですが、情報を取得するときに内部結合が必要であり、元の行が削除されたときに行を削除するためのより多くの労力が必要です。

この場合の優先オプションは何ですか? または、これに対する他の良い解決策はありますか?

4

1 に答える 1

3

「リレーショナル」アプローチ、つまり個別の変換テーブルをお勧めします。次のようにすることを検討してください。

ここに画像の説明を入力

このモデルにはいくつかの優れた特性があります。

  • 多言語テーブルごとに、個別の翻訳テーブルを作成します。このようにして、その特定のテーブルに適したフィールドを使用でき、翻訳が間違ったテーブルに「誤って接続」されることはありません。
  • LANGUAGE テーブルと関連する FOREIGN KEY の存在により、XML とは異なり、存在しない言語の翻訳が存在しないことが保証されます。
  • ON DELETE CASCADE参照アクションは、XML とは異なり、言語が削除されたときに「孤立した」翻訳が取り残されることがないようにします。
  • 単純なケースでは XML の方が高速かもしれませんが、言語の数が増えると JOIN の方がスケーラブルであると思います。1いずれにせよ、違いを測定し、それが十分に重要かどうかを自分で判断してください。
  • NAME や DESCRIPTION などの個別のフィールドは、索引付けが容易な場合があります。XML を使用する場合、XML を特別にサポートする DBMS や、何らかのフルテキスト インデックスが必要になる可能性があります。
  • NAME や DESCRIPTION などのフィールドは、おそらく通常の VARCHAR になります。OTOH、それらを組み合わせると、通常の VARCHAR には大きすぎる XML が生成される可能性があり、CLOB/BLOB を使用する必要があり、パフォーマンスが複雑になる可能性があります。
  • DBMS がクラスタリングをサポートしている場合 (以下を参照)、変換テーブル全体を 1 つの B ツリーに格納できます。XML には多くの冗長データ (開始タグと終了タグ) が含まれているため、B ツリーよりもサイズが大きくなり、キャッシュに適していない可能性があります (関連するすべてのオーバーヘッドを考慮しても)。

上記のモデルは識別関係を使用し、結果の PK: {LANGUAGE_ID, TABLEx_ID} をクラスタリングに使用できることに気付くでしょう(そのため、同じ言語に属する翻訳はデータベース内で物理的に近くに保存されます)。主要な (または「ホット」) 言語がほとんどない限り、これで問題ありません。キャッシュはデータベース ページ レベルで行われるため、同じページに「ホット」データと「コールド」データが混在しないようにすることで、「コールド」データのキャッシュが回避されます。 (そしてキャッシュを「小さく」します)。

OTOH、日常的に多くの言語を照会する必要がある場合は、クラスタリング キーの順序を {TABLEx_ID, LANGUAGE_ID} に反転することを検討してください。これにより、同じ行のすべての翻訳が物理的に近くにデータベースに保存されます。1 つの翻訳を取得すると、同じ行の他の翻訳が既にキャッシュされている可能性があります。または、1 つのクエリで複数の翻訳を抽出する場合は、少ない I/O で実行できます。


1希望する言語の翻訳だけにJOINできます。XML では、目的の言語に関連する XML のごく一部のみを使用することを決定する前に、XML 全体をロード (および解析) する必要があります。新しい言語 (および関連する XML への翻訳) を追加すると、新しい言語をほとんど使用しない場合でも、既存の行の処理が遅くなります。

于 2013-02-12T17:23:02.340 に答える