0

私は、ユーザーがさまざまな言語でプロファイルを持つことができる多言語 Web サイトを持っています。

さて、私はウェブサイトを「英語」言語で表示しているユーザーなので、他のメンバーのプロフィール ページに移動すると、そのメンバー プロフィールが「英語」で表示されるはずですが、そのプロフィールがその言語で利用できない場合は、そのメンバー「main_lang」にそのプロファイルが表示されるはずです。

したがって、「published_profile_langs」という列を持つ「members」テーブルがあります。この列には、各メンバーがプロファイルを公開した言語がカンマ区切りで保存されます。「英語、スペイン語」、および「main_lang」列は次のとおりです。ユーザーのメイン言語 (サインアップ手順の詳細を求めているため、彼のプロフィールは間違いなく main_lang で公開されています)。

一方、メンバーの詳細は、「members_details_english」、「members_details_spanish」、「members_details_french」など、さまざまなテーブルに格納されます。

クエリに参加したいのですが、私が管理した方法では不可能なようです。現在、上記のシナリオでメンバーの詳細をロードするために 2 つのクエリを使用する必要があります。「members_profile.php」のコードは次のとおりです。

// FIRST QUERY
$check_member = mysql_query("SELECT main_lang, profile_published_langs FROM members WHERE id = '$this_user_id'");
    while($row = mysql_fetch_array($check_member)){
            $this_main_lang = $row['main_lang'];
            $this_profile_published_langs = $row['profile_published_langs'];
        }
    $this_profile_published_langs_arr = explode(',', $this_profile_published_langs);
    if(!in_array($lang, $this_profile_published_langs_arr)) $lang = $this_main_lang;

$details_table = 'members_details_' . $lang;

// SECOND QUERY
$get_details = mysql_query("SELECT * FROM $details_table WHERE member_id = '$this_user_id'");
        while($row_details = mysql_fetch_array($get_details)){
            //blah blah
        }

これを達成するためのより良い方法はありますか?たぶん、2回ではなく1回クエリすることはできますか?このシナリオのより良いデータベース構造はありますか?

どんな種類の助けにも感謝します

4

3 に答える 3

1

言語をデータベース内のもう 1 つのエンティティと考えてみてください。テーブルmembersを使用して、言語に依存しないすべてのデータを格納し、次のデータを含む 2 つ目のテーブルを作成します。members_i18n- の略memebers_internationalization

最初のテーブルでは、 という列を作成し、2 番目のテーブルを使用して、およびmain_language_idで関連付けることにより、メンバーごとに異なる言語でデータの列を格納できます。このようにして、すべての言語、メイン言語のみ、または必要な特定の言語セットで各メンバーのデータを取得できます。member_idlanguage_id

さらに、テーブルでシリアル化されたデータを使用する必要はありませんprofile_published_langs

したがって、いくつかのクエリの例は次のようになります。

-- Main language
SELECT * 
FROM member AS m
JOIN member_i18n AS mi
  ON m.member_id = mi.member_id
  AND m.main_language_id = mi.language_id

-- Specific language
SELECT * 
FROM member AS m
JOIN member_i18n AS mi
  ON m.member_id = mi.member_id
WHERE mi.language_id = 'eng'

-- All languages
SELECT * 
FROM member AS m
JOIN member_i18n AS mi
  ON m.member_id = mi.member_id

編集:

個人的には、通常、次のような言語で 3 番目のテーブルを使用します。

CREATE TABLE `language` (
  `language_id` char(3) NOT NULL,
  `name` varchar(30) NOT NULL,
  `code2` char(2) NOT NULL,
  PRIMARY KEY (`language_id`)
);
-- Sample data
INSERT INTO `language` (`language_id`, `name`, `code2`) VALUES
  ('deu', 'Deutsch', 'de'),
  ('eng', 'English', 'en');

多言語データを印刷するときにとても便利です。

編集2:

したがって、「現在の」言語とメイン言語でユーザーのデータを取得するには、次のような単一のクエリを記述します。

-- Current language (i.e. 'eng') + member's main language
SELECT * 
FROM member AS m
JOIN member_i18n AS mi
  ON m.member_id = mi.member_id
WHERE mi.language_id = m.main_language_id
  OR mi.language_id = 'eng'

メンバーのプロフィールに応じて、1 行または 2 行になります。

于 2012-11-18T15:03:53.333 に答える
0

テーブルメンバー(id_user、mainlang、firstname、...)とテーブルプロファイル(id_user、言語、およびその言語のすべてのデータ)を持つことができます。また、ユーザーの場合、言語ごとに1つの行があります。あなたの選択はこのようなものです

select * from profile where id_user = $userId and language = $lang
于 2012-11-18T14:32:21.880 に答える
0

私はおそらくユーザーテーブル、言語テーブル、マッピングテーブルを作成します

  1. user_main-すべての通常の列。ここにメール言語の列があります
  2. 言語テーブル-保持したいもの、コードなど、および列-言語テーブル名(user_details_spanishなどのテーブルと同等)
  3. マッピングテーブル-ユーザーID、言語ID(ここの行は、その特定のユーザーがその言語のプロファイルを持っていることを意味します)

さて、私はあなたがまだ2つのクエリを必要とするかもしれないことに同意しますが、テーブル名はlangテーブルから利用可能であり、セッション中(たとえば、ユーザーにドロップから選択させる場所)に保持できるため、はるかに管理しやすいと思いますどの言語に切り替えるかを決めると、テーブル名自体が利用できるので、テーブル名を取得する必要はありません)...

この考え方が役立つかどうか教えてください..おそらく私はさらに助けることができます...

于 2012-11-19T08:23:18.480 に答える