我的旧数据库设计看起来像
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友好网址,多语言帖子的数据库设计。等。
提前谢谢。
答案 0 :(得分:1)
您只需将密钥更改为页面ID和语言ID的组合即可。
答案 1 :(得分:0)
我不知道为什么要将页面内容存储到数据库中。可以通过某种后端更改页面内容吗?
我只存储来自用户输入的语言相关内容。在这种情况下,我使用与您相同的数据库设计。
如果页面是静态的,我从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
$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)。你将拥有更加干净的代码。