用于国际化的高效MYSQL DB结构

时间:2012-04-28 18:07:24

标签: mysql database-design

我正在为我的数据库添加对多种语言的支持。它有大约10个不同结构的不同表。我绘制了下面的结构,我认为这是一个很好的方法:

语言

lang_id (int)
lang_name (varchar 128)

样本1

sample_1_id (int)
name (int -- tran_id)
description (int -- tran_id )

样本2

sample_2_id (int)
person (int -- tran_id)
page (int -- tran_id)

翻译

tran_id (int)
lang_id (int)
content (text)

但是,要使这项工作全面完成,翻译表中的内容列不能是“文本”类型吗?如果是这样,那么浪费空间不会特别是当其中的大部分数据只是几个字符时?还有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

考虑两个翻译表。一个像这样:

Translations_Short:

tran_id (int)
lang_id (int)
content (VARCHAR(255))

请注意,MySQL 5.0.3+中VARCHAR的限制实际上是65,535字节,尽管这也是行限制。所以,你可以使用:

tran_id (int)
lang_id (int)
content (VARCHAR(65522))

另一个像这样:

Translations_Long:

tran_id (int)
lang_id (int)
content (text)

TEXT仅为65535,因此对于MySQL 5.0.3+,已经涵盖了这一点。你也可以在这里使用MEDIUMTEXT。

然后,你可以像这样决定每列:

sample_1_id (int)
name (int -- tran_long_id)
description (int -- tran_short_id )

您的应用程序将知道要链接到哪一个,对吧?

无论如何,TEXT并没有真正占用比VARCHAR更多的空间。也许一两个字节。它的性能是一个问题,而不是空间。由于您不会将TEXT列编入索引,因此这也不太可能是一个问题,除非您计划使用覆盖索引(这对于TEXT是不可能的)。无论如何,VARCHAR的索引限制为767字节,因此您无法使用覆盖索引和VARCHAR列超过767字节。

但是,如果您认为有必要,可以将它们分开。

答案 1 :(得分:0)

这个怎么样...... 我们来看一下"页面"表

主要" 页面"表:

id - primary

链路

ADATE

EDATE

状态

等...

翻译" pages_langs "表:

page_id - 主要的

lang_id - "语言"表例如1 **这里是你想要翻译的所有内容**

title - 页面标题,例如lang_id = 1

文本

术语 - (该术语用于url美化和类似的东西,需要进入 langs table)

" 语言"表:

id - primary

标题

前缀

SELECT将是这样的:

SELECT p.id, p.link, pl.title, pl.text 
FROM pages
INNER JOIN pages_langs pl ON p.id = pl.page_id AND pl.lang_id = <<current lang id>>

有问题吗?