我在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相同的数字。为特定单词提取翻译的最佳方法是什么?
答案 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
样式语法。