【问题标题】:Multilang catalog(with custom fields) DB structure design多语言目录(带自定义字段)数据库结构设计
【发布时间】:2010-07-12 11:11:39
【问题描述】:

很快我将致力于支持多语言内容的目录(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 表(存储可翻译的通用/“静态”字段,但存在于 eny 目录项中:| id | item_id | lang | title | desc | 等等...)李>
  • Extra_Fields_Data 表(存储可以翻译的额外字段数据,但对于自定义项目组可能不同,例如:| id | item_id | lang | field_type | value | ...) 所以我们会根据 'lang' 字段将 common_data 和 extra_fields 加入到 main_content_items 中。

优点:

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

缺点:

  • 我们有 custom_data 和 extra_fields 表填充了所有语言的数据,因此它的 X 倍更大并且查询运行速度更慢

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

优点:

  • ...?

缺点:

  • 我们需要更新更新的“主要”数据(即点击次数、投票数...),这些数据更新频率最高,适用于每种语言
  • 我们有 custom_data 和 extra_fields 表填充了所有语言的数据,因此它的 X 倍更大并且查询运行速度更慢

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

提前谢谢...

【问题讨论】:

    标签: php mysql multilingual catalog custom-fields


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回答,Colossos 博士。我在描述 1 种方法时犯了一个错误,所以看看 FIXED VARIANT。好吧,关于第一种方法的主要目标(我真的很喜欢)是我们不会混淆不同语言的数据,特别是考虑到 extra_fields 表可以有许多记录链接到 Main_Content_Items 表中的项目 - 即在 2,3 方法中如果我们在 Main_Content_Items 表中有 1000 个项目和 4 个语言,则 extra_fields 将有 4*1000*5(或 10 个或更多...)记录。这就是为什么我认为这种方法在性能上比其他两种方法更好......
    • P.S.关于“extra_fields”:它被用作任何额外字段类型的通用表(存储为|id|item_id|field_type|field_value(简单文本字段)|),因为有些项目组可以有一些其他项目没有的特定字段' t(如商店脚本中笔记本和相机的参数)。所以我们只能废除“common_data”表,将其字段数据移动到“extra_fields”,但我不想这样做,因为在common_data中每条记录都有多个字段数据,而extra_fields每条记录只有一个字段数据(见结构) ,所以我认为最好有 2 个单独的表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    相关资源
    最近更新 更多