在 MySQL 中存储翻译的更好方法

dro*_*zdo 7 php mysql database

在数据库中存储多语言字段并更新/访问它的最佳方式是什么?
我正在处理 6 种语言。

具有 2 行和 2 种语言的示例

选项 1:
数据库 - 1 表设计:

table1.products
id --- parent -- product_name
1  ---    5   -- a:2:{s:2:"en";s:3:"dog";s:2:"cs";s:3:"pes"}
2  ---    5   -- a:2:{s:2:"en";s:3:"cat";s:2:"cs";s:5:"macka"}
Run Code Online (Sandbox Code Playgroud)

更新此选项 1 太容易了
1. 将旧翻译数组与更新或新语言字段合并 (PHP array_merge)
2. 序列化合并数组
3. 简单更新数据库。

优点:

  • 减少 MySQL JOIN 过程
  • 一张桌子,一排
  • 轻松处理多行,fe:用 Y 语言更新 X 产品



选项2:
数据库-2表设计:

table1.products
id --- parent
1  ---    5  
2  ---    5  

table2.products_translations
product_id --- lang -- product_name
    1      ---  en  -- dog
    1      ---  cs  -- pes
    2      ---  en  -- cat
    2      ---  cs  -- macka
Run Code Online (Sandbox Code Playgroud)

更新这个选项2有点困难。

优点:

  • 更好地使用一种语言
  • 更好的数据库视图



成为最佳数据库解决方案是什么意思?每个产品将包含所有语言的无限文本块(描述)。
谢谢

Gor*_*off 7

存储数据的最佳方式应该由数据的访问模式以及数据完整性的要求来定义。

您的第二个解决方案是在数据库中存储数据的更典型的方法。它已标准化。它允许您访问任何产品的任何特定语言。更重要的是,您可以添加更多语言并轻松进行更改。这将是更理想的方法。

我不会担心连接的性能。通过适当的索引,这应该非常有效。

在某些情况下,可能需要第一种方法。例如,如果您的底层代码始终同时使用所有语言,则可能需要将结构作为字符串数组的 JSON 数组返回,并在应用程序层中进行额外的解析。但是,以一种特定语言返回所有产品会产生大量性能开销,特别是如果您想要所有以“A”开头的产品。更新一种产品的一种特定语言值也很困难。

我强烈倾向于第二种方法,除非你对第一种方法有非常非常好的理由。