如何为多语言词汇清单App搭建类似谷歌翻译的数据库结构?
方案设计
完全不需要为每个语言对单独建表,这种方案扩展性极差,仅需要调整现有Word实体结构,新增语言对标识字段即可。
第一步:调整Entity实体结构
在原有字段基础上新增源语言source_lang、目标语言target_lang两个字段,同时为这两个字段添加联合索引,提升按语言对查询的性能:
@Entity( tableName = "words", indices = [Index(value = ["source_lang", "target_lang"])] ) data class Word( val first_word: String, val second_word: String, val bookmarked: Boolean, // 新增字段:源语言ISO 639-1编码,例如ko=韩语、en=英语、ja=日语 val source_lang: String, // 新增字段:目标语言ISO 639-1编码 val target_lang: String, @PrimaryKey(autoGenerate = true) val id: Int )
保存单词的时候,直接把当前App设置的源语言、目标语言编码一起存入对应字段即可。
第二步:编写对应DAO查询方法
当用户切换语言对后,仅需要按当前选中的源语言、目标语言过滤即可拿到对应列表:
@Dao interface WordDao { // 按指定语言对查询所有单词 @Query("SELECT * FROM words WHERE source_lang = :sourceLang AND target_lang = :targetLang ORDER BY id DESC") suspend fun getWordsByLangPair(sourceLang: String, targetLang: String): List<Word> // 其他原有增删改方法无需调整,插入时传入source_lang和target_lang即可 @Insert suspend fun insertWord(word: Word) }
可选优化(适合多语言对较多的场景)
如果你的App支持的语言数量超过10种,还可以单独建一张语言对配置表,避免重复存储语言编码字符串,进一步节省存储空间:
@Entity(tableName = "lang_pairs", primaryKeys = ["source_lang", "target_lang"]) data class LangPair( val source_lang: String, val target_lang: String, val pair_name: String // 可选,例如"韩语-英语",用于展示在语言切换列表 )
小体量App不需要做这层拆分,直接用第一种方案完全够用。
内容的提问来源于stack exchange,提问作者Morteza
相关产品推荐
相关产品推荐

