Вверх ↑
Этот топик читают: Гость
Ответов: 16884
Рейтинг: 1239
#1411: 2016-02-06 21:09:44 ЛС | профиль | цитата
flint2 писал(а):
База данных не поможет
Да... Жесть.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 2059
Рейтинг: 131
#1412: 2016-02-07 09:40:32 ЛС | профиль | цитата
tom-it,
Ну и разобраться с самим принципом баз данных, опыт уж точно пригодится, ну по крайней мере не повредит.

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

И здесь база поможет.
И всё-же ментальные карты http://soft.mydiv.net/win/download-FreeMind.html ,как мне кажется, больше подходят для этих целей.
Может быть в ином виде... сама идея...
В этом вопросе интерфейс играет сольную партию, когда не знаешь точно что ищешь, а только в общих чертах. Интерфейс в данном случае определяет решение.
(конечно спорное высказывание)
Думаю, что такие вещи надо делать, как плагин к Total Commander c замещением левой, или правой панели.
Tad,
Да... Жесть.

Если касается угла заточки, то неизвестно, где соломки подстелить, пока не упадёшь.
Что касается причёски, то:
По этой причине не выкладываю схемы.
Хотел выложить схему создания плагинов для Total Commander, а оно тянет создание Dll, и всё надо причёсывать.
Надо собраться духом и начать с небольших схем-утилит, где работа парикмахера не столь велика.
Когда выкладываешь на "продажу" оно обуславливает соответствующий вид. http://forum.hiasm.net/forum_serv.php?q=56&id=4200
карма: 6

0
Ответов: 655
Рейтинг: 18
#1413: 2016-02-08 13:45:41 ЛС | профиль | цитата
tom-it,

Почему перебор всех книг?

Таблица Книги

Допустим у нас 3 автора и 300 книг (по 100 на каждого)

Выбираем первого автора, соответственно сужаем круг поиска до 100 книг этого автора.

подтаблица1

Жанры автора допустим романы, фантастика. Выбирая жанр опять же сужаем круг поиска.

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

------------ Дoбавленo в 13.09:
select * from knigi where name like '%ро%';

1;ромео и джульетта
2;робинзон крузо

Я сейчас товарищу по сайту помогаю, там объявления и категории объявлений с подкатегориями...подкатегориями и т.д.) все работает шустро на базовых настройках БД.
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#1414: 2016-02-08 14:08:37 ЛС | профиль | цитата
Gunnman писал(а):
select * from knigi where name like '%ро%';
1;ромео и джульетта
2;робинзон крузо
Заодно расскажи как организовал LIKE с русскими буквами.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 655
Рейтинг: 18
#1415: 2016-02-08 15:31:06 ЛС | профиль | цитата
Включается поддержкой юникода, нужно собирать библиотеку с ICU, тогда все норм
------------ Дoбавленo в 14.50:
https://habrahabr.ru/post/57915/
------------ Дoбавленo в 14.51:
На выходных постараюсь пересобрать библиотеку, как соберу выложу
------------ Дoбавленo в 14.55:
С простор интернета без шифрования либа и исходники http://forum.hiasm.net/forum_serv.php?q=56&id=4201, с шифрованием и обновленную с ICU выложу позже
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#1416: 2016-02-08 17:38:53 ЛС | профиль | цитата
Gunnman писал(а):
нужно собирать библиотеку с ICU
а как же это
Gunnman писал(а):
все работает шустро на базовых настройках БД.

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 655
Рейтинг: 18
#1417: 2016-02-08 18:12:44 ЛС | профиль | цитата
Я имел ввиду без увеличения кеша и и т.д.) про ICU забыл)
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#1418: 2016-02-08 21:24:09 ЛС | профиль | цитата
Add(MainForm,2953706,21,105)
{
Width=707
Height=447
Point(onClose)
link(onCreate,13560031:doExecute,[(72,125)(72,104)])
link(onClose,2894498:doClose,[])
}
Add(SQLite_DB,2894498,133,119)
{
link(onOpen,10868581:doEvent1,[])
}
Add(InlineCode,507989,238,84)
{
@Hint=#13:Функция Upper|
WorkPoints=#11:addFunction|
DataPoints=#8:dbHandle|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|52:uses kol,Share,Debug,Windows,SQLite3Api,hiSQLite_DB;|0:|4:type|28: THiAsmClass = class(TDebug)|9: public|22: dbHandle:THI_Event;|52: procedure addFunction(var _Data:TData; idx:word);|5: end;|0:|14:implementation|0:|13:var s:string;|65:procedure myFunc(ctx:pointer; nArg:integer; args:ppvalue); cdecl;|5:begin|31: s:=sqlite3_value_text(args^);|33: CharUpperBuff(@s[1],Length(s));|48: sqlite3_result_text(ctx,PChar(s),Length(s),0);|4:end;|0:|34:procedure THiAsmClass.addFunction;|13:var dt:TData;|5:begin|37: dt := ReadData(_Data,dbHandle,nil);|41: if _IsObject(dt,SQLite_GUID) then begin|90: sqlite3_create_function(ToObject(dt),PChar('UPPER'),1,SQLITE_ANY,nil,@myFunc,nil,nil);|6: end;|4:end;|0:|4:end.|
AddHint(-45,-43,93,13,@Hint)
}
Add(ODialog,13560031,77,98)
{
link(onExecute,2894498:doOpen,[(117,104)(117,125)])
}
Add(Hub,10868581,182,119)
{
OutCount=4
link(onEvent1,507989:addFunction,[(217,125)(217,90)])
link(onEvent2,11586007:addFunction,[])
link(onEvent3,5104807:doQuery,[(236,139)(236,174)])
link(onEvent4,14178118:doQuery,[(228,146)(228,237)])
}
Add(SQLite_Query,5104807,259,168)
{
SQL="SELECT info FROM elements WHERE Lower(info) LIKE '%ком%';"
link(onQuery,1726822:doAdd,[])
}
Add(ListBox,1726822,315,168)
{
Left=15
Top=15
Width=290
Height=380
}
Add(InlineCode,11586007,280,126)
{
@Hint=#13:Функция Lower|
WorkPoints=#11:addFunction|
DataPoints=#8:dbHandle|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|52:uses kol,Share,Debug,Windows,SQLite3Api,hiSQLite_DB;|0:|4:type|28: THiAsmClass = class(TDebug)|9: public|22: dbHandle:THI_Event;|52: procedure addFunction(var _Data:TData; idx:word);|5: end;|0:|14:implementation|0:|13:var s:string;|65:procedure myFunc(ctx:pointer; nArg:integer; args:ppvalue); cdecl;|5:begin|31: s:=sqlite3_value_text(args^);|33: CharLowerBuff(@s[1],Length(s));|48: sqlite3_result_text(ctx,PChar(s),Length(s),0);|4:end;|0:|34:procedure THiAsmClass.addFunction;|13:var dt:TData;|5:begin|37: dt := ReadData(_Data,dbHandle,nil);|41: if _IsObject(dt,SQLite_GUID) then begin|90: sqlite3_create_function(ToObject(dt),PChar('LOWER'),1,SQLITE_ANY,nil,@myFunc,nil,nil);|6: end;|4:end;|0:|4:end.|
AddHint(9,-46,93,13,@Hint)
}
Add(SQLite_Query,14178118,259,231)
{
SQL="SELECT info FROM elements ORDER BY Upper(info);"
link(onQuery,4280539:doAdd,[])
}
Add(ListBox,4280539,315,231)
{
Left=325
Top=15
Width=350
Height=380
}


А я подключаю две своих функции и никаких проблем с русским языком.

( В примере используется файл Elements\Delphi\Elements.db)
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Гость
Ответов: 17029
Рейтинг: 0
#1419: 2016-02-09 11:31:45 правка | ЛС | профиль | цитата


Редактировалось 6 раз(а), последний 2022-04-03 03:37:48
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#1420: 2016-02-10 09:14:46 ЛС | профиль | цитата
tom-it писал(а):
получается перебор всех книг ?
Gunnman писал(а):
Почему перебор всех книг?
Как говорит мой правнук : "Потомучто".
Gunnman писал(а):
select * from knigi where name like '%ро%';
1;ромео и джульетта
2;робинзон крузо
при таком запросе ещё найдёт и
3;прошлогодние листья
4;тореро
и т.д. и т.п. А вот запрос
select * from knigi where name like 'ро%';
выбрал бы только то, что ты написал. Так что со знаком "%" поаккуратней.
select * from knigi where name like 'ро%'; - проверяются только ДВЕ первые буквы name
select * from knigi where name like '%ро'; - проверяются только ДВЕ последние буквы name
select * from knigi where name like '%ро%'; - проверяются ВСЕ буквы name
Gunnman писал(а):
Допустим у нас 3 автора и 300 книг (по 100 на каждого)
Выбираем первого автора, соответственно сужаем круг поиска до 100 книг этого автора.
а для этого перебирается вся таблица
Даже если бы ты написал
select * from knigi where name like 'ро%' and author=1;всё равно будет перебрана вся таблица книг БД
Так что тут tom-it прав.
Но при таком запросе отработает оптимизатор запросов, который сначала отберёт все записи, относящиеся к этому автору, во временную таблицу и только потом из этой временной таблицы отберёт записи, удовлетворяющие условию LIKE

------------ Дoбавленo в 08.39:
При 1000000 записей твой запрос будет выполнен за ~15-30 минут.
Это всё справедливо для случая без применения ИНДЕКСНЫХ файлов (таблиц)
Вся надежда только на то, что у tom-it в библиотеке будет книг намного меньше.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 2059
Рейтинг: 131
#1421: 2016-02-10 10:25:37 ЛС | профиль | цитата
Всё-же мне не понятно, как заполнить таблицу, если у меня 167Гбайт фантастики и детективов?
Где-то одна треть меж авторские серии, где в одном издании-книге представлено несколько авторов.
Естественно на диске упорядочены по авторам, сериям, издательствам и переводчикам, но это мало чего даёт.
Допустим, я заполнил таблицу, и что это даст? И сколько времени это займёт, хотя можно автоматизировать этот процесс.
В таблице обязательно должна быть колонка с аннотацией, иначе смысла нет в этой бадяге. Но далеко не на все книги можно найти аннотацию + в большинстве случаев аннотации пишутся в превосходной степени. Начинаешь читать, а оказывается, что не преувеличили, а попросту соврамши.
На Шекспира и Азимова аннотация не нужна, в смысле каждого произведения, ровно, как и таблица, а вот Ливадный наплодил...
Если нужно найти книгу по автору и названию никаких таблиц не надо - просто открываешь соответствующую папку на диске да и дело с концом.
Я никому не пытаюсь возразить - я хочу понять. У меня похожая задачка по поиску книги по содержанию, или о чём эта книга( - да ни о чём). Все известные мне каталогизаторы и библиотекари вопроса не решают. Они полезны, когда надо понять - есть у тебя такая книга, качать-ли?
карма: 6

0
Ответов: 16884
Рейтинг: 1239
#1422: 2016-02-10 16:33:54 ЛС | профиль | цитата
flint2 писал(а):
как заполнить таблицу, если у меня 167Гбайт фантастики и детективов?
Всё зависит от того, что тебе надо.
У меня, например, библиотека хранится на DVD-дисках и всё, что мне надо - узнать есть ли у меня нужная книга и где она (номер диска).
Потом вставить нужный диск в дисковод и нажать кнопку "ЧИТАТЬ". Файл книги с DVD копируется на хард в TEMP+его расширение и открывается в соответствующей программе.
flint2 писал(а):
задачка .... о чём эта книга
Тут нужен ИИ. А так как "На вкус и цвет товарищей нет", то совпадёт ли мнение ИИ с твоим - б-О-О-О-льшой вопрос.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 2059
Рейтинг: 131
#1423: 2016-02-10 16:49:43 ЛС | профиль | цитата
Tad,
Всё зависит от того, что тебе надо.

В том то и дело.
Просто названия и авторов хранить в базе...

DVD-дисках и всё, что мне надо - узнать есть ли у меня нужная книга и где она (номер диска).

Это да. У меня тоже, только аудиокниги на CD и тоже по номерам.
Мнение ИИ беспристрастно и куда более объективно, чем аннотации автора, или издателя.
[offtop]Последнее время не слушаю аудиокниги по причине дурного голоса ЛИ декламаторов и медленного чтения. Но главным образом не тот контент, что хотелось-бы.
По меньшей мере можно прочитать 2-3 книги пока прочтут 1 аудио.
По этому и забыл про базу CD. У кого чего болит, тот за то и держится. Я за ИИ. [/offtop]
карма: 6

0
Ответов: 655
Рейтинг: 18
#1424: 2016-02-11 15:35:28 ЛС | профиль | цитата
Вот пример, БД с создается БД с 1 000 000 записей вида 'аытвйновыфлвйшвй' с использованием уникальных индексов, при запросе select count(*) from data where mydata like '%ф%а%ы%п' занимает в районе секунды-двух (на глаз)

http://forum.hiasm.net/forum_serv.php?q=56&id=4209


Схема:
Add(MainForm,2953706,21,105)
{
Width=645
Height=458
link(onCreate,3330765:doOpenF,[])
}
Add(SQLite_Query,9645187,217,224)
{
link(onQuery,3898437:doStr,[])
link(dbHandle,7689960:Var2,[])
}
Add(SQLite_DB,3330765,217,119)
{
FileName="test.db"
}
Add(Memo,281889,77,154)
{
Left=10
Top=5
Width=345
Height=50
Strings=#24:PRAGMA encoding="UTF-8";|70:create table data (id integer primary key autoincrement, mydata text);|43:create unique index d1 on data (id,mydata);|
}
Add(DoData,13177178,77,224)
{
link(onEventData,10843461:doExec,[])
link(Data,281889:Text,[])
}
Add(Button,4197836,21,224)
{
Left=10
Top=55
Width=80
Caption="create_table"
link(onClick,13177178:doData,[])
}
Add(StrList,9834666,441,301)
{
Strings=#1:й|1:ц|1:у|1:к|1:е|1:р|1:н|1:г|1:ш|1:щ|1:з|1:х|1:ъ|1:ф|1:ы|1:в|1:а|1:п|1:р|1:о|1:л|1:д|1:ж|1:э|1:я|1:ч|1:с|1:м|1:и|1:т|1:ь|1:б|1:ю|
Point(doGetString)
Point(onGetString)
link(onGetString,3328643:doAdd,[])
}
Add(Random,1578549,392,343)
{
Max=32
link(onRandom,9834666:doGetString,[])
}
Add(For,14472687,315,343)
{
End=10
link(onEvent,1578549:doRandom,[])
link(onStop,625045:doData,[(379,356)(379,384)])
}
Add(For,15043235,252,343)
{
End=1000000
link(onEvent,14472687:doFor,[])
link(onStop,9212208:doString,[(305,356)(305,426)])
}
Add(StrList,3328643,511,308)
{
}
Add(Replace,2537379,511,378)
{
SubStr="\r\n"
link(onReplace,14405146:doDelete,[])
link(Str,3328643:Text,[])
}
Add(Delete,14405146,560,378)
{
Count=1
Direction=1
link(onDelete,10316750:doEvent1,[])
}
Add(DoData,625045,462,378)
{
link(onEventData,2537379:doReplace,[])
}
Add(Button,13927473,174,343)
{
Left=10
Top=90
Width=80
Caption="create_data"
link(onClick,15043235:doFor,[])
}
Add(FormatStr,647888,651,378)
{
DataCount=1
Mask="insert into data values (NULL,'%1');"
link(onFString,253376:doCharset,[])
}
Add(Hub,10316750,609,378)
{
link(onEvent1,647888:doString,[])
link(onEvent2,3328643:doClear,[(635,391)(635,362)(498,362)(498,321)])
}
Add(MT_String,3898437,273,224)
{
link(onResult,10038553:doCharset,[])
}
Add(Memo,15620192,385,210)
{
Left=15
Top=130
Width=595
Height=105
Enabled=1
ScrollBars=2
}
Add(Memo,15104376,501,158)
{
Left=15
Top=260
Width=595
Height=105
Strings=#56:select count(*) from data where mydata like '%ф%ц%ы%х%';|
ScrollBars=2
}
Add(DoData,6067671,501,220)
{
link(onEventData,6109644:doCharset,[])
link(Data,15104376:Text,[])
}
Add(Button,2885158,445,220)
{
Left=15
Top=380
Width=80
Caption="query"
link(onClick,6067671:doData,[])
}
Add(SQLite_Exec,10843461,119,224)
{
link(dbHandle,7689960:Var1,[(125,173)])
}
Add(GetDataEx,7689960,217,168)
{
link(Data,3330765:dbHandle,[])
}
Add(Charset,6109644,566,220)
{
Type=6
link(onCharset,37820:doWork1,[(697,226)])
}
Add(Charset,253376,710,378)
{
Type=6
link(onCharset,2188896:doAdd,[(763,384)(763,349)])
}
Add(Charset,10038553,330,224)
{
Type=7
link(onCharset,15620192:doAdd,[(370,230)(370,216)])
}
Add(HubEx,37820,693,271)
{
Angle=2
link(onEvent,15689310:doEvent1,[(172,277)(172,223)])
}
Add(Hub,15689310,189,217)
{
link(onEvent1,15620192:doClear,[])
link(onEvent2,9645187:doQuery,[])
}
Add(StrList,2188896,784,343)
{
}
Add(FormatStr,9212208,784,420)
{
DataCount=1
Mask="BEGIN;\r\n%1\r\nEND;"
link(onFString,9574265:doEvent1,[])
link(Str1,2188896:Text,[])
}
Add(Hub,9574265,833,420)
{
OutCount=3
link(onEvent1,37820:doWork2,[(859,426)(859,277)])
link(onEvent2,2188896:doClear,[(853,433)(853,398)(772,398)(772,356)])
link(onEvent3,3686493:doMessage,[])
}
Add(Message,3686493,875,434)
{
Message="OK"
Caption="OK"
}
карма: 0

0
Ответов: 2059
Рейтинг: 131
#1425: 2016-02-11 17:03:53 ЛС | профиль | цитата
Gunnman, не мудрено, с индексами должно вообще всё мгновенно работать.
Только чтобы создать индексы, все (хотелки - поиск файла, поиск текста, или ещё что либо) должны повторится 1 000 000 раз.
1 000 000 не большое число.
Если индекс (всё что с ним связано) делается вручную, раз в неделю, то вопросов нет.
Когда построены индексы - о времени не говорят.
[flood]Хорошо быть девушкой в розовом пальто,
Можно и не в розовом, - но уже не то.
Хорошо быть дамаю в норковом манто,
можно и не в норковом, - но уже не то.
...
[/flood]
карма: 6

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)