Java 数据库模型国际化播放框架

Java 数据库模型国际化播放框架,java,database-design,jpa,playframework,Java,Database Design,Jpa,Playframework,我想用play!编写一个多语言应用程序!。我以前从来没有这样做过,所以我想从一开始就给你一些建议 任务: 假设我有一个带有问题和答案的简单应用程序。把它想象成一个调查。根据用户选择的语言,问题和答案以正确的语言显示。 为了更好地解列,模型如下所示: 问题:id,questionString 回答:id,fk_问题id,回答字符串,isRightBool 正如你看到的,通常是1:n关系。但是现在如何实现多语言支持呢 一个想法是复制整个数据库…这个想法看起来简单但丑陋,因为以后的更改会增加额外的开销

我想用play!编写一个多语言应用程序!。我以前从来没有这样做过,所以我想从一开始就给你一些建议

任务: 假设我有一个带有问题和答案的简单应用程序。把它想象成一个调查。根据用户选择的语言,问题和答案以正确的语言显示。 为了更好地解列,模型如下所示:

问题:id,questionString

回答:id,fk_问题id,回答字符串,isRightBool

正如你看到的,通常是1:n关系。但是现在如何实现多语言支持呢

  • 一个想法是复制整个数据库…这个想法看起来简单但丑陋,因为以后的更改会增加额外的开销…我想这将是一场噩梦
  • 其他字段,如questionStringGerman、questionStringEnglish。我也不喜欢那个主意
  • 具有1:n关系的每个modelclass的附加表。就像问题和答案一样,哥伦布是语言。似乎更容易处理
  • 一个表格用于所有翻译。哥伦布是语言。似乎是最简单但很难处理的纠正方法
  • 哪种方法最适合动态翻译。也许我错过了什么。如果有人能告诉我riht解决这个问题的方法,我会很高兴的


    提前谢谢

    我确实做过一次

    我的解决方案是使用三个表:

    表1:questionId(qid,其他字段) 表2:问题(qqid、fk_qid、问题、语言集、其他字段) 表3:答案(id、fk_qqid、答案、其他字段)


    这样,您就可以拥有任意多的语言。每个语言问题将被视为一个独立的记录。要获得同一问题的所有翻译,questionId的qid将帮助您获得该集。

    我实际上已经完成了一次

    我的解决方案是使用三个表:

    表1:questionId(qid,其他字段) 表2:问题(qqid、fk_qid、问题、语言集、其他字段) 表3:答案(id、fk_qqid、答案、其他字段)


    这样,您就可以拥有任意多的语言。每个语言问题将被视为一个独立的记录。要获得同一问题的所有翻译,questionId的qid将帮助您获得该集。

    我个人有以下几点:

    Table: Language
    Id, Name
    
    Table: Translation
    Id, UniqueName(IdxUnique), LanguageId(FK), TranslationText
    
    Table: Question
    Id, TranslationUniqueName(FK)
    
    Table: Answer
    Id, QuestionId(FK), IsRight, TranslationUniqueName(FK)
    
    我在使用Id进行翻译和使用UniqueName(键)之间左右为难-Id可能在性能方面略有益处,但使用有意义的唯一键会使开发更容易(例如将某个设置为
    WelcomeText
    ,让系统查找翻译比将其设置为
    16
    )干净得多

    此外,如果要添加/删除/复制翻译,尤其是跨多个数据库实例(不同环境)添加/删除/复制翻译,则密钥的可移植性更高

    针对您对另一个答案的评论,例如,如果未选择任何语言,您可以在
    语言
    表本身中添加权重,或者将
    语言ID
    与用户帐户关联。你也可以(如果你想聪明的话)尝试根据用户的位置来猜测(但是ofc你应该总是给他们改变的选项——没有什么比你在西班牙时被重定向到
    google.es
    更烦人的了)


    在任何情况下,你的翻译方法都应该为你做到这一点-例如你的应用程序只需要做一个
    GetTranslation('WelcomeText')
    -你的
    GetTranslation()
    方法就可以查到要使用的适当语言,并得到正确的
    字符串

    ,我个人有以下几点:

    Table: Language
    Id, Name
    
    Table: Translation
    Id, UniqueName(IdxUnique), LanguageId(FK), TranslationText
    
    Table: Question
    Id, TranslationUniqueName(FK)
    
    Table: Answer
    Id, QuestionId(FK), IsRight, TranslationUniqueName(FK)
    
    我在使用Id进行翻译和使用UniqueName(键)之间左右为难-Id可能在性能方面略有益处,但使用有意义的唯一键会使开发更容易(例如将某个设置为
    WelcomeText
    ,让系统查找翻译比将其设置为
    16
    )干净得多

    此外,如果要添加/删除/复制翻译,尤其是跨多个数据库实例(不同环境)添加/删除/复制翻译,则密钥的可移植性更高

    针对您对另一个答案的评论,例如,如果未选择任何语言,您可以在
    语言
    表本身中添加权重,或者将
    语言ID
    与用户帐户关联。你也可以(如果你想聪明的话)尝试根据用户的位置来猜测(但是ofc你应该总是给他们改变的选项——没有什么比你在西班牙时被重定向到
    google.es
    更烦人的了)


    在任何情况下,你的翻译方法都应该为你做到这一点-例如你的应用程序只需要做一个
    GetTranslation('WelcomeText')
    -然后你的
    GetTranslation()
    方法就可以查找要使用的适当语言,并获得正确的
    字符串

    Thx来获得答案。在我看来,你只是在问题和答案之间加了一层。事情是在一个更复杂的结构中,这将导致许多“层对象/数据集”。每个答案都有一个额外的对象/集合。如果答案中没有与语言相关的字段,该怎么办?像个砝码。你有重复的条目,对吗?还在考虑你的想法:)那样的话,你的体重就在普通桌子上了。很像面向对象的概念。您需要另一个表table4(id、fk_qqid、common_字段……)。对吗?谢谢你的回答。在我看来,你只是在问题和答案之间加了一层。事情是在一个更复杂的结构中,这将导致许多“层对象/数据集”。每个答案都有一个额外的对象/集合。如果答案中没有与语言相关的字段,该怎么办?像个砝码。你有重复的条目,对吗?还在考虑你的想法:)那样的话,你的体重就在普通桌子上了。很像面向对象的概念。您需要另一个表table4(id、fk_qqid、common_字段……)。正确的?