为字典创建表格?

时间:2010-03-19 12:22:52

标签: java sql sqlite

我在SQLite中创建一个字典数据库,需要一些提示。我的SQL有点生疏;)你会考虑这个好的SQL吗?它是用Java JDBC完成的。

这是用于创建表格。

CREATE TABLE word (
id INTEGER,
entry STRING, 
pos STRING
);

CREATE TABLE translation (
word_id INTEGER REFERENCES word(id), 
entry STRING
);

当填充数据时,我给每个单词一个数字(id),并且单词翻译得到与word_id相同的数字。为特定单词提取翻译的最佳方法是什么?

3 个答案:

答案 0 :(得分:1)

我有第三个关于单词和翻译之间关系的表

CREATE TABLE word_translation (
word_id INTEGER, 
translation_id INTEGER
);

比在翻译表上,只需要有translation_id和条目。

这样,您可以通过在表主键上创建id来索引您的翻译和单词。

这也有助于您的查询,因为您可以拥有许多翻译的单词,并且只有一个入口点

答案 1 :(得分:1)

如果你有一个“单词概念”标识符和一个语言字段,那么你可以使它适用于多种语言:

CREATE TABLE word (
  id INTEGER,
  entry STRING,
  language String,
  word_concept_id INTEGER,
  pos STRING
);

然后您的翻译查询

SELECT wr.entry FROM word wl, word wr 
WHERE wl.entry='DOOR' AND 
  wl.language='EN' AND
  wl.word_concept_id=wr.concept_id AND
  wr.language='CZ'

你只需要从word_concept_id字段中找出一个方案(当您在首选语言中添加术语时,可能只是为了增加值而播种)。

答案 2 :(得分:1)

word_id INTEGER REFERENCES word(id)实际上并没有在MySQL上创建外键。即使您使用的是InnoDB,也需要明确的FOREIGN KEY声明。

另外,我可能会为两个表使用自动编号,然后将标记作为主键。

所以,考虑到这两点,加上mpacona关于需要多对多关系的多个翻译的说明:

CREATE TABLE word (
word_id UNSIGNED INTEGER AUTOINCREMENT PRIMARY KEY,
entry TEXT, 
pos VARCHAR(50)
);

CREATE TABLE translation (
translation_id UNSIGNED INTEGER AUTOINCREMENT PRIMARY KEY,
word_id UNSIGNED INTEGER,
lang VARCHAR(5),
entry TEXT
);

CREATE TABLE word_translation (
word_id UNSIGNED INTEGER, 
translation_id UNSIGNED INTEGER,
PRIMARY KEY (word_id, translation_id),
INDEX (word_id),
INDEX (translation_id),
FOREIGN KEY fk_word_id (word_id) REFERENCES word(id),
FOREIGN KEY fk_translation_id (translation_id) REFERENCES translation(id)
);

编辑:我不确定pos是什么,所以我把它限制在50个字符。如果您需要超过32k字符,您可能还需要将TEXT调整为其中一个较大的变体。

将lang更新为5个字符以支持en-us样式语法。