SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 17.09.2019 00:16:22

pautinaweb
Участник
Зарегистрирован: 01.08.2017
Сообщений: 13

Подскажите лучшую реализацию таблиц для хранения словарей

хочу сделать своеобразный словарь-переводчик, но как лучше сделать не знаю.
На ум приходит сделать одну таблицу со всеми языками (их будет около 10) по типу такого:

id|en|ru|es|fr|de|...

Или сделать таблицы для каждого языка с переводом

id|en|ru
id|es|ru
id|fr|ru
id|de|ru

И так далее, как сделали бы вы, важно удобство поддержки и производительность в первую очередь

Неактивен

 

#2 17.09.2019 08:08:13

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 387

Re: Подскажите лучшую реализацию таблиц для хранения словарей

Если правильно, то две таблицы.
1. Языки: id|язык
2. Перевод: id|язык_id|слово

Неактивен

 

#3 17.09.2019 18:22:36

pautinaweb
Участник
Зарегистрирован: 01.08.2017
Сообщений: 13

Re: Подскажите лучшую реализацию таблиц для хранения словарей

Спасибо это решение гораздо лучше, плюс можно будет привязать разные переводы к слову, ведь одного слова может быть много переводов.
И тогда еще вопрос
Как лучше делать для две таблицы для каждого языка или можно засунуть все в одну таблицу?

Ведь допустим в каждом языке будет по 20000 слов у каждого слова может быть по 5 вариантов перевода и тогда получается таблича с переводами будет иметь 100000 слов, а 10 языков это один миллион записей.

Или может лучше сделать 10 пар таблиц (по 2 на каждый язык)

Неактивен

 

#4 18.09.2019 07:45:16

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 387

Re: Подскажите лучшую реализацию таблиц для хранения словарей

Не нужно делать таблицу для каждого языка.  Сделайте индекс по "язык_id"
Примерно так.

CREATE TABLE languages (
  id int(11) NOT NULL AUTO_INCREMENT,
  language varchar(2) NOT NULL,
  PRIMARY KEY (id)
);
CREATE TABLE Transfer (
  id int(11) NOT NULL AUTO_INCREMENT,
  Language_id int(11) NOT NULL,
  Transfer varchar(255) NOT NULL,
  PRIMARY KEY (id)
);

ALTER TABLE Ttransfer
ADD CONSTRAINT FK_Transfer_Language_id FOREIGN KEY (Transfer_id)
REFERENCES Languages (id) ON DELETE CASCADE ON UPDATE CASCADE;

Неактивен

 

#5 30.09.2019 00:11:43

pautinaweb
Участник
Зарегистрирован: 01.08.2017
Сообщений: 13

Re: Подскажите лучшую реализацию таблиц для хранения словарей

klow написал:

Не нужно делать таблицу для каждого языка.  Сделайте индекс по "язык_id"
Примерно так.

CREATE TABLE languages (
  id int(11) NOT NULL AUTO_INCREMENT,
  language varchar(2) NOT NULL,
  PRIMARY KEY (id)
);
CREATE TABLE Transfer (
  id int(11) NOT NULL AUTO_INCREMENT,
  Language_id int(11) NOT NULL,
  Transfer varchar(255) NOT NULL,
  PRIMARY KEY (id)
);

ALTER TABLE Ttransfer
ADD CONSTRAINT FK_Transfer_Language_id FOREIGN KEY (Transfer_id)
REFERENCES Languages (id) ON DELETE CASCADE ON UPDATE CASCADE;

Не совсем понятно как хранить связь между словом и его переводом тогда?
Думал может как то так тогда:


CREATE TABLE `words` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `lang_id` INT(11) NOT NULL,
    `word` varchar(50) NOT NULL,
    PRIMARY KEY (`id`)
);

CREATE TABLE `translate` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `word` INT(11) NOT NULL,
    `translate` INT(11) NOT NULL,
    PRIMARY KEY (`id`)
);

ALTER TABLE `translate` ADD CONSTRAINT `translate_fk0` FOREIGN KEY (`word`) REFERENCES `words`(`id`);

ALTER TABLE `translate` ADD CONSTRAINT `translate_fk1` FOREIGN KEY (`translate`) REFERENCES `words`(`id`);


 


https://s8.hostingkartinok.com/uploads/images/2019/09/414d1c0d5f367407acc99464bf136cec.png
Но опять же у одного слова например на английском может быть пять переводов на русский, может как то по другому такое делают?

Отредактированно pautinaweb (30.09.2019 00:59:37)

Неактивен

 

#6 30.09.2019 14:47:41

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 387

Re: Подскажите лучшую реализацию таблиц для хранения словарей

smile Идея была в другом.
Две таблицы:
1. Языки. Тут нет никаких слов!!!
2. Слово на этом языке.

CREATE TABLE `langs` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `lang` varchar(2) NOT NULL,
    PRIMARY KEY (`id`)
);

CREATE TABLE `words` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `lang_id` INT(11) NOT NULL,
    `word` INT(11) NOT NULL,
    PRIMARY KEY (`id`)
);

ALTER TABLE `translate` ADD CONSTRAINT `translate_fk0` FOREIGN KEY (`lang_id`) REFERENCES `langs`(`id`);

Отредактированно klow (30.09.2019 14:50:34)

Неактивен

 

#7 30.09.2019 18:28:04

pautinaweb
Участник
Зарегистрирован: 01.08.2017
Сообщений: 13

Re: Подскажите лучшую реализацию таблиц для хранения словарей

klow написал:

smile Идея была в другом.
Две таблицы:
1. Языки. Тут нет никаких слов!!!
2. Слово на этом языке.

CREATE TABLE `langs` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `lang` varchar(2) NOT NULL,
    PRIMARY KEY (`id`)
);

CREATE TABLE `words` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `lang_id` INT(11) NOT NULL,
    `word` INT(11) NOT NULL,
    PRIMARY KEY (`id`)
);

ALTER TABLE `translate` ADD CONSTRAINT `translate_fk0` FOREIGN KEY (`lang_id`) REFERENCES `langs`(`id`);

Ну слова, это не самое главное, меня больше волнует вопрос, как лучше хранить переводы к ним?

Неактивен

 

#8 30.09.2019 18:39:07

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 387

Re: Подскажите лучшую реализацию таблиц для хранения словарей

Вы правы, немного ступил.
Нужна еще одна таблица.

CREATE TABLE `words` (
    `word_id` INT(11) NOT NULL,
    `word_translate_id` INT(11) NOT NULL,
    PRIMARY KEY (`word_id`, `word_translate_id`)
);

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson