java - 在数据库中存储语言的最佳实践

标签 java spring database user-interface jpa

我目前正在为大学做一个项目。基本上,任务是实现一个基本的库管理工具(在 Java 中,使用 Spring Framework 和 Java Persistence API)。部分软件要求是能够添加和修改书籍条目并将它们存储在数据库中。一本书
有多种属性(标题、出版日期等)和一种特定的语言。现在,我的问题是:我如何(整齐地)实现“语言”的整个​​概念?我提出了一些想法,每个想法都有自己的好处和权衡:
想法1:

  • 用户输入 :纯文本字段
  • 数据库 :将语言存储为字符串(作为 book 关系的属性)
  • 优点 : 实现非常简单
  • 缺点 :语言可能不统一(“english”、“en”、“English”、“ENGLISH”,...),人为错误的空间很大(错别字,...)

  • 想法2:
  • 用户输入 :下拉/组合框
  • 数据库 :预定义的语言关系,包含所有可能的语言(例如 language_id 作为 book 关系中的外键)
  • 优点 :语言是统一的(例如“英语”,“德语”,“意大利语”,...),人为错误的空间很小
  • 缺点 : 所有可能的语言的集合是什么?应该/可以省略某些语言吗?这是矫枉过正吗?是否有太多开销?应该使用什么格式的语言(人类可读的:“English”、“english”,或更紧凑的:“en”、“en-us”、...)?

  • 想法3:
  • 用户输入 :下拉/组合框
  • 源代码 : 和想法 2 一样,但现在将所有可能的语言硬编码为源代码中的枚举
  • 数据库 : 将特定枚举转换为字符串/序数并将其用作 book 中的属性关系
  • 优点 :Idea 2 的优点 + 源代码中没有语言字符串的硬编码(从 if language = "english"if language = Language.ENGLISH)
  • 缺点 :想法 2 的缺点 + 如何将枚举映射到数据库中(字符串、序数、单独关系)?数据库中的枚举和语言必须“同步”。

  • 对我来说,想法 2 可能是“最合理的”,但我仍然不确定这是否真的是一种“好”的方法。也许你可以帮我一下。

    最佳答案

    将表示与业务逻辑分开。
    使用 standardized language code用于您的内部业务逻辑和数据存储。您有多种选择。我会在它的 Locale 中选择 Java 使用的代码类,如果这涵盖了您的域的需求。例如,en英语和 fr对于法语。
    为了向用户展示,本地化每种语言的显示名称。当用户在数据输入期间选择一种语言时,您将其转换为用于逻辑和存储的语言代码值。
    使用让用户从列表中选择的 GUI 小部件。对于长列表,通常最好使用允许在用户键入名称的前几个字母时预先输入以选择项目的小部件。
    获取所有已知的数组 Locale对象通过调用 Locale.getAvailableLocales .循环这些以制作 Set , 以构建不同的语言代码列表。
    或调用 Locale.getISOLanguages 获取 ISO 639-1 中定义的所有 2 字母语言代码的列表。 Locale class 还提供三个字母的 ISO 639-2 语言代码。我不是这里的专家,所以我不知道其中的区别。但是我们可以看到this list of 3 & 2 letter codes defined by ISO 639-1 and 639-2 .
    要获取语言的本地化名称,请将用户的首选语言环境对象传递给 Locale::getDisplayLanguage 方法。

    String displayNameOfFrenchLanguageForJapaneseUser = Locale.FRENCH.getDisplayLanguage( Locale.JAPAN ) ;
    

    displayNameOfFrenchLanguageForJapaneseUser = フランス語


    而对于德国用户。
    String displayNameOfFrenchLanguageForGermanUser = Locale.FRENCH.getDisplayLanguage( Locale.GERMAN );
    System.out.println( "displayNameOfFrenchLanguageForGermanUser = " + displayNameOfFrenchLanguageForGermanUser );
    

    displayNameOfFrenchLanguageForGermanUser = Französisch


    至于定义枚举,一个 Enum 是在编译时定义的。无法在运行时使用更多或更少的项目重新定义 Enum。 相比之下,语言环境和语言代码偶尔会发生变化。 使用不同版本的 Java 升级您的部署可能会更改其已知区域设置。所以我会倾向于软编码。如果您的域适用于不太可能更改的特定数量的语言,请说 Romance languages of Western Europe ,然后使用 enum 进行硬编码可能是合适的。
    如果您需要跟踪方言而不仅仅是广泛的语言,例如魁北克法语与一般法语,那么您可能想了解 Common Locale Data Repository (CLDR)现在与从 OpenJDK 构建的 Java 实现捆绑在一起.

    关于java - 在数据库中存储语言的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65269097/

    相关文章:

    java - 如何在构造函数中设置@Value的值以进行测试

    java - Java 8中如何将文件复制到另一个目录?

    java - 从网站获取 JSOUP 数据,该数据在页面完全加载后加载值

    java - Spring Boot,在 REST Controller 中上传任意数量的文件

    java - Spring组件注解编译时扫描

    php - drupal如何连接数据库

    java - fillRect 没有显示

    spring - aws s3 删除对象不起作用

    java - 为什么我使用 DB2 LUW 和 WebSphere App Server 得到 SQLCODE=-204, SQLSTATE=42704?

    mysql - 如何在mysql EAV模型中实现数据过滤