Организация поиска по БД словаря

SETo

Новичок
Организация поиска по БД словаря

Мне нужна помощь в организации поиска по БД, а также, по возможности, конструктивная критика касательно её организации поскольку это первый раз когда мне приходится делать что-либо подобной сложности то я вероятно допустил кучу ошибок и в общем то слабо уверен в своих решениях.

Схему Бд я представил на рисунке:

Коротко: каждое слово имеет несколько атрибутов (список которых определен в таблице options), каждый из них (кроме двух бинарных) вынесены в отдельные таблицы (сразу вопрос, правильно ли?). Сами слова лежат в таблице words. В таблице этой каждая запись содержит информацию о том к какому языку принадлежит данное слово, индексы опций и хэш который я использую для того чтоб гарантировать уникальность записи.
Ну и таблица relations - таблица связей (в моем понимании) которая устанавливает связи между словами из разных языков (перевод). Там лежат хэши. Предполагается что одна связь может связывать несколько слов сразу. поэтому каждая запись из этой таблицы имеет столько полей сколько в словаре существует язков. Значениями этих полей являются хэши связанных слов. На все эти слова проставлен индекс (практически так быстрее, теоретически тоже думаю не большая глупость). Поле hash в этой таблице опять же таки чтоб не положить два раза одну и ту же связь (я вообще со связями не плуганул?).

Теперь касательно самого поиска.
Допустим необходимо сделать перевод слова "court" с французского и немецкого на английский. По моей задумке это должно работать след образом:
  • выбираем все слова которые содержат в себе искомую фразу и принадлежат языку с которого осуществляется перевод
    [SQL]SELECT `hash` FROM `words` WHERE `language` IN ("german", "french") AND `word` LIKE "%court%";[/SQL]
    Вообще то вместо IN ("german", "french") должны стоять индексы языков но не суть важно... Мне советовали не использовать лайков, но в поисковом запросе используется лишь один раз лайк и обойтись без него невозможно потому что мы никогда не ищем точное совпадение с заданной фразой (это оправдывает данный выбор?).
  • дальше берем и для каждого полученного слова ищем перевод на один из тех языков куда следует перевести:
    [SQL]SELECT `english` FROM `relations` WHERE `german` = "1a0861b34dbf10177909d35bacc5b467" or `french`="1a0861b34dbf10177909d35bacc5b467"[/SQL]
  • мы можем получить сколько угодно связей для искомого слова, можем их вообще не получить. Для каждого результата предыдущей выборки получаем информацию о нем из таблицы words а затем по индексам оттуда из таблиц опций.

Вот как это работает (как в общем, не дурно ли?). Но мне также необходимо обеспечить постраничный вывод информации. Просто потому что многие запросы дают очень много результатов и проблема даже не в том чтоб вывести все результаты в одно окошко браузера, сам запрос получается недопустимо тяжел. Вот я и придумал рубать его limit'ом, а для этого все результаты поиска должны быть результатом одного запроса. Я начал мутить этот запрос но получилось что - то не очень.
[SQL]
SELECT words.word, words.customer, words.domain... FROM words
JOIN relations ON words.hash = relations.english
WHERE relations.french IN (SELECT `hash` FROM `words` WHERE `language` IN ("german", "french") AND `word` LIKE "%court%");
[/SQL]
И это для одного лишь языка. Если исходных языков несколько то я уж и не знаю как, что то вроде такого:
[SQL]
SELECT words.word, words.customer, words.domain... FROM words
JOIN relations ON words.hash = relations.english
WHERE relations.french IN (SELECT `hash` FROM `words` WHERE `language` IN ("german", "french") AND `word` LIKE "%court%") OR relations.german IN (SELECT `hash` FROM `words` WHERE `language` IN ("german", "french") AND `word` LIKE "%court%";
[/SQL]
но вообще-то у меня тут 28 языков и допустИм вариант перевода "со всех на все", в общем мне кажется это маразмом, но как тогда?.
Доступа к настройкам БД сервера не имею.
mysql5
php5
Все таблицы в юникоде в MyISAM
Как быть?
 

valager

Новичок
Re: Организация поиска по БД словаря

Доступа к настройкам БД сервера не имею.
Как быть?
Перейдите или создайте дополнительный хостинг, где у Вас будет выделенный MySQL-сервер или возможность самому себе поставить MySQL-сервер.
Допустим в RU-CENTER (http://www.nichost.ru). Они дают возможность устанавливать на хостинге любое собственное ПО, фактически Вы получаете выделенный сервер, по цене обычного хостинга. Вы можете установить свой MySQL-сервер и иметь полный контроль над ним. Они даже сами рекомендуют это сделать и описывают как: http://forum.nic.ru/showthread.php?t=189 . Имея свое установленное ПО вы имеете все возможности по оптимизации и ускорению. Сам пробовал, все реально работает.

А по поводу того как писать поисковые запросы, могу лишь направить в сторону Yandex или Google. Очень быстрые движки, попробуйте поизучать, как они ищут. Допустим, попробуйте найти ответ (ы, их огромное море) на свой вопрос с их помощью ;-).
 

Alexandre

PHPПенсионер
редполагается что одна связь может связывать несколько слов сразу. поэтому каждая запись из этой таблицы имеет столько полей сколько в словаре существует язков.
и если у нас на земле 105 языков, то будет 105 полей из которых заполено будет одног или два, а остальные только занимать место в памяти - это не верно.
 

zerkms

TDD infected
Команда форума
Alexandre
аргументировать, свою точку зрения и демонстрировать несостоятельность решения на примере экономии пары сотен байт - не по-джедайски.
так не делают не потому, что оно будет на 200байт больше есть памяти, а потому, что это неудобно и идёт вразрез с кучей "лучших практик".
 

SETo

Новичок
И как тогда лучьше устроить связи между словами из разных языков?
 
Сверху