3

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

 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)。每页在表中有 2 条记录:like {uid - 1, id - 2 lang - 1 ...}; {uid - 2 , id - 2, lang - 2 ...}

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

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

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

需要一些可以与多语言 seo 友好 url、多语言帖子一起使用的数据库设计。ETC..

先感谢您。

4

2 回答 2

1

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

于 2013-09-16T07:43:27.287 回答
0

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

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

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

步骤是:

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

字符串.en.txt:

title = Title
paragraph1 = This is the first paragraph.

字符串.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)。您将拥有更干净的代码。

于 2013-09-15T11:50:35.597 回答