0

我有一个多语言网站,它的用户可以拥有不同语言的个人资料,例如每个用户可以将他的个人资料以“英语”、“法语”和“西班牙语”发布,比如 LinkedIn。

现在,我是一个使用“英语”语言查看网站的用户,所以当我转到其他会员个人资料页面时,我应该看到该会员个人资料是“英语”,如果该个人资料没有该语言,我应该在该成员“main_lang”中看到该配置文件。

所以我有一个“成员”表,其中有一列是“published_profile_langs”,在这个 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
        }

有没有更好的方法来实现这一目标?也许以某种方式查询一次而不是两次?这种情况下有更好的数据库结构吗?

我将不胜感激任何帮助

4

3 回答 3

1

尝试将语言视为数据库中的另一个实体。使用该表members存储所有不依赖于语言的数据,并有第二个数据表;members_i18n- 的缩写memebers_internationalization

在第一个表中,您可以有一个名为的列main_language_id,并使用第二个表为每个成员存储不同语言的数据列,方法是使用member_id和关联language_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'

您最终会得到一两行,具体取决于成员的个人资料。

于 2012-11-18T15:03:53.333 回答
0

您可以拥有一个表成员(id_user、mainlang、firstname、...)和一个表配置文件(id_user、语言和该语言的所有数据)。对于用户,每种语言都有一行。你的选择是这样的

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(此处的一行表示该特定用户具有该语言的个人资料)

现在,我同意,您可能仍然需要两个查询,但我认为它更易于管理,因为表名可从 lang 表中获得,并且您可以将其保留在会话中(例如,您让用户从下拉列表中选择向下切换到哪种语言,表名本身就可以在那里使用,这样您就不必获取它)...

让我知道这种思想方向是否有帮助..也许我可以提供进一步的帮助...

于 2012-11-19T08:23:18.480 回答