Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.25;
Скачать: [xml.tar.bz2];




Вниз

Алгоритм для редактирования данных 


Мефодий   (2002-02-25 12:20) [0]

Есть dbf таблица с документами (назовем ее MainTable). Уникальность документа определяется датой и номером. Документ может содержать от нескольких записей до нескольких тысяч. Нужно обеспечить пользователю возможность внесения изменений в любой документ. Под изменением имеется в виду возможность удаления записи, добавления новой или редактирование существующей записи. Причем решение о том, записыать в базу данных внесенные изменения или нет, пользователь дожен иметь возможность принимать в конце сеанса редактирования.
В любом случае, как я понимаю, нужно этот документ переписать во временный файл (назовем ее TempTable), дать возможность пользователю делать что хочет и затем переписать все в основную таблицу. Весь вопрос в том, как переписывать в основную таблицу измененный документ. Есть два варианта:
1. В MainTable стереть этот документ и затем целиком переписать его из TempTable. Вариант хорош простотой и быстротой исполнения. Но очень большой минус - таблица заполняется удаленными записями и увеличивается в размерах. Поэтому требуется частая упаковка.
2. В MainTable стирать, добавлять и изменять записи только "по факту".
Я выбрал 2-й вариант и реализвал его так:
- в MainTable ставлю фильтр по номеру и дате документа
- переписываю его в TempTable
- даю возможность пользователю вносить изменения и подтвердить их запись в базу данных
- ищу записи, удаленные в TempTable. Для этого каждую запись MainTable проверяю на наличие в TempTable. Если ее там нет, значит удаляю из MainTable
- по каждой записи TempTable сканирую все записи MainTable. Если записи в MainTable нет, значит ее туда добавляю, если изменена - обновляю.
Во втором варианте все хорошо с размером файла, но очень плохо с быстродействием. Ведь приходится выполнять 2*m*n проверок(m и n -число записей документа в MainTable и TempTable соответственно) . При тысяче записей на документ это время исчисляется минутами даже у моего Pentium III с его 933 MH, что неприемлемо как для пользователя, так и для моей совести.
Есть ли какие-нибудь предложения ? Может кто предложит другой алгоритм перезаписи.
Заранее благодарен.



Корвин   (2002-02-26 08:56) [1]

>>- по каждой записи TempTable сканирую все записи MainTable. Если записи в MainTable нет, значит ее туда добавляю, если изменена - обновляю.

Попробуй сделать индекс по дате и номеру в MainTable и всесто сканирования всех записей использовать Locate




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.25;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.72 MB
Время: 0.026 c
1-80617           Ruslan                2002-03-11 16:24  2002.03.25  
Модем


4-80716           FLASH !               2002-01-25 14:28  2002.03.25  
WINDOWS 9x РЕЕСТР !!!!


3-80396           Мефодий               2002-02-25 17:54  2002.03.25  
Проблема с использованием Locate


1-80523           SergeyVP              2002-03-12 05:28  2002.03.25  
Компонент и TApplication


3-80438           Demon ltd             2002-02-25 00:26  2002.03.25  
Выборка между двумя датами опять из базы