Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2010, 11:12   #11
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
база с тремя таблицами для 3 уровней сложности весит в 7 раз меньше прошлой))) Крутяк.
ну и зря!
Зачем это деление на таблицы?! Я бы однозначно засунул всё в одну. добавил столбец с длиной слова + индекс по нему. И тогда в запросе можно было бы укзывать:
select * from ttt where длина_слова between МинимальнаяДлина и МаксимальнаяДЛина

p.s. я знаю, что практически в любой СУБД есть функция, возвращающая длину слова (LEN, LENGTH() и т.д.). Но введение дополнительного (избыточного) поля позволит увеличить во много раз скорость запросов по длине слова...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.11.2010, 11:36   #12
Риндера
Delphi, учу С
Форумчанин
 
Аватар для Риндера
 
Регистрация: 20.10.2010
Сообщений: 178
По умолчанию

Хм, можно и в одну... Но вот на счет запроса... Я не очень дружу с SQL, поэтому делаю так:
Код:
case difficult of
0: number := RandomRange(1,620);
1: number := RandomRange(621,1594);
2: number := RandomRange(1595,2019);
end;
AdoTable1.Locate('Num',IntToStr(number),[]);
и дальше уже работаю с этой записью.
Это плохо?
Риндера вне форума Ответить с цитированием
Старый 11.11.2010, 11:56   #13
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

прежде всего, хочу сказать, что когда я писал свой предыдущий пост (#11), я не обновил страничку и не увидел пост Stilet. Поэтому моё сообщение в некотором мысле повторило мысль Виталия...

Цитата:
дальше уже работаю с этой записью.
Это плохо?
ну, как Вам сказать.. А если из базы удалят слово. Всё?! Кирдык?! Надо переделывать код, ставить новые диапазоны?!
т.е. Вы делаете не очень хорошо. Но, если не трогать данные, то работать будет.
Но я бы переделал! чтобы можно было безболезнено добавлять.удалять слова!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.11.2010, 12:02   #14
Риндера
Delphi, учу С
Форумчанин
 
Аватар для Риндера
 
Регистрация: 20.10.2010
Сообщений: 178
По умолчанию

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

И все же Серж, куда я должна буду написать запрос на выборку одной-единственной записи и как с ней работать в дальнейшем?
Цитата:
+ индекс по нему
тоже не очень поняла.

Последний раз редактировалось Риндера; 11.11.2010 в 12:04.
Риндера вне форума Ответить с цитированием
Старый 11.11.2010, 13:27   #15
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
куда я должна буду написать запрос на выборку одной-единственной записи
Туда же куда и остальные запросы конечно же
Просто получишь таблицу с одной записью - всего-то.
Цитата:
тоже не очень поняла.
Для быстрого нахождения данных в БД создаются индексы - это таблицы, где указанные поля отсортированны. СУБД проходит по ним как по бинарному дереву, находя указатель на запись. В случае с фильтрацией находятся крайние границы фильтра, и выдается только те записи которые попали в эти границы, а поскольку индекс (таблица индексов) сортирован такой проход не займет много времени и сил у машины.

Что такое индексы и как они работают знаешь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.11.2010, 13:39   #16
Риндера
Delphi, учу С
Форумчанин
 
Аватар для Риндера
 
Регистрация: 20.10.2010
Сообщений: 178
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Что такое индексы и как они работают знаешь?
Нет

Как я поняла, надо сделать запрос в самой БД, а из программы этот запрос вызывать? А то помнится куда-то там в ADO-компоненты писали запросы, только не помню куда, как и зачем))))
Риндера вне форума Ответить с цитированием
Старый 11.11.2010, 14:59   #17
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Риндера
Виталий всё правильно объяснил.
Индексы не надо указывать принудительно (по крайней мере во всех современных СУБД).
Пусть есть таблица Бугага. в ней есть числовое поле Длина. И пусть записей в этой базе миллион.
Так вот, делаем запрос
select * from Бугага where Длина = 100
Если индекса по Длина нет, то ядро СУБД будет перебирать ВСЕ записи (весь миллион) по одной и проверять, равно поле Длина 100 или нет. ну и отбирать нужные записи.
А при наличии этих самых индексов,если есть индекс по полю Длина
перебор будет идти только по индексу. Т.е. грубо говоря. программа сразу "узнает", если ли записи с величиной 100. если есть - то сразу получит ключ этой записи (т.е. сразу получит эту запись) и дальше будет получать все записи с Длиной равной 100 - не обращаясь к основной таблице с данными, только беря данные из индекса, где все номера записей есть и уже отсортированы по этому полю. Это,конечно, очень упрощённое, схематичное и условное объяснение. (на самом деле это всё намного сложнее, да и в разных СУБД по разному. В сущности этим (в том числе) и занимаются команды разработчиков СУБД - использовать эффективные средства отбора данных. Но позаботится об индексах должен именно разработчик структуры БД - ибо ему решать, по какому полю ему надо быстро и эффективно получать данные, а какие - информационные и в запросах участвовать не будут (ну, или если будут, то скорость запроса не так важна).
Это "азбука" разработки БД...

Цитата:
а из программы этот запрос вызывать?
Вы меня пугаете...
А как Вы раньше его вызывали?!
нужно через компонент (например, ADOQuery) получить набор данных запросом
например,
Код:
select top 1 * from words where WordLength => 8 order by rnd(ID)

кстати, что такое Индекс можете почитать
тут - Википедия: Индекс (базы данных)
и
ещё одна статья на Википедия

Последний раз редактировалось Serge_Bliznykov; 11.11.2010 в 15:07.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.11.2010, 15:10   #18
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Риндера
Тогда тебе сюда:http://www.programmersforum.ru/showthread.php?t=1589
Ну и стартуя отсюда изучать Базы Данных до перепосинения.
Можно так же почитать Тома Кайта, он хоть и пишет про Оракл но оч. серьезно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.11.2010, 15:37   #19
Риндера
Delphi, учу С
Форумчанин
 
Аватар для Риндера
 
Регистрация: 20.10.2010
Сообщений: 178
По умолчанию

Спасиба... Х_Х
Цитата:
А как Вы раньше его вызывали?!
Последний раз я юзала запросы 2 года назад. А сейчас у меня безо всяких запросов работает)))

Последний раз редактировалось Риндера; 11.11.2010 в 15:39.
Риндера вне форума Ответить с цитированием
Старый 11.11.2010, 15:59   #20
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

Цитата:
1) Выкидывается случайное число от 1 до 2000
2) Находится данная запись в БД
3) Проверяется длина слова
4) Если длина не удовлетворяет установленной сложности, то повторяется с п.1.
такой алгоритм не то что задержку 0.4 с...
если повезет, он вообще может никогда не закончиться =)

создай несколько таблиц по уровню сложности.
делается элементарно, в любом компиляторе...
пишешь прогу, пять минут и 200000 слов рассортированы по длинне.
xrob вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
оптимизация алгоритма выделения слов furstenberg Общие вопросы Delphi 12 02.02.2010 07:44
Разработка алгоритма сортировки методом простых вставок Delphi Hetsil Помощь студентам 0 12.12.2009 21:51
доработка алгоритма... Sota Помощь студентам 2 13.06.2008 15:45
Изменения алгоритма delphi_beginner Общие вопросы Delphi 2 13.05.2007 21:27