2

質問を投稿する前でも回答がありますが、それが最善の解決策かどうかはわかりません。ビジネス上の問題は次のとおりです。

固定データ テーブルの i18l をサポートするため。アプリケーションは完全にロケールを認識しますが、ページに表示されるテキストの一部はデータベースから取得されます。次に例を示します。

テーブルは「期間」です:

INSERT INTO PERIOD (lang, ref, desc) VALUES
('en', 'HOUR', 'Hourly'),
('en', 'WEEK', 'Weekly'),
('en', 'MONTH', 'Monthly'),
('de', 'HOUR', 'Stündlich'),
('de', 'WEEK', 'Wöchentlich'),
('de', 'MONTH', 'Monatlich');

自動生成された ID を使用しない理由は、誰かがドイツ語でサイトを使用していて、毎週の発生に「Wochentlich」を選択した場合、ロケールが英語に変更された場合に「毎週」を使用したいからです。表示されます。ID を使用していた場合、それは実際に選択されたアイテムに固定され、「このクライアントには wochtenlich スタンディング オーダーがあります」のような文になってしまいます。そのため、代わりに「ref」を「外部キー」として保存することで解決しました。このようなデータを取得するための各クエリは、'ref' および 'lang' パラメータを使用して、現在設定されている言語で正しい項目を取得します。

VARCHAR を外部キーとして指定できないため、データベースで正しい関係が得られないという欠点があります。(MySQL 5.x を使用しています)

この問題を解決するためのより正しい方法を提案できる人はいますか?

どうもありがとう。

4

1 に答える 1

1

期間の種類ごとに 1 つの行を格納し、翻訳された用語ごとに追加の列を使用するようにアプリを設計します。

INSERT INTO PERIOD (ref, desc_en, desc_de) VALUES
('HOUR', 'Hourly', 'Stündlich'),
('WEEK', 'Weekly', 'Wöchentlich'),
('MONTH', 'Monthly', 'Monatlich');

特定のロケールのすべての期間の説明のリストを取得できます。

SELECT desc_de FROM PERIOD;

特定の期間の特定のロケールでの説明を取得できます。

SELECT desc_de FROM PERIOD WHERE ref = 'WEEK';

翻訳が完了していない場合も考慮することができます。

SELECT COALESCE(desc_de, desc_en) AS desc FROM PERIOD WHERE ref = 'WEEK';

ユーザー指定のロケールから説明を取得できます (SQL インジェクションを避けるために、ロケールの選択をホワイトリストに登録するように注意してください)。たとえば、PHP では次のようになります。

$locales = array('en'=>1, 'de'=>1);
$locale = array_key_exists($_GET['locale'], $locales) ? $_GET['locale'] : 'en';
$sql = "SELECT desc_{$locale} FROM PERIOD WHERE ref = 'WEEK'";

PS:価値があるのは、(InnoDB を使用している限り) MYSQL の任意のバージョンで主キーまたは外部キーとして varchar を使用できることです。

CREATE TABLE FOO (id VARCHAR(10) PRIMARY KEY);
CREATE TABLE BAR (foo_id VARCHAR(10), FOREIGN KEY (foo_id) REFERENCES FOO(id));
于 2013-08-18T19:14:39.810 に答える