APP下载

在MYSQL中实现多语言数据库设计

2014-09-26常中华

软件工程 2014年9期
关键词:数据库设计

摘 要:在设计和开发一个多语言版本的网站时,通常把每一种语言的内容保存在同一数据库中,在数据库设计时有多种方法,每一种方法根据网站的需求和数据的大小可以不同。本文通过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

猜你喜欢

数据库设计
试论数据库设计在网站开发中的应用
基于WEB的科研信息管理系统的设计与实现
面向等级考试,探讨高校理工科计算机基础课程教学改革