2016-06-24 10 views
0

5つの言語で利用できるアプリの場合、dbテーブルにUIテキストが保存されるたびに、各言語に1つずつ、label_EN、label_FRなどの5つの列を追加します。その後、SQLを構築する方法は、あまりにも多くの複雑さを加えることなく、我々は、動的SQLを構築する際に基本列名に追加言語パラメータ、... SQLでテキストラベルの国際化を処理するにはどうすればよいですか?

string language = "_EN"; 
cmd.Append("select id, label" + language + " from myTable"); 

は、より良い方法があるがかかりますか?目標は、言語パラメータを取り、正しいラベルを返す単一のクエリを持つことですが、私は文字列メソッドでSQLを操作することから離れたいと思います。私はこれをSQLで扱いたいと思っています。私はほとんどが受け入れられたパターンに従うことを望むだろう。

答えて

0

ここで問題になっているのは、正規化の欠如です。あなたは各言語のための列を持っているので、このアーキテクチャと永遠に戦うつもりです。第6言語を追加するとどうなりますか?あなたは戻って、あなたのテーブルとそれにアクセスするすべてのクエリを変更する必要があります。また、現在のデザインでは、文字列を構築して実行する必要があることをすでに理解しています。これにより、SQLインジェクションが可能になります。

代わりに5行のデータがある場合、これは正規化された設計となり、クエリは簡単になります。

表のデザインには、このようなものがあります。

create table myTable 
(
    ID int 
    , LabelText nvarchar(50) 
    , LanguageCode char(2) 
) 
+0

となり、結合時に言語が条件になります。シンプル。なぜ私は泡立つようになったのですか?誰が今のデザインを思いついたのですか? – bbsimonbb

0

Case文を使用すると、次のように目的の列を取得できます。この場合、言語ラベルごとに同じ列名が使用されます。

DECLARE @language VARCHAR(5) = '_EN'; 

SELECT id, CASE WHEN language = '_EN' THEN label_EN 
      WHEN language = '_FR' THEN label_FR 
      WHEN language = '_JR' THEN label_JR 
      WHEN language = '_PK' THEN label_PK 
      WHEN language = '_FK' THEN label_FK 
     END AS Label 
FROM myTable 
関連する問題