【问题标题】:Multilingual database - Get all languages of post多语言数据库 - 获取所有语言的帖子
【发布时间】:2014-10-03 08:21:35
【问题描述】:

我想编写一个将多语言数据存储在数据库中的应用程序。有些帖子具有唯一 ID,它们是用多种语言编写的(至少 2 种语言,可能会添加其他语言)。我已经浏览了几篇 stackoverflow 的帖子,并找到了这些几乎令人满意的答案:
Multi-language Category Titles in Mysql Database
What's the best database structure to keep multilingual data?
Schema for a multilanguage database

他们都建议这样放3张桌子:

[ languages ]
id (INT)
name (VARCHAR)

[ products ]
id (INT)
price (DECIMAL)

[ translation ]
id (INT, PK)
model (VARCHAR) // product
field (VARCHAR) // name
language_id (INT, FK) 
text (VARCHAR)

(来自上述链接之一)

我同意该解决方案,但我希望应用程序显示帖子所用的所有可能语言。我已经考虑阅读帖子的所有翻译并仅使用一种来创建页面,但使用另一种翻译以显示其他可能的语言。我不喜欢这个想法,因为这样我会从数据库中检索到太多未使用的数据(因为我检索了许多翻译而只使用一个)。
我还想过检索所有可能的翻译并将它们存储在页面中(例如,在 javascript 代码中,在数据属性中等),但这会使页面变慢,因为我认为大多数用户只想看到帖子只用一种语言。
所以我猜应用程序必须执行 2 个查询:一个获取翻译,一个获取帖子的所有语言。但我认为有一种方法可以将它放在一个查询中,但我不知道如何做到这一点。

有没有一种简单的方法来阅读一种语言的翻译(由用户或默认设置,可能只是第一个数据库条目)和所有其他语言的帖子编写只需一个查询?

提前致谢。

【问题讨论】:

    标签: mysql database database-design translation multilingual


    【解决方案1】:

    我建议您使用两个查询以获得更高的灵活性。

    您也可以使用一个查询 - 例如在字符串中获取用“,”分隔的语言:

    SELECT t.*,
      (SELECT GROUP_CONCAT(l1.name SEPARATOR ',')
        FROM translation t1
        JOIN languages l1 ON l1.id = t1.language_id
        WHERE t1.product_id = t.product_id
        GROUP BY t1.product_id
      ) AS lang_names
    FROM translation t
      -- there put required JOIN-s --
      WHERE t.id = ?
    

    there: ? 是您希望显示的翻译 ID 的占位符。 我假设 translation 表中有 product_id 字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-12
      • 2021-10-06
      • 1970-01-01
      • 2012-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多