目前我想为移动设备开发字典应用程序。字典本身使用脱机文件/数据库来翻译单词。它只翻译两种语言,例如英语 - 西班牙语词典。 我脑子里有一个简单的设计。它将是两个表:英语表和西班牙语表。 对于每个表包含:
并且因为这是针对移动应用程序,数据库使用SQLite。
每个表的定义数据已按表上的字段'word'按顺序提供。但是,如果有数据定义的附加内容,我仍然在考虑这个问题。因为该表将按字段'word'排序,是否有任何方法可以按字顺序放置(插入)新记录?或任何提高效率的想法?
答案 0 :(得分:15)
至少每次翻译都有一些翻译可能性取决于上下文。如果你想为两种语言做一个双向字典,你至少需要三个表:
ENGLISH
ID | WORD
1 | 'dictionary'
GERMAN
ID | WORD
1 | 'lexikon'
2 | 'wörterbuch'
TRANSLATION_EN_DE
ID_EN | ID_DE
1 | 1
1 | 2
前两个表包含该语言中已知的所有单词,双向映射由第3个映射表完成。这是一个常见的n:n映射案例。 再加上两个表,你总能为你添加一种新语言。如果你用一个表做,你将有一个单词的多个定义,因此没有规范化的数据库。
您还可以将语言表合并到一个表中,该表通过另一列定义单词language(引用语言表)。在这种情况下,你需要一个2列索引的语言和单词本身。
答案 1 :(得分:3)
当语言1中的单词可以被语言2中的多个单词翻译时,您打算做什么?我认为你必须使用wursT的设计来处理它。
RE按字母顺序插入记录:您通常不担心数据库中记录的物理排序。您可以使用ORDER BY子句以任何所需的顺序检索它们,并使用索引使其高效。 SQL标准中没有任何内容可以控制物理排序。嗯,我记得在我曾经使用过的某些数据库上强制进行物理排序的事情,我认为它是MySQL,但大多数都不会给你任何控制权。我没有使用SQLite,所以我不能说它是否提供了一种方法。
答案 2 :(得分:1)
当然,单词与其可能的翻译之间的关系是一对多或多对多。我不清楚你将如何在你的模型中代表这一点。好像你可能还需要至少再增加一张桌子。
答案 3 :(得分:0)
我同意马特 - 为了让生活更轻松,我会坚持使用一张桌子。此外,如果您计划使用CoreData,则在Obj中工作时,传统数据库设计的索引建模与基于对象图的模型不同。 C / IOS。
很容易按照传统的Select查询和内部/外部联接的方式进行思考,但是例如,在为两个表定义数据模型时,通常会通过设置“关系”来处理列“correspondence_trans_id”(如果您当然正在使用CoreData)。
本质上除非有充分的理由要有两张桌子,否则我只会坚持一张。
关于排序,您可能不需要保持数据集中单词的顺序。我猜你想保留一切按字母顺序排列,如果数据不断变化,即使只有一张桌子,也会涉及一些工作。
再次使用CoreData,NSFetchRequest和NSSortDescriptor,可以很容易地返回由指定列排序的一组记录,从而使您不必担心数据库的修改和添加。
如果您有任何问题,请给我一个大喊。