gpt4 book ai didi

mysql - 数据库设计 - 多语言网站

转载 作者:行者123 更新时间:2023-11-29 14:11:31 37 4
gpt4 key购买 nike

我有一个多语言网站,用户可以使用不同语言发布个人资料,例如每个用户都可以用“英语”、“法语”和“西类牙语”发布自己的个人资料,例如 LinkedIn。

现在,我是一个以“英语”语言查看网站的用户,因此当我转到其他成员(member)个人资料页面时,如果该个人资料在该页面中不可用,我应该会看到“英语”版本的成员(member)个人资料语言,我应该在该成员“main_lang”中看到该配置文件。

所以我有一个“成员”表,其中有一列“published_profile_langs”,在这个列中,每个成员发布其个人资料的语言将以逗号分隔存储:“english,spanish”和“main_lang” col,这是用户的主要语言(他的个人资料肯定在 main_lang 中发布,因为我们要求提供有关注册步骤的详细信息)。

另一方面,成员(member)详细信息存储在不同的表中,例如“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
}

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

我将不胜感激任何形式的帮助

最佳答案

尝试将语言视为数据库中的另一个实体。使用表 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'

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

关于mysql - 数据库设计 - 多语言网站,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13440968/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com