Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/26: Рейтинг темы: голосов - 26, средняя оценка - 4.62
1 / 1 / 0
Регистрация: 29.06.2015
Сообщений: 134
RAD XE3+

Где лучше хранить большую текстовую базу?

09.09.2023, 10:35. Показов 6410. Ответов 86

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Столкнулся с проблемой.
У меня есть база в Memo1 -занимает 100 000 строк.

Ищет в случае обращения поиском по данному мемо если всё хранить в нёпочемуто долго, а если рядом созраняю с прогой текстовый файл и ищу по нему то тоже долго, есть ли какойто быстрый вариант для работы с бальшими базами данных именно в Delphi?

Спасибо за ответ(ы).

С уважением, Денис.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.09.2023, 10:35
Ответы с готовыми решениями:

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

Где лучше хранить 100-500 записей
Доброго времени суток! Столкнулся с таким вопросом: в программе храню настройки в ini - файле. Теперь необходимо сделать возможность...

Где лучше всего хранить базу данных больших размеров ?
Всем привет! Подскажите пожалуйста где лучше всего хранить базу данных больших размеров порядка 50 - 70 GB. ? С помощью MySQL или MS SQL...

86
 Аватар для Beltar
1076 / 515 / 42
Регистрация: 05.05.2022
Сообщений: 3,671
24.09.2023, 21:10
Студворк — интернет-сервис помощи студентам
Ну зажата кем-то твоя база, может ее редактором.

Ты сделал вращающийся кубик с текстурой, осталось доделать остальной 3D-шутер.

С полями запроса можно работать по-разному. Можно обращаться к ним по имени, по индексу,

Delphi
1
CityName:=QFDQuery.FieldByName('Название').AsString;
А можно в визуальном дизайнере создать их список, тогда загружаемые будут ему соответствовать, в этом случае для каждого поля автоматически создается свой экземпляр класс, TStringField, TIntegerField и т. д. имена им даются автоматически по имени запроса и имени поля, т. к. Delphi давно поддерживает юникод, то русские буквы в именах допустимы.

Delphi
1
CityName:=QCitiesНазвание.AsString;
Печатать искомое не всегда удобно, часто нужно выбирать из списка.
0
1 / 1 / 0
Регистрация: 29.06.2015
Сообщений: 134
24.09.2023, 23:52  [ТС]
А можно в визуальном дизайнере создать их список
Какой командой переносится моя База в BDGrid?

Добавлено через 44 минуты
Друзья, всем благослвенного вечера!

для окончательного сравнения скорости обращения циклом к БД с имеющимся работающим методом взаимодействия с мемо, осталось совсем немножко. Уже просто очень интересно, будет ли действительно быстрее работать программа или останется также по времени.
Благодаря Вам я многое узнал, за что Вам спасибо.

В этом сообщении я прикрепил мой образец/исходник, если не затруднит Вас, Ребята посмотрите ктонибудь, что нужно подправить чтобы всё заработало?


Т.е. по сути осталось чтобы база показывалась в DBGrid и произвести по ней поиск нужной строки...

С уважением, Денис.
0
 Аватар для Beltar
1076 / 515 / 42
Регистрация: 05.05.2022
Сообщений: 3,671
25.09.2023, 00:19
Грид показывает данные, если его датасет активен. Поиск делается методом Locate у грида. Обычно, нужно не грузить все, а выбрать нужные данные SQL-запросом. Отображать пользователю таблицу со 100к значений бессмысленно. Либо делать фильтрацию на датасете, для чего надо прописывать свойство Filter, беря имена полей в [], почему не знаю, но у меня только так работало, и переключать Filtered.
0
 Аватар для Пытливый
3765 / 2272 / 706
Регистрация: 29.05.2013
Сообщений: 9,622
25.09.2023, 01:24
Лучший ответ Сообщение было отмечено Ltybcrf как решение

Решение

Ну вот вам проектик, возможно вас он устроит. Пробуйте, изучайте.
Вложения
Тип файла: rar 00.rar (128.3 Кб, 7 просмотров)
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
25.09.2023, 12:03
Цитата Сообщение от Beltar Посмотреть сообщение
беря имена полей в []
это у Access такой синтаксис
0
 Аватар для Пытливый
3765 / 2272 / 706
Регистрация: 29.05.2013
Сообщений: 9,622
25.09.2023, 13:36
Цитата Сообщение от krapotkin Посмотреть сообщение
это у Access такой синтаксис
Необходимость обрамлять имя поля квадратными скобками возникает при использовании зарезервированных слов в качестве имени поля или содержащих пробелы, спецсимволы. Я еще не встречал диалекта SQL, где бы не использовались квадратные скобки для подобных случаев.
0
 Аватар для Beltar
1076 / 515 / 42
Регистрация: 05.05.2022
Сообщений: 3,671
25.09.2023, 14:19
Цитата Сообщение от krapotkin Посмотреть сообщение
это у Access такой синтаксис
Причем тут Access, когда это FDQuery.Filter?

Выглядело так:

Delphi
1
2
Q.Filter:='[НомерЧертежа] Like ''%'+S+'%''';
Q.Filtered:=True;
Нашедшему зарезервированное слово или пробелы дам шоколадку.

У Access, конечно, свой дебильный диалект. И для меня загадка, почему он не подмножество MS SQL-Server.
0
 Аватар для Пытливый
3765 / 2272 / 706
Регистрация: 29.05.2013
Сообщений: 9,622
25.09.2023, 15:14
Цитата Сообщение от Beltar Посмотреть сообщение
Причем тут Access, когда это FDQuery.Filter?
FDQuery.Filter - это общий метод, который использует драйвер БД, а вот драйвер БД может и не поддерживать Like в фильтре, вот потому я стараюсь не использовать этот инструмент, намного надежнее формировать условие для SQL-запроса. Для SQLite использование в фильтре Like вообще проблематично т.к. некоторые его функции просто не работают с кириллицей, а существующее решение для запроса не хочет работает для фильтра.
0
 Аватар для Beltar
1076 / 515 / 42
Регистрация: 05.05.2022
Сообщений: 3,671
25.09.2023, 15:28
Я его до недавнего времени вообще не использовал, когда-то очень давно еще с ADO пробовал, но это оказалось так себе, а тут понадобилось делать быструю фильтрацию, чтобы она успевала без лага отработать в onChage Edit'а, лезть в этом случае с SQL-запросом на сервер, или даже в файл будет так себе идеей. В данном случае синхронизатор Access, как локальной БД, например, на планшете и центральной БД на MS SQL Server.
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
25.09.2023, 16:08
Цитата Сообщение от Пытливый Посмотреть сообщение
не встречал диалекта SQL
сходу Postgres и Firebird, насколько помню, Oracle тоже не знает ничего такого
вроде везде кроме MS для этого используются кавычки

а что там в фильтрах наворочено - вообще без понятия (
0
1 / 1 / 0
Регистрация: 29.06.2015
Сообщений: 134
25.09.2023, 22:33  [ТС]
Спасибо за образец и помощь!!!

Добавлено через 3 часа 54 минуты
При переносе появилась проблемка, правильно ли я понимаю что в стринговую переменную чтобы получить строку в которой есть слово Москва, надо написать SQL запрос?

Поиск в предложенном образце происходит по фильтру.
Однако неважны совпадения.


По сути дела надо чтобы, в появившейся визуально таблице городов, произошел:
1. поиск слова Москва
2. определился этот номер строки
3. Взять в переменную str := строку где будет и (слово Москва и её айди и координаты..) ...

Это возможно как это вобще выглядеть должно?
0
 Аватар для Beltar
1076 / 515 / 42
Регистрация: 05.05.2022
Сообщений: 3,671
25.09.2023, 23:07
Я показывал. Нужно обращаться к запросу по имени, или индексу поля.

Delphi
1
2
S:=FDQuery.FieldByName('ИмяПоля').AsString;
S:=FDQuery.Fields[1].AsString;
Или, если созданы компоненты полей в редакторе, то к ним.

Возвращается то значение на котором в датасете стоит курсор.
0
1 / 1 / 0
Регистрация: 29.06.2015
Сообщений: 134
26.09.2023, 06:06  [ТС]
Интересный парадокс:

В прорисованой в DBGrid базе, даже если и не прорисовывать а просто в памяти искать, предположим (хороший пример) город "Днепр", то может найтись Днепродзержинск, Днепровское, Днепровое и т.д.

В результате искал Днепр к примеру а в переменную добавилось нечто другое, неподходящее в будущем, негативно влияющее на автоматизацию процесса.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
procedure TForm1.btn26Click(Sender: TObject);
var
  ii, i, a: Integer;
  a1, a2, a3, a4, a5, a6, s: string;
begin
  s := FDQuery1.Fields[1].AsString;
  a := Pos(Edt5.Text, s);
 
  i := DBGrid1.DataSource.DataSet.RecordCount - 1;
  ii := 1;
 
  while a = 0 do
  begin
    Application.ProcessMessages;
    if ii = i then
      Break;
    s := FDQuery1.Fields[1].AsString;
    a := Pos(Edt5.Text, s);
    if a > 0 then
    begin
      a1 := FDQuery1.Fields[1].AsString;
      a2 := FDQuery1.Fields[2].AsString;
      a3 := FDQuery1.Fields[3].AsString;
      a4 := FDQuery1.Fields[4].AsString;
      a5 := FDQuery1.Fields[5].AsString;
      a6 := FDQuery1.Fields[6].AsString;
    end;
    FDQuery1.Next;
    ii := ii + 1;
  end;
end;
Приведенным выше примером я ищу по БД строку в которой находится нужный Город (в данном случае Днепр) но находится первым Днепродзержинск и т.д.
Посмотрите пожалуйста на код и скажите как его подправить, чтобы искался сразу нужный город?

Например как я делал это из Мемо1.
Code
1
75=Днепр~UA+17
у меня была вот такая конструкция и в поиске я искал не "Днепр", а "=Днепр~".

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

С уважением, Денис.
0
Модератор
 Аватар для D1973
9954 / 6490 / 2461
Регистрация: 21.01.2014
Сообщений: 27,492
Записей в блоге: 3
26.09.2023, 06:31
Цитата Сообщение от Ltybcrf Посмотреть сообщение
Как сделать тоже самое из нашей теперешней БД
Использовать не конструкцию LIKE, а точное сравнение
SQL
1
SELECT * FROM City WHERE Name="Днепр"
0
 Аватар для Beltar
1076 / 515 / 42
Регистрация: 05.05.2022
Сообщений: 3,671
26.09.2023, 08:28
Like именно так и работает, может искать вхождение слева, справа, в центре, надо просто правильно строку поиска прописать. Плюс учет\неучет регистра.

SQL - это сложно. Даже на базовом уровне.
0
 Аватар для Пытливый
3765 / 2272 / 706
Регистрация: 29.05.2013
Сообщений: 9,622
27.09.2023, 02:00
Цитата Сообщение от Ltybcrf Посмотреть сообщение
Как сделать тоже самое из нашей теперешней БД
Вы в мемо ищете по нескольким критериям, с помощью SQL это тоже можно легко сделать изменив запрос:
SQL
1
SELECT * FROM City WHERE LoCase(name) LIKE :name AND countrySign LIKE :countrySign
Ну а раз вам нужны геокоординаты, то я бы еще в условие добавил проверку на пустые значения:
SQL
1
SELECT * FROM City WHERE LoCase(name) LIKE :name AND countrySign LIKE :countrySign AND lat<>0 AND lon<>0
Вот вам подправленный проект с поиском по двум полям.

ПС: Для поиска по полному названию достаточно убрать символ '%' из кода, но так будет менее удобно:
Delphi
1
2
3
4
5
6
7
procedure TForm1.Edit1Change(Sender: TObject);
begin
  if not FDQuery1.Active then Exit;
  FDQuery1.ParamByName('name').Value := AnsiLowerCase(Edit1.Text)+'%';
  FDQuery1.ParamByName('countrySign').Value := AnsiLowerCase(Edit2.Text)+'%';
  FDQuery1.Refresh;
end;
Вложения
Тип файла: rar 00.rar (128.5 Кб, 6 просмотров)
1
1 / 1 / 0
Регистрация: 29.06.2015
Сообщений: 134
27.09.2023, 16:55  [ТС]
- Прогуливаясь, зашёл в библиотеку, и купил толстую книу в глянцевом переплёте, PHP и SQL!
На вечер вкусняха обеспечена! Что не говорите, а бумажный экземпляр да ещё и от издателя BHV это "сладкая конфета"!

- Господин Пытливый Всевыш-ий, видит Вашу искреннюю помощь, разумеется как и других ребят, она вернётся Вам может быть в другом виде, но обязательно Вы получите помощь откуда не будете ждать.
-----------------------------------

Благословенного дня!

Друзья!
Отчёт по скорости взаимодействия еще будет, но уже понятно что БД быстрее.

Добавляю я базу, провожу поиск строки и выбираю каждую из 6ти ячеек этой строки так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
  begin
    try
      OpenDialog1.FileName := 'C:\TIR\tir.db3';
      FDConnection1.Close;
      FDConnection1.Params.Database := OpenDialog1.FileName;
      FDConnection1.Open;
      FDQuery1.SQL.Clear;
      FDQuery1.SQL.Text := 'SELECT * FROM City WHERE Name="' + cbb6.Text + '"';
      FDQuery1.Open;
      FDQuery1.Refresh;
 
      S := FDQuery1.Fields[1].AsString;
      a := Pos(cbb6.Text, S);
      if a > 0 then
      begin
        Titem := TTargetClass.Create();
        Titem.Targetaddress := lbledt32.Text;                                            // АДРЕС (УТОЧНЯЕТСЯ)
        Titem.TargetcountrySign := FDQuery1.Fields[2].AsString;                // СТРАНА UA 1
        Titem.townName := FDQuery1.Fields[1].AsString;                           // ИМЯ ГОРОДА 1
        Titem.TargettownId := StrToInt(FDQuery1.Fields[0].AsString);         // ID ГОРОДА 1
        Titem.TargetareaId := StrToInt(FDQuery1.Fields[3].AsString);          // ID ОБЛАСТИ 1
 
        obj.waypointListSource[0] := Titem;
      end;
    finally
    end;
  end;
Есть несколько мелких вопросов:
1. Надо ли проводя аналогию с TStringList, в конце работы закрывать чтото, освобождать память? (Ts.free; - я образно написал)

2. Єту базу из образно 100 тысяч строк мы используем. Но у меня есть ещё несколько баз поменьше где 1000 строк и по 100-200 строк.
Вопрос: Для добавления скажем новой базы из 1000 строк так чтобы не мешать работе этой БД из 100т. строк, нужно добавлять новые компоненты FDConnection2 , FDQuery2, DataSource2, FDPhysSQLiteDriverLink2, FDSQLiteFunction2 и саму DBGrid2? Разумеется заранее создав в SQLLite базу *.bd3?

С уважением, Денис.
0
 Аватар для Beltar
1076 / 515 / 42
Регистрация: 05.05.2022
Сообщений: 3,671
27.09.2023, 18:36
Проще всего 1 коннекшен на 1 базу. Вопрос, не лучше ли данные слить в 1 базу, разные таблицы?

Close закроет, если нужно. Впрочем, у меня в DBProcs давно определены функции вида OpenFDQuery, которые закрывают запрос, чистят SQL и могут кидать эксепшен, а могут и не кидать, например, если открытие происходит периодически. Вообще вот так делать:

Delphi
1
2
3
4
     FDQuery1.SQL.Clear;
      FDQuery1.SQL.Text := 'SELECT * FROM City WHERE Name="' + cbb6.Text + '"';
      FDQuery1.Open;
      FDQuery1.Refresh;
Во-1, Refresh зачем? После Open данные полностью обновлены.
Во-2, так писать долго.
Во-3, а если Open не откроется, например, связь с сервером пропала, тогда что?
1
Модератор
 Аватар для D1973
9954 / 6490 / 2461
Регистрация: 21.01.2014
Сообщений: 27,492
Записей в блоге: 3
28.09.2023, 05:00
Цитата Сообщение от Ltybcrf Посмотреть сообщение
FDQuery1.SQL.Clear;
      FDQuery1.SQL.Text := 'SELECT * FROM City WHERE Name="' + cbb6.Text + '"';
маленькое замечание: вызов метода Clear в Вашем случае - просто лишняя строка кода, потому как дальше Вы работаете сразу со свойством Text, т.е. сразу со всеми строками свойства SQL одновременно и все, что хранилось в SQL, будет заменено на тот текст, который Вы зададите в свойстве Text

Цитата Сообщение от Ltybcrf Посмотреть сообщение
Для добавления скажем новой базы из 1000 строк
Добавляйте не новую базу, а новую таблицу в существующую базу.
0
 Аватар для Пытливый
3765 / 2272 / 706
Регистрация: 29.05.2013
Сообщений: 9,622
28.09.2023, 10:28
Цитата Сообщение от Ltybcrf Посмотреть сообщение
Єту базу из образно 100 тысяч строк мы используем. Но у меня есть ещё несколько баз поменьше где 1000 строк и по 100-200 строк.
Если данные этих нескольких баз имеют одинаковую структуру, то их можно слить в одну таблицу. Если есть необходимость как-то отделять эти пакеты данных друг от друга, то можно в таблицу добавить поле-признак. В качестве такого признака можно использовать порядковый номер импортируемого пакета данных.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.09.2023, 10:28

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

Как лучше хранить большую корзину (больше 140-170 товаров)?
Сейчас храню корзину в куках (id-товара и количество). Но при количестве товаров больше 140-170 они начинают пропадать из корзины (из-за...

Как лучше сделать большую базу данных?
Уважаемые знатоки, подскажите, пожалуйста, как лучше сделать большую базу данных. Уже несколько дней сижу и перечитываю все возможные...

Где хранить базу данных?
Нужно разработать программу которая работает по локальной сети. С ее помощью можно отправлять и получать сообщения. Я всё сделал, но на ...

Где лучше хранить информацию
Здравствуйте уважаемые форумчане. У меня есть числовой набор данных. При нажатии на submit какое то из этих чисел будет обновляться....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru