[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: множественные запросы к базе данных
Guest
Доброго времени суток. Сразу к вопросу. Существует скрипт который парсерит сайт переводчик. Что бы таблица с переводами не получилась огромной пришлось для каждого слова, перевод которого ищем, создать отдельную таблицу.
Т.е. мы можем указать слово собака, скрипт пробегается по всем переводам и заполняет таблицу с названием собака.
Но задача состоит в том что бы отсеивать повторяющиеся значения переводов т.е. у нас есть таблица -собака, в ней есть перводы типа энимал и дог, когда скрипт пробегается по слову кошка он получает перводы с сайта и каждый перевод проверяет по уже существующим таблицам. Таким образом пробегаясь по слову кошка скрипт получит перевод кэт и энимал т.к. энимал уже существует в таблице собака этот перевод не будет записан в таблицу кошка. И вроде бы все ничего, но количество таблиц постоянно ростет и увеличивается количество значений, в силу этого простая проверка по всем таблицам растягивается уже на 10ки минут как это все можно оптимизировать, что бы ускорить проверку?



Спустя 19 минут, 45 секунд (21.08.2011 - 10:54) kirik написал(а):
Цитата (Guest @ 21.08.2011 - 03:34)
как это все можно оптимизировать, что бы ускорить проверку?

Избавиться от множества таблиц. Это большая ошибка считать что нагрузка уменьшится, если увеличить количество таблиц.

Цитата (Guest @ 21.08.2011 - 03:34)
повторяющиеся значения переводов т.е. у нас есть таблица -собака, в ней есть перводы типа энимал и дог,

Так это таблицы переводов или что? В любом случае - можете создать уникальный индекс, тогда выборка будет происходить очень быстро, и БД не даст вставить повтор.

Как по мне, так всё очень запутано написано, чтобы можно было делать предложения по оптимизации..

Спустя 7 минут, 22 секунды (21.08.2011 - 11:01) Guest написал(а):
идея состоит в следующем для того что бы произвести выборку всех переводов одного слова нужно обратиться к таблице перевода этого слова, а не к общей базе с полумиллионым количеством строк. то же и со сравнением новых и уже существующих переводов думаю скрипту проще запрашивать информацию не сколько раз из разных таблиц чем пробегать по одной но много томной или нет?

Спустя 5 минут, 49 секунд (21.08.2011 - 11:07) Guest написал(а):
а можно ли уникальным индексом сделать поле с текстовм значением перевода, т.е. не порядковый номер в таблице а именно перевод, и еще вопрос уникальными могут быть два поля в таблице?

Спустя 8 минут, 5 секунд (21.08.2011 - 11:15) kirik написал(а):
Цитата (Guest @ 21.08.2011 - 04:07)
а можно ли уникальным индексом сделать поле с текстовм значением перевода

А вы попробуйте)

Цитата (Guest @ 21.08.2011 - 04:07)
уникальными могут быть два поля в таблице?

Хоть десять. Ещё есть такая штука как "многостолбцовый" индекс, и он тоже может быть уникальный.

Цитата (Guest @ 21.08.2011 - 04:01)
думаю скрипту проще запрашивать информацию не сколько раз из разных таблиц чем пробегать по одной но много томной или нет?

При условии грамотной расстановки индексов даже очень большая табличка может быть производительной.

Это всё тонкости, и о них можно почитать в талмуде по используемому движку БД. Так же есть SQL оператор EXPLAIN который покажет насколько тяжело СУБД найти нужную строку в таблице.

Спустя 2 минуты, 44 секунды (21.08.2011 - 11:18) Guest написал(а):
все понятно спасибо большое

Спустя 3 часа, 27 минут, 20 секунд (21.08.2011 - 14:45) Guest написал(а):
kirik
будьте добры подскажите а можно ли решить задачу следующим образом за место того что бы каждый новый перевод проверять на наличие в таблице, собрать все новые переводы поместить их во временную таблицу, столбцам с переводом в обеих таблицах назначить уникальность ключей, а затем сделать выборку через join по этим двум таблицам т.е. вернуть id тех строк чьи переводы совпали с теми которые уже содержатся в основной таблице. Может быть так более производительно получится , насколько мне известно mysql работает быстрее чем php? как поступить?

Спустя 1 минута, 37 секунд (21.08.2011 - 14:47) Guest написал(а):
или это одно и то же получится если общей таблице с переводами назначить уникальный ключ и каждый новый перевод проверять отдельно?

Спустя 6 часов, 55 минут, 20 секунд (21.08.2011 - 21:42) kirik написал(а):
Цитата (Guest @ 21.08.2011 - 07:45)
насколько мне известно mysql работает быстрее чем php?

Где вам такое сказали? БД всегда является слабым местом в выысоконагруженных проектах.

Я всё же не уверен что вам именно нужно, но мне кажется что вопрос решается 3-мя табличками:

word:
id | word

translate:
id | translate

word2translate:
word_id | translate_id

В таблице word складываем оригинальные слова [id - автоинкримент, word - уникальный]; в табличку translate складываем переводы (не важно чего) [id - автоинкримент, translate - уникальный]; в табличку word2translate хранит "ассоциации" данных из первой таблички к данным из второй (один ко многим). В общем типичная трёхтабличная архитектурка)

Спустя 1 час, 45 минут, 26 секунд (21.08.2011 - 23:27) Guest написал(а):
хмммм немного не то, фишка в том что значения перевода могут повторяться т.е. могут быть синонимы которые будут попадать переводом или синонимами к другим словам. такие повторения нужно отсеять сразу что бы база не разрослась и на одно слово были индивидуальные значения переводов
поэтому я сделал почти как описали вы

word:
id | word

translate:
id | id_word | translate

вот так не знаю только насколько это правильно

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

получить партию переводов создать временную таблицу типа id| new_translet
где new_translet будет уникальным и затем посредством join отобрать id временной таблицы тех значений которые не совпали. В результате получим набор переводов которых еще нет и соответственно перенесем эти новые переводы в таблицу translate
можно ли так делать т.е. технически это будет грамотно или нет?

Спустя 9 минут, 46 секунд (21.08.2011 - 23:37) neadekvat написал(а):
word:
id | word

translate:
id | id_word | translate

При этом во второй таблице
id_word | translate
является составным "уникальным".

При добавлении запрос выглядит так:
INSERT IGNORE ...
А перевод должен быть оформлен по одному правилу - т.е. в нижнем регистре.
Можно попробовать, а дальше по ситуации смотреть - быстрее это или не быстрее. Но проще - точно.

Спустя 8 минут, 26 секунд (21.08.2011 - 23:46) kirik написал(а):
Цитата (Guest @ 21.08.2011 - 16:27)
могут быть синонимы которые будут попадать переводом или синонимами к другим словам. такие повторения нужно отсеять сразу что бы база не разрослась и на одно слово были индивидуальные значения переводов

Ээм..
Давайте с примером из вашего поста: собака [dog, animal], кошко [cat, animal].
При использовании вышеописанного способа с тремя табличками, мы получим следующие данные по таблицам:
word:
id | word
------------
1 | собака
2 | кошка


translate:
id | translate
---------------
1 | dog
2 | animal (т.к. колонка translate уникальная, имеем всего один перевод на оба слова)
3 | cat


word2translate:
word_id | translate_id
----------------------
1 | 1 (собака - dog)
1 | 2 (собака - animal)
2 | 3 (кошка - cat)
2 | 2 (кошка - animal)


При описаной таблице вами, у нас будут дублироваться данные в поле translate второй таблицы (в случае с кошками - два раза будет animal), а если это поле будет уникальным, как вы сказали, то вы не сможете назначить кошке перевод animal (т.к. animal уже существует для собаки).

Возвращаясь к нашим трём табличкам, рассмотрим что будет происходить при добавлении переводов:
- берём слово и его переводы
- добавляем слово в таблицу word (получаем word_id)
- проверяем, есть ли перевод в таблице translate.
+ есть - просто берём его translate_id
- нет - вставляем в таблицу translate новый перевод, забираем translate_id
- добавляем в третью таблицу (word2translate) новую пару word_id:translate_id


Как-то так..

Спустя 4 минуты, 12 секунд (21.08.2011 - 23:50) Guest написал(а):
ооой голова уже не варит спасибо за ответы я подумаю отпишусь

Спустя 17 секунд (21.08.2011 - 23:50) neadekvat написал(а):
Позволю себе добавить, почему вариант kirik'a лучше:
1. Можно сделать двусторонний перевод. В случаи с двумя таблицами, перевод будет работать только в одну сторону.
2. Размер базы будет намного меньше.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.