多语种数据库 - 获取所有发布的语言

时间:2014-08-10 09:56:14

标签: mysql database database-design translation multilingual

我想编写一个多语言数据存储在数据库中的应用程序。有些帖子具有唯一的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个查询:一个用于获取翻译,另一个用于获取帖子的所有语言。但我认为有一种方法可以将其放在一个查询中,但我不知道如何做到这一点。

是否有一种简单的方法可以阅读某种语言的翻译(由用户提供或默认,也许只是第一个数据库条目)以及只用一个查询编写帖子的所有其他语言?

提前致谢。

1 个答案:

答案 0 :(得分:2)

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

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

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 = ?

那里:是您希望展示的翻译ID的占位符。 我假设翻译表中有 product_id 字段。