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

3

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

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

我一直在寻找适用于多语言网站的最佳数据库结构,可以添加或删除语言、文章等而不必改变数据库结构。最终我创建了一个结构,但我不确定它是否最优,而且存在几个致命问题:

Language 表 - 这是整个应用程序的语言列表。

-- ----------------------------
-- 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;

我的设计是这样的:假设我们的项目支持两种语言。英语(在language表中为id 1)和俄语(在language表中为id 2)。每个页面在表中有两条记录,像这样:{uid-1,id-2,lang-1 ...}; {uid-2,id-2,lang-2 ...}

我认为这会因为外键重复而带来严重问题,并且在编程上也很难维护。您有什么修复建议或其他设计建议吗?

请分享您的多语言数据库设计想法。

我在数据库方面没有经验,真的需要一些可靠的数据库设计来用于长期项目。

需要一些能与多语言友好的URL、多语言文章等相配合的数据库设计。

谢谢您提前。

2个回答

1
你只需将密钥更改为页面ID和语言ID的组合。

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)。这样您将拥有更加清晰的代码。


我建议您使用纯HTML。 - heron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接