多语言网站的最佳数据库模型

时间:2013-09-15 10:35:41

标签: php mysql sql database multilingual

我的旧数据库设计看起来像

 id | name_en | title_en | name_ru | title_ru ...

我正在寻找多语言网站的最佳数据库结构,我可以在这里添加删除语言,帖子等等,而不需要长时间更改数据库结构。

最后创建了一个。但我不确定它是否是最佳的,它有几个致命的问题:

语言表 - 它是整个应用程序的语言列表

-- ----------------------------
-- Table structure for Language
-- ----------------------------
DROP TABLE IF EXISTS `Language`;
CREATE TABLE `Language` (
  `id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
  `iso` varchar(3) NOT NULL,
  `name` varchar(255) NOT NULL,
  `description` varchar(255) NOT NULL,
  `order` tinyint(3) NOT NULL DEFAULT '0',
  `active` tinyint(1) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

MenuType 表 - 菜单类型,如侧边栏菜单,顶级菜单......

-- ----------------------------
-- Table structure for MenuType
-- ----------------------------
DROP TABLE IF EXISTS `MenuType`;
CREATE TABLE `MenuType` (
  `id` tinyint(2) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`,`name`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

菜单表 - 所有菜单项,基于父子结构。

-- ----------------------------
-- Table structure for Menu
-- ----------------------------
DROP TABLE IF EXISTS `Menu`;
CREATE TABLE `Menu` (
  `uid` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `id` int(11) unsigned DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  `url` varchar(255) DEFAULT NULL,
  `languageID` tinyint(3) unsigned DEFAULT NULL,
  `menuTypeID` tinyint(2) unsigned DEFAULT NULL,
  `order` int(2) DEFAULT NULL,
  `parent` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

页面表格 - 多语种页面表

-- ----------------------------
-- Table structure for Page
-- ----------------------------
DROP TABLE IF EXISTS `Page`;
CREATE TABLE `Page` (
  `uid` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `id` int(11) DEFAULT NULL,
  `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `title` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `languageID` tinyint(3) unsigned DEFAULT NULL,
  `content` text COLLATE utf8_unicode_ci,
  `deleted` tinyint(1) DEFAULT NULL,
  `permalink` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

我的设计就是这样的:假设我们的项目适用于2种语言。英语(language表中的id 1)和俄语(language表中的id 2)。 Ever page在表格中有2条记录:like {uid - 1, id - 2 lang - 1 ...}; {uid - 2 , id - 2, lang - 2 ...}

我认为它会有严重的问题,因为用外键重复id,并且以编程方式很难维护它。有任何修复建议或任何其他设计建议吗?

请分享您的多语言数据库设计理念。

我对数据库没有经验,并且在项目中长时间使用时确实需要一些坚如磐石的数据库设计。

需要一些可以使用多语言seo友好网址,多语言帖子的数据库设计。等。

提前谢谢。

2 个答案:

答案 0 :(得分:1)

您只需将密钥更改为页面ID和语言ID的组合即可。

答案 1 :(得分:0)

我不知道为什么要将页面内容存储到数据库中。可以通过某种后端更改页面内容吗?

我只存储来自用户输入的语言相关内容。在这种情况下,我使用与您相同的数据库设计。

如果页面是静态的,我从ini文件加载字符串,然后将值用于模板。

步骤如下:

  • 使用键值对创建ini文件。每种语言一种。

strings.en.txt:

title = Title
paragraph1 = This is the first paragraph.

strings.es.txt

title = Título
paragraph1 = Este es el primer párrafo
  • 根据用户首选项/浏览器语言加载ini文件(首先,您可以使用$ _SERVER ['HTTP_ACCEPT_LANGUAGE']获取该文件。)

$langs = parse_ini_file("strings.".$_SERVER['HTTP_ACCEPT_LANGUAGE'].".txt");

  • 使用您的变量生成HTML替换字符串。 在我的php文件中,我可以加载/解析变量$ lang,然后当我生成HTML内容时,我使用正确的变量。

    <h1><?php echo $lang['title'];?></h1> <p><?php echo $lang['paragraph1'];?></p>

如果你最终通过这个解决方案,我建议你使用一些模板引擎(如smarty或twig)。你将拥有更加干净的代码。