Компонент Sqlite3Dataset

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Компонент Sqlite3Dataset

Сообщение Ichthyander » 24.06.2009 15:28:30

По советам гуру этого форума решил отказаться от использования базы данных в формате DBF компонента и перейти на другой.
Сейчас перевожу код, работающий на компоненте TDBF в TSqlite3Dataset. Все, в общем, получилось, но возникли несколько вопросов, может кто-нибудь поможет в разъяснении их.
1) В компоненте TSqlite3Dataset процедура PackTable отсутствует. Но как производить упаковку таблиц? Неужели после каждого удаления записи происходит физическое удаление записи? :) Или эта процедура не реализована в компоненте и следует делать непосредственно запрос SQL?
2) А как создается индекс в Sqlite3DataSet? В TDBF пользовался методом AddIndex. Теперь следует пользоваться свойством IndexFieldNames? Это свойство нужно определять также после открытия базы данных? В эксклюзивном доступе? Правда в компоненте отсутствует логическое свойство Exclusive.
3) Касательно DBF-овских Exclusive и LockTable - они отсутствуют в TSqlite3Dataset, то есть это понимать как то, что в них нет надобности и, скажем, если один пользователь обратился к таблице для добавления записи, а другой решил создать индекс, то второй пользователь просто подождет (видимо "подзависнет") на время работы первого. Я так понимаю? :oops:
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 686
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Компонент Sqlite3Dataset

Сообщение Vadim » 24.06.2009 18:10:06

Ichthyander
Уже то, что в названии есть буквосочетание SQL есть в названии говорит о том, что все без исключения пользователи работают с логическими, а не физическими записями таблиц БД. Поэтому такие проблемы как "упаковка таблицы", "создание индекса", "блокировка таблицы", "режимы работы таблицы - эксклюзивный или неэксклюзивный", пользователя вообще волновать не должны. Всем этим занимается движок БД, которому дают какие-то команды, а он их по тихому исполняет. Отчасти создание или удаление индекса может волновать разработчика, но, опять же, исключительно на логическом уровне. Т.е. подав SQL-команду "CREATE INDEX название ON таблица (список полей которые входят в индекс)" разработчик может об этом тут же забыть. Позаботится о создании индекса движок, т.е. DLL-ка sqlite3.dll (или .so), это его задача непосредственно работать с файлом БД на физическом уровне правильным образом.
Если один пользователь добавляет запись, а другой решил создать индекс, то всё это сделается, только не одновременно, а по очереди. Все SQL команды ставятся в очередь и выполняются друг за другом, каждая в свою очередь. Это проходит безболезненно именно потому что пользователь отделён от работы с базой на физическом уровне. О физике подумали разработчики движка.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Компонент Sqlite3Dataset

Сообщение Ichthyander » 25.06.2009 17:39:32

Спасибо, Вадим! Действительно, для SQLite не нужны такие команды и о физике процесса работы движка можно не задумываться.
Но мне стало интересно, почему все-таки не требуется упаковка таблиц. Вот что интересное прочел на официальном сайте Sqlite: при удалении записи пустота, которая появляется в следствии этого в файле *.db заново заполняется при добавлении новых данных в таблицу! Правда, как и с обычной файловой системой, при частых удалениях, вставках и редактировании записей со временем происходит сильная зафрагментированность файла базы данных... И поэтому для дефрагментации файла базы данных Sqlite3 существует операция Vacuum
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 686
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 43

Рейтинг@Mail.ru