[英]Create tables for a dictionary?
我正在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相同。 提取特定單詞的翻譯的最佳方法是什么?
我還有第三張桌子來說明單詞和翻譯之間的關系
CREATE TABLE word_translation (
word_id INTEGER,
translation_id INTEGER
);
比在轉換表上,只需包含translation_id和entry。
這樣,您可以通過將表上的id設置為主鍵來索引翻譯和單詞。
這對您的查詢也有幫助,因為這樣您可以有很多單詞,很多翻譯,只有一個切入點
相反,如果您有一個“詞概念”標識符和一個語言字段,那么可以使它適用於多種語言:
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字段中找出一個方案(當您添加首選語言的字詞時,該方案可能只是增加值而成為種子)。
word_id INTEGER REFERENCES word(id)
實際上不會在MySQL上創建外鍵。 即使您使用的是InnoDB,它也需要顯式的FOREIGN KEY
聲明。
另外,我可能會為兩個表的ID使用自動編號,然后加上標記作為主鍵。
因此,考慮到這兩個因素,再加上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
樣式語法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.