Создать таблицы для словаря? - PullRequest
0 голосов
/ 19 марта 2010

Я делаю словарную базу данных в 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), и переводы слов получают тот же номер, что и слово_id Каков наилучший способ получения переводов для конкретного слова?

Ответы [ 3 ]

1 голос
/ 19 марта 2010

Что, если вместо этого у вас есть идентификатор "концепция слова" и поле языка, вы можете заставить его работать на нескольких языках:

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 (которое может быть просто для начального увеличения значений при добавлении терминов на предпочитаемом языке).

1 голос
/ 19 марта 2010

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 символов.Вам также может понадобиться настроить TEXT на один из его более крупных вариантов, если вам нужно более 32 тыс. Символов.

Обновлен lang до 5 символов для поддержки синтаксиса стиля en-us.

1 голос
/ 19 марта 2010

У меня была бы третья таблица для связи между словом и переводом

CREATE TABLE word_translation (
word_id INTEGER, 
translation_id INTEGER
);

Чем в таблице перевода, просто есть translation_id и запись.

Таким образом, вы можете проиндексировать свои переводы и слова, указав идентификатор в первичных ключах таблиц.

Это также помогает в ваших запросах, поскольку у вас может быть много слов с множеством переводов и только одна точка входа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...