在MYSQL中实现多语言数据库设计
2014-09-26常中华
摘 要:在设计和开发一个多语言版本的网站时,通常把每一种语言的内容保存在同一数据库中,在数据库设计时有多种方法,每一种方法根据网站的需求和数据的大小可以不同。本文通过PHP+MYSQL实现三种不同的多语言网站设计和开发方案。
关键词:网站开发;数据库设计;MYSQL;PHP
中图分类号: TP311 文献标识码:A
1 引言(Introduction)
随着全球经济一体化,我国各行各业融入国际社会的步伐在加快,开发一个多国语言网站是向国际社会展示自己的有效途径。在设计和开发一个多语言版本的网站时,我们通常把每一种语言的内容保存在同一数据库中,在数据库设计时有多种方法,每一种方法根据网站的需求和数据的大小可以不同[1]。本文通过PHP+MYSQL实现三种不同的多语言网站设计和开发方案。
2 字段列方法(Column approach)
这是最简单的方法,创建一个数据库,如Test,数据库中建立存放网站内容的表App_product,为每种语言添加一个文本列,创建该表的MYSQL语句如下[2]:
CREATE TABLE app_product (
`id` int(10) NOT NULL AUTO_INCREMENT,
`date_created` datetime NOT NULL,
`price` decimal(10,2) unsigned NOT NULL DEFAULT '0.00',
`title_cn` varchar(255) NOT NULL,
`title_en` varchar(255) NOT NULL,
`title_jp` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);
向表App_product中输入网站内容,如图1所示。
图1 字段列方法数据库MYSQL截图
Fig.1 MYSQL screenshot of column approach
用PHP实现查询的代码:
<?php
// 检索所有语言的标题列
$sql = "SELECT * FROM `app_product` WHERE 1";
if($result = mysql_query($sql)){
if($row = mysql_fetch_assoc($result)){
echo "Chinese: ".$row["title_cn"]."
";
echo " English: ".$row["title_en"]."
";
echo "Japanese: ".$row["title_jp"]."
";
}
}
//根据选择的语言,显示检索结果
$sql = "SELECT `title_".$_SESSION['current_language']."` as `title`
FROM `app_product`";
if($result = mysql_query($sql)){
if($row = mysql_fetch_assoc($result)){
echo "Current Language: ".$row["title"];
}
}
?>
这种方法的优点是:容易实现,每个语言在数据库表中为一列内容,没有重复内容。缺点是:数据库维护困难,适合于两三种语言。
3 记录行方法(Multirow approach)
这种方法与上面的字段列方法相似,只是每种语言的内容占据一行,创建App_product_row表的MYSQL语句如下:
CREATE TABLE app_product_row (
`id` int(10) NOT NULL AUTO_INCREMENT,
`date_created` datetime NOT NULL,
`price` decimal(10,2) unsigned NOT NULL DEFAULT '0.00',
`language_id` varchar(2) NOT NULL,
`title` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);
向表App_product中输入网站内容,如图2所示。
图2 记录行方法数据库MYSQL截图
Fig.2 MYSQL Screenshot ofMultirow Approach
用PHP实现查询的代码:
<?php
// 检索语言列
$sql = "SELECT * FROM `app_product` WHERE `id` = 1";
if($result = mysql_query($sql)){
while($row = mysql_fetch_assoc($result)){
echo "Language (".$row["language_id"]."): ".$row["title"]."
";endprint
}
}
//根据选择的语言,显示检索结果
$sql = "SELECT `title`
FROM `app_product_row`
WHERE `language_id` = '".$_SESSION['current_language']."'";
if($result = mysql_query($sql)){
if($row = mysql_fetch_assoc($result)){
echo "Current Language: ".$row["title"];
}
}
?>
这种方法的优点是:容易实现,每一行就是一种语言的内容。缺点是:数据大量重复,数据库维护困难,如要改变价格,所有语言的价格都要修改。
4 附加转换表的方法(Additional translation table
approach)
这种方法有效解决了上述问题,并且易于维护。附加转换表app_product_translation_4的内容是每种语言对应的信息,而表app_language_4和app_product_4中存放的是公共信息[3]。创建表的MYSQL语句如下:
CREATE TABLE IF NOT EXISTS `app_product_4` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date_created` datetime NOT NULL,
`price` decimal(10,2) NOT NULL DEFAULT '0.00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `app_product_translation_4` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`product_id` int(11) NOT NULL DEFAULT '0',
`language_code` char(2) NOT NULL,
`title` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`description` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `translation_id` (`product_id`),
KEY `language_code` (`language_code`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `app_language_4` (
`code` char(2) NOT NULL,
`name` varchar(20) NOT NULL,
PRIMARY KEY (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
分别向表app_product_translation_4、app_language_4和app_product_4中输入网站内容,及其三个表之间的关系,如图3所示。
图3 附加转换表的方法数据库MYSQL截图及其关系
Fig.3 MYSQL Screenshot and Relation ofAdditional
Translation Table Approach
用PHP实现查询的代码:
<?php
// 检索所有语言标题列
$sql = "SELECT p.*, pt.title, pt.description, l.name as language_name
FROM `app_product_4` p
INNER JOIN `app_product_translation_4` pt ON p.id = pt.product_id
INNER JOIN `app_language_4` l ON pt.language_code = l.code
WHERE p.id = 1";
if($result = mysql_query($sql)){
while($row = mysql_fetch_assoc($result)){
echo "Language (".$row["language_name"]."): ".$row["title"]."
";
}
}
// 根据选择的语言检索符合条件的结果
$sql = "SELECT p.*, pt.title, pt.description
FROM `app_product_4` p
INNER JOIN `app_product_translation_4` pt ON p.id = pt.product_id
WHERE p.id = 1 AND pt.language_code = '".$_SESSION['current_language']."'";
if($result = mysql_query($sql)){
if($row = mysql_fetch_assoc($result)){
echo "Current Language: ".$row["title"];
}
}
?>
这种方法的优点是:更符合数据库设计的规范,增加新的语言更容易实现,查询的效率更高。缺点是:表的数量增加,需要增加转换表。
5 结论(Conclusion)
在多语言网站设计时,上述数据库设计的方法不是唯一的选择,也可采用其他方法,要根据项目需求而定,但上述方法是十分常用而有效的。当网站的内容涉及的语言不多,又固定那几种语言时,列或行方法较为简单实用,否则使用增加附加表的方法。
参考文献(References)
[1] 张菲菲,薛贺,李建良.多语言Web网站的设计与实现[J].微电
子学与计算机,2008,25(5):43.
[2] 主福洋,郭坤.基于PHP技术的网站建设[J].软件工程师,2013,
1:60.
[3] MathewHillier.Theroleofculturalcontextinmultilingualwe
bsiteusability[J].ElectronicCommerceResearchandApplications,
2003(2):2-14.
作者简介:
常中华(1968-),男,硕士,副教授.研究领域:计算机应用
技术.endprint
}
}
//根据选择的语言,显示检索结果
$sql = "SELECT `title`
FROM `app_product_row`
WHERE `language_id` = '".$_SESSION['current_language']."'";
if($result = mysql_query($sql)){
if($row = mysql_fetch_assoc($result)){
echo "Current Language: ".$row["title"];
}
}
?>
这种方法的优点是:容易实现,每一行就是一种语言的内容。缺点是:数据大量重复,数据库维护困难,如要改变价格,所有语言的价格都要修改。
4 附加转换表的方法(Additional translation table
approach)
这种方法有效解决了上述问题,并且易于维护。附加转换表app_product_translation_4的内容是每种语言对应的信息,而表app_language_4和app_product_4中存放的是公共信息[3]。创建表的MYSQL语句如下:
CREATE TABLE IF NOT EXISTS `app_product_4` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date_created` datetime NOT NULL,
`price` decimal(10,2) NOT NULL DEFAULT '0.00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `app_product_translation_4` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`product_id` int(11) NOT NULL DEFAULT '0',
`language_code` char(2) NOT NULL,
`title` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`description` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `translation_id` (`product_id`),
KEY `language_code` (`language_code`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `app_language_4` (
`code` char(2) NOT NULL,
`name` varchar(20) NOT NULL,
PRIMARY KEY (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
分别向表app_product_translation_4、app_language_4和app_product_4中输入网站内容,及其三个表之间的关系,如图3所示。
图3 附加转换表的方法数据库MYSQL截图及其关系
Fig.3 MYSQL Screenshot and Relation ofAdditional
Translation Table Approach
用PHP实现查询的代码:
<?php
// 检索所有语言标题列
$sql = "SELECT p.*, pt.title, pt.description, l.name as language_name
FROM `app_product_4` p
INNER JOIN `app_product_translation_4` pt ON p.id = pt.product_id
INNER JOIN `app_language_4` l ON pt.language_code = l.code
WHERE p.id = 1";
if($result = mysql_query($sql)){
while($row = mysql_fetch_assoc($result)){
echo "Language (".$row["language_name"]."): ".$row["title"]."
";
}
}
// 根据选择的语言检索符合条件的结果
$sql = "SELECT p.*, pt.title, pt.description
FROM `app_product_4` p
INNER JOIN `app_product_translation_4` pt ON p.id = pt.product_id
WHERE p.id = 1 AND pt.language_code = '".$_SESSION['current_language']."'";
if($result = mysql_query($sql)){
if($row = mysql_fetch_assoc($result)){
echo "Current Language: ".$row["title"];
}
}
?>
这种方法的优点是:更符合数据库设计的规范,增加新的语言更容易实现,查询的效率更高。缺点是:表的数量增加,需要增加转换表。
5 结论(Conclusion)
在多语言网站设计时,上述数据库设计的方法不是唯一的选择,也可采用其他方法,要根据项目需求而定,但上述方法是十分常用而有效的。当网站的内容涉及的语言不多,又固定那几种语言时,列或行方法较为简单实用,否则使用增加附加表的方法。
参考文献(References)
[1] 张菲菲,薛贺,李建良.多语言Web网站的设计与实现[J].微电
子学与计算机,2008,25(5):43.
[2] 主福洋,郭坤.基于PHP技术的网站建设[J].软件工程师,2013,
1:60.
[3] MathewHillier.Theroleofculturalcontextinmultilingualwe
bsiteusability[J].ElectronicCommerceResearchandApplications,
2003(2):2-14.
作者简介:
常中华(1968-),男,硕士,副教授.研究领域:计算机应用
技术.endprint
}
}
//根据选择的语言,显示检索结果
$sql = "SELECT `title`
FROM `app_product_row`
WHERE `language_id` = '".$_SESSION['current_language']."'";
if($result = mysql_query($sql)){
if($row = mysql_fetch_assoc($result)){
echo "Current Language: ".$row["title"];
}
}
?>
这种方法的优点是:容易实现,每一行就是一种语言的内容。缺点是:数据大量重复,数据库维护困难,如要改变价格,所有语言的价格都要修改。
4 附加转换表的方法(Additional translation table
approach)
这种方法有效解决了上述问题,并且易于维护。附加转换表app_product_translation_4的内容是每种语言对应的信息,而表app_language_4和app_product_4中存放的是公共信息[3]。创建表的MYSQL语句如下:
CREATE TABLE IF NOT EXISTS `app_product_4` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date_created` datetime NOT NULL,
`price` decimal(10,2) NOT NULL DEFAULT '0.00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `app_product_translation_4` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`product_id` int(11) NOT NULL DEFAULT '0',
`language_code` char(2) NOT NULL,
`title` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`description` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `translation_id` (`product_id`),
KEY `language_code` (`language_code`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `app_language_4` (
`code` char(2) NOT NULL,
`name` varchar(20) NOT NULL,
PRIMARY KEY (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
分别向表app_product_translation_4、app_language_4和app_product_4中输入网站内容,及其三个表之间的关系,如图3所示。
图3 附加转换表的方法数据库MYSQL截图及其关系
Fig.3 MYSQL Screenshot and Relation ofAdditional
Translation Table Approach
用PHP实现查询的代码:
<?php
// 检索所有语言标题列
$sql = "SELECT p.*, pt.title, pt.description, l.name as language_name
FROM `app_product_4` p
INNER JOIN `app_product_translation_4` pt ON p.id = pt.product_id
INNER JOIN `app_language_4` l ON pt.language_code = l.code
WHERE p.id = 1";
if($result = mysql_query($sql)){
while($row = mysql_fetch_assoc($result)){
echo "Language (".$row["language_name"]."): ".$row["title"]."
";
}
}
// 根据选择的语言检索符合条件的结果
$sql = "SELECT p.*, pt.title, pt.description
FROM `app_product_4` p
INNER JOIN `app_product_translation_4` pt ON p.id = pt.product_id
WHERE p.id = 1 AND pt.language_code = '".$_SESSION['current_language']."'";
if($result = mysql_query($sql)){
if($row = mysql_fetch_assoc($result)){
echo "Current Language: ".$row["title"];
}
}
?>
这种方法的优点是:更符合数据库设计的规范,增加新的语言更容易实现,查询的效率更高。缺点是:表的数量增加,需要增加转换表。
5 结论(Conclusion)
在多语言网站设计时,上述数据库设计的方法不是唯一的选择,也可采用其他方法,要根据项目需求而定,但上述方法是十分常用而有效的。当网站的内容涉及的语言不多,又固定那几种语言时,列或行方法较为简单实用,否则使用增加附加表的方法。
参考文献(References)
[1] 张菲菲,薛贺,李建良.多语言Web网站的设计与实现[J].微电
子学与计算机,2008,25(5):43.
[2] 主福洋,郭坤.基于PHP技术的网站建设[J].软件工程师,2013,
1:60.
[3] MathewHillier.Theroleofculturalcontextinmultilingualwe
bsiteusability[J].ElectronicCommerceResearchandApplications,
2003(2):2-14.
作者简介:
常中华(1968-),男,硕士,副教授.研究领域:计算机应用
技术.endprint