首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多语言网站的优化数据库模型

多语言网站的优化数据库模型
EN

Stack Overflow用户
提问于 2013-09-15 10:35:40
回答 2查看 731关注 0票数 3

我以前的数据库设计看起来就像

代码语言:javascript
复制
 id | name_en | title_en | name_ru | title_ru ...

我在为多语种网站寻找最优的数据库结构,在那里我可以添加删除语言,发布.等,没有改变数据库结构相当长的时间。

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

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

代码语言:javascript
复制
-- ----------------------------
-- 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表格-菜单类型如侧边栏菜单,顶部菜单.

代码语言:javascript
复制
-- ----------------------------
-- 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;

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

代码语言:javascript
复制
-- ----------------------------
-- 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;

页面表-多语言页面表

代码语言:javascript
复制
-- ----------------------------
-- 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)。任何页面在表中都有2条记录:比如{uid - 1, id - 2 lang - 1 ...}; {uid - 2 , id - 2, lang - 2 ...}

我认为它会有严重的问题,因为重复id的外键和编程将很难维护它。有任何建议来修正它或任何其他设计建议?

请分享您的多语种数据库设计思想。

我没有在数据库方面的经验,真的需要一些坚固的数据库设计,以便在项目中使用很长时间。

需要一些数据库设计,将与多语言seo友好的urls,多语种的文章工作。等等。

提前谢谢你。

EN

回答 2

Stack Overflow用户

发布于 2013-09-16 07:43:27

您只需将键更改为页面id和语言id的组合即可。

票数 1
EN

Stack Overflow用户

发布于 2013-09-15 11:50:35

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

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

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

这些步骤将是:

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

strings.en.txt:

代码语言:javascript
复制
title = Title
paragraph1 = This is the first paragraph.

strings.es.txt

代码语言:javascript
复制
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>

如果您最终完成了这个解决方案,我建议您使用一些模板引擎(这样的智能或小树枝)。您将有一个更干净的代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18811377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档