【问题标题】:How to handle multiple languages best in database applications?如何在数据库应用程序中最好地处理多种语言?
【发布时间】:2012-10-25 09:10:45
【问题描述】:

我有一系列用于以各种语言显示消息的属性文件。
因此,根据当前的语言设置,消息可能会以英语、法语或德语等显示。
在我的数据库中,我有各种记录,而不是实际值,我放置了属性文件的键,以便在使用该数据检索记录时,我可以用相应的语言显示消息。
例如。我的数据库中可能有一条记录,例如:

John| Smith| AQ| etc

其中AQ在相应的属性文件中可以显示为DoctorArzt
我的问题是我需要偶尔按这些属性排序,这些属性在数据库中的值虽然是代码,但在数据库中排序是不可能的。
here 我得到了使用临时表和排序的建议,但对于 1 个属性来说这对我来说很好。
我正在寻找一种更通用的解决方案来处理多个属性文件并尽可能避免检查代码:
例如if this query sorts on X create this temp table
有没有通用的解决方案?

【问题讨论】:

    标签: java sql database design-patterns internationalization


    【解决方案1】:

    与其将语言信息存储在属性文件中,不如将其存储在数据库的表中。那么这一切都可以轻松完成。

    Records:
    first | last  | messageid |
    John  | Smith | 1         |
    
    Messages:
    messageid | language | message |
    1         | English  | Mr.     |
    1         | Spanish  | Sr.     |
    2         | English  | Doctor  |
    etc...
    

    然后按本地语言的消息排序的查询将是这样的:

    select first, last, message from records r
        inner join messages m on m.messageid = r.messageid
        where language = [your current language]
        order by message
    

    【讨论】:

      【解决方案2】:

      好问题!

      恕我直言,您想继续使用属性文件来本地化这种字符串 - 它允许您使用 Java 的内置 IL8N 功能,从而为您节省大量时间。

      一般来说,我的建议是在数据库中存储域对象的本地字符串——例如,如果您有一个产品数据库,并且您需要存储产品名称,那么这显然是域的一部分;管理产品的人员还需要管理产品名称,并且您希望能够强制执行业务逻辑和参照完整性。

      您可能会争辩说,这适用于您给出的示例 - 标题是“人”域的一部分,应该在数据库中进行管理。

      对于用户界面元素——按钮上的文本、菜单项的名称——属性文件是绝对正确的。

      如果您认为“标题”是用户界面的一部分,或者您不想移动它,因为您已经建立了本地化流程,我的建议是使用 Java 而非 SQL 进行排序;取决于您连接到数据库的方式,有很多方法可以做到这一点。

      【讨论】:

      • +1 这似乎很有帮助。我不熟悉 Java 的 I18N 特性,只是从 SQL 的角度来回答。如果您想使用属性文件以使 Java 易于使用,同时在数据库中进行高效排序,则可以以编程方式将信息放在这两个位置。即将属性文件中的相关信息复制到数据库中,以便用于排序。
      • @NevilleK:IMO 最好避免在 Java 中进行排序,因为我更喜欢从 SQL 服务器部分获取结果,而不是处理可能数十万条记录。
      • 在数据库中排序确实更有效 - 但是将资源文件与数据库中的某些内容同步的挑战是一个巨大的痛苦,有很多令人兴奋的失败模式......如果你是对大量记录进行排序,您应该咬紧牙关将所有内容移入数据库。
      【解决方案3】:

      在应用程序启动时,您可以同步包含键、区域设置和实际消息的表。这些将是普通表,因此您可以在普通 SQL 查询中访问它们。

      但我建议您始终在应用程序中进行排序,因为这看起来真的很像应用程序逻辑。

      【讨论】:

      • 1) 实际消息不在表格中,而是在属性文件中 2) 从我的角度来看,排序并不是真正的应用程序,因为我可能有数十万个条目,我不想在我的应用程序中进行排序,但从 SQL 服务器的“页面”中获取结果
      • @Jim with synchronize 我的意思是将属性文件中的值插入到表中。
      • 但我猜不是临时表
      • 但是临时连接会持续一个连接会话,对吧?那么这将如何运作呢?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-14
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多