我目前正在为大学做一个项目。基本上,任务是实现一个基本的库管理工具(在 Java 中,使用 Spring Framework 和 Java Persistence API)。部分软件要求是能够添加和修改书籍条目并将它们存储在数据库中。一本书
有多种属性(标题、出版日期等)和一种特定的语言。现在,我的问题是:我如何(整齐地)实现“语言”的整个概念?我提出了一些想法,每个想法都有自己的好处和权衡:
想法1:
book
关系的属性)想法2:
language_id
作为 book
关系中的外键)想法3:
book
中的属性关系if language = "english"
到 if language = Language.ENGLISH
)对我来说,想法 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/