2012-11-18 87 views
0

我有一個多語種的網站,它的用戶可以有不同的語言配置文件,例如每個用戶可以有自己的個人資料刊登在「英語」和「法國」和「西班牙」,東西比如LinkedIn。數據庫設計 - 多語種的網站

現在,我是使用「英語」語言查看網站的用戶,因此,當我轉到其他成員個人資料頁面時,如果該個人資料不可用,我應該在「英語」中看到該成員個人資料該語言,我應該看到該成員「main_lang」中的配置文件。

所以我有一個名爲「published_profile_langs」的「members」表,在這個COL中每個成員發佈他的個人資料的語言將被存儲逗號分隔:「english,spanish」和「main_lang 「col這是用戶的主要語言(他的個人資料肯定是在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 
     } 

有沒有更好的方法來實現這一目標?也許有人去查詢一次,而不是兩次?針對這種情況的更好的數據庫結構?

我希望任何形式的幫助

+0

您的問題被標記爲MySQL,但包含PHP代碼: - ? –

回答

0

你可以有一個表成員(id_user,mainlang,姓名,...)和表的個人資料(id_user,語言,該語言的所有數據)。而對於一個用戶,每個語言都有一排。您的選擇是這樣的

select * from profile where id_user = $userId and language = $lang 
1

嘗試將語言看作是數據庫中的另一個實體。使用表members來存儲所有不依賴於語言的數據,並使用第二個表格,其中的數據是; members_i18n - memebers_internationalization的簡稱。

在第一個表格中,您可以有一個名爲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 

編輯:

就個人而言,我通常使用第三表語言,看起來像這樣:

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' 

你的結局根據會員的個人資料,可以添加一行或兩行。

+0

這仍然沒有幫助1查詢的問題,無論如何感謝 – behz4d

+0

隨着我寫在這裏的解決方案,您可以_can_獲取單個查詢的成員的主要語言和「當前」語言,如果它存在的細節。我已經更新了我的答案。結果你只會得到一兩行。 –

0

我可能會建一個用戶表,語言表和映射表

  1. user_main - 所有常用列,戕郵件語言列在這裏
  2. 語言表 - 無論你想保留,代碼等,再加上欄柱 郎表名(相當於你user_details_spanish等表)
  3. 映射表 - 用戶ID,lanague ID(此行意味着 特定的用戶都有一個配置文件以該語言)

現在,我同意,你可能仍然需要兩個查詢,但我認爲它更容易管理,因爲表名可以從lang表中獲得,並且你可以保留它在會話中(例如,你可以讓用戶從下拉菜單中選擇要切換的語言,表名可以在那裏使用,這樣你就不必去取它了)...

讓我知道這個思想方向是否有幫助..也許我可以幫助進一步...