字典应用的数据库设计

时间:2011-01-21 12:22:48

标签: database database-design

目前我想为移动设备开发字典应用程序。字典本身使用脱机文件/数据库来翻译单词。它只翻译两种语言,例如英语 - 西班牙语词典。 我脑子里有一个简单的设计。它将是两个表:英语表和西班牙语表。 对于每个表包含:

  • word_id =将成为其他表的外键的id
  • word =单词
  • word_description
  • correspondence_trans_id =其他表格的ID,即此单词翻译成其他语言的内容。

并且因为这是针对移动应用程序,数据库使用SQLite。

每个表的定义数据已按表上的字段'word'按顺序提供。但是,如果有数据定义的附加内容,我仍然在考虑这个问题。因为该表将按字段'word'排序,是否有任何方法可以按字顺序放置(插入)新记录?或任何提高效率的想法?

4 个答案:

答案 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,可以很容易地返回由指定列排序的一组记录,从而使您不必担心数据库的修改和添加。

如果您有任何问题,请给我一个大喊。