0

很快,我将致力于支持多语言内容的目录(php+mysql)。现在我正在考虑设计数据库结构的最佳方法。目前我看到了多语言处理的 3 种方法:

1) 为每种语言特定的数据提供单独的表格,即示意图如下所示:

  • 将有一个表Main_Content_Items,存储无法翻译的基本数据,例如 ID、creation_date、hits、votes 等等 - 它只有一个,并且将引用所有语言。

以下是将为每种语言复制的表格:

  • Common_Data_LANG 表(例如:common_data_en_us)(存储可以翻译的通用/“静态”字段,但存在于任何目录项中:标题、描述等...)
  • Extra_Fields_Data_LANG 表(存储可以翻译的额外字段数据,但对于自定义项目组可以不同,即:| id | item_id | field_type | value | ...)然后根据项目请求,我们将根据用户/默认语言并将可翻译数据与main_content表连接。

优点:

  • 我们可以只用一个查询更新最常更新的“主要”数据(即点击数、投票数……)
  • 如果我们有 4 种或更多语言,与仅使用一个带有“lang”字段的表的结构相比,我们不需要重复数据 4 倍或更多次。因此,MySql 查询将花费更少的时间来通过 100000(例如)记录目录而不是 400000 或更多

缺点:

  • 每种语言+2个表格

2) 在内容表中使用“lang”字段:

  • Main_Content_Items 表(存储无法翻译的基本数据,如 ID、creation_date、hits、votes 等...)
  • Common_Data 表(存储可翻译的通用/“静态”字段,但存在于任何目录项中:| id | item_id | lang | title | desc | 等等...)
  • Extra_Fields_Data 表(存储可以翻译的额外字段数据,但对于自定义项目组可以不同,即:| id | item_id | lang | field_type | value | ...)所以我们将common_data和extra_fields连接到main_content_items到 'lang' 字段。

优点:

  • 我们可以只用一个查询更新最常更新的“主要”数据(即点击数、投票数……)
  • 我们只有 3 个内容数据表

缺点:

  • 我们有 custom_data 和 extra_fields 表填充了所有语言的数据,所以它的 X 时间更大并且查询运行更慢

3) 与第二种方式相同,但 Main_Content_Items 表与 Common_Data 合并,具有“lang”字段:

优点:

  • ...?

缺点:

  • 我们需要更新最常更新的更新“主要”数据(即点击数、投票数......)
  • 我们有 custom_data 和 extra_fields 表填充了所有语言的数据,所以它的 X 时间更大并且查询运行更慢

会很高兴听到关于“什么更好”和“为什么”的建议?还是有更好的方法?

提前致谢...

4

1 回答 1

0

我在这个问题中给出了类似的答案,并强调了这种技术的优点(例如,让应用程序决定语言并通过仅更改子句中的lang参数来相应地构建查询对我来说很重要WHERESQL 查询。

这非常接近您的第二个解决方案。我不太了解“extra_fields”,但如果有意义,您可以(!)将其合并到 common_data 表中。我建议你不要第一个想法,因为会有太多的桌子,而且很容易忘记那里的物品。

对您的编辑:我仍然认为第二种方法更好(这是我的选择,所以它是相对的;))我不是优化专家,但我认为使用适当的索引和适当的表结构速度应该不是问题。与往常一样,找到最有效方法的最佳方法是同时使用两种方法,看看哪种方法最好,因为速度会因数据、结构等而异。

于 2010-07-12T12:00:02.573 回答