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

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

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2010, 15:24   #1
AK BULLETS
Пользователь
 
Регистрация: 18.03.2010
Сообщений: 88
Восклицание "Культура" работы с БД

Добрый день!
Хотелось бы затронуть тему "правильности", "культурности" работы с данными базы данных.

Я делаю следующим образом.
Таблицу базы данных отображает на форме грид. Ниже на форме блок полей (всякие editы) для редактирования. При переходе по строкам грида - обновляю нижние поля.
Редактирую данные таблицы через editы, при сохранении обновляю грид (adoquery). При добавлении новой записи, тоже самое, пишу insert в таблицу, потом обновляю грид.
Но! При больших объемах информации эта схема тормозит.

Подскажите, как нужно культурно строить архитектуру работы формы с таблицой базы данных.
Научите.
Спасибо!
AK BULLETS вне форума Ответить с цитированием
Старый 13.04.2010, 15:31   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Ты сейчас говоришь об интерфейсе, он не имеет отношения к работе в СУБД.
А для ускорения нужно привести БД в третью нормальную форму, проиндексировать важные поля, по которым будут вестись основные операции поиска и отбора - это как минимум, тогда и тормоза исчезнут.
Да и DB компонентами не рекомендую пользоваться - они тугие.
Если получаешь какой либо набор - открыл сессию-получил-закрой сессию (подключение в смысле)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.04.2010, 15:33   #3
AK BULLETS
Пользователь
 
Регистрация: 18.03.2010
Сообщений: 88
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ты сейчас говоришь об интерфейсе, он не имеет отношения к работе в СУБД.
А для ускорения нужно привести БД в третью нормальную форму, проиндексировать важные поля, по которым будут вестись основные операции поиска и отбора - это как минимум, тогда и тормоза исчезнут.
Да и DB компонентами не рекомендую пользоваться - они тугие.
Если получаешь какой либо набор - открыл сессию-получил-закрой сессию (подключение в смысле)
а куда получать?
В смысле, я открываю adoquery, при закрытии, ничего не будет ж отображаться. Или нужно всё грузить в adotable?
AK BULLETS вне форума Ответить с цитированием
Старый 13.04.2010, 15:47   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

База данных - хранилище информации + по желанию/возможности бизнес логика (чтобы невозможно было хранить здания с незаполненным адресом, студентов без ФИО, деканов без факультетов,...). Она проектируется исходя из удобства хранения этой самой информации. Не нужно тут оглядываться на то, что будет перед глазами пользователя.
Интерфейс стоит отдельно от БД. Проектируется исходя из удобства пользователя. Если ему удобнее редактировать в гриде, то делаем грид, если формочку нужно показывать, то показываем формочку. При всём этом нельзя тут оглядываться на структуру БД. Показывать нужно ту информацию, что нужна, а не ту, которую легче. Нужна пользователю средняя оценка студента - показываем, а не отмазываемся, что тут потребуется сложный медленный запрос и вообще это сложно реализовать.
Схема в принципе обычная и в общем случае она используется практически везде. Тормозит на больших объемах я так понимаю из-за кучи записей, подгружаемых из БД в грид. Тут косяк интерфейса пользователя. Зачем показывать миллион записей, если пользователь их физически не в состоянии просмотреть и обработать. Если всё же хочется грид такой оставить, то нужно копать в сторону постраничной загрузки и подобных фич. В делфях по идее должны быть готовые гриды с этими возможностями.
Если тормозит на стороне БД, то тут либо СУБД менять, либо индексы перестраивать, либо перепроектировать БД.

ЗЫ. Если есть время и желание, то почитайте книгу Мартина Фаулера "Архитектура корпоративных программных приложений" (мог чуток наврать с названием). Сразу говорю: не прояснится как нужно делать, но зато узнаете кучу терминологии, по которой уже можно будет копать дальше в поисковиках. После этой книжки обычно вообще вопросов возникает еще больше, чем было до этого. Точнее не так. Вроде кажется всё элементарно, а как сунешься ручками реализовывать, встреваешь, т.к. детали все автором опущены и описаны решения расплывчато как-то.

Последний раз редактировалось pu4koff; 13.04.2010 в 15:52.
pu4koff вне форума Ответить с цитированием
Старый 13.04.2010, 15:48   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Я лично сделал так:
Имею класс, в котором описаны поля, а так же имею список (а-ля массив) обьектов этого класса.
Далее:
1) Открыл набор
2) Создал экземпляр класса, вписал в него поля из БД
3) В цикле перешел на следующую запись и повторил 2) пока не конец таблицы
4) Закрыл набор, разорвал связь с базой

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

Вот так это может выглядеть:
Это класс с полями
Код:
 TAsm=class(TComponent)
 Private
  FFields:TStringList; 
 public
  constructor Create(AOwner: TComponent);
  destructor Destroy; override;
 end;
Это его наполнение
Код:
var ado:TADOQuery;i:integer;a:TAsm;
begin                    Result:=nil;
 ado:=TADOQuery.Create(nil);
 ado.ConnectionString:=ConnectString;
 ado.SQL.Text:='select * from GetModels()';
 ado.Open;
 while not ado.Eof do begin
  a:=TAsm.Create(self);
  for i:=0 to ado.FieldCount-1 do
   a.FFields.Add(ado.Fields[i].DisplayName+'='+Trim(ado.Fields[i].AsString));
  FAsms.Add(a);
  ado.Next;
 end;
 ado.Close;ado.Free;
end;
Теперь в "массиве" FAsm у меня записи из базы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.04.2010, 17:07   #6
AK BULLETS
Пользователь
 
Регистрация: 18.03.2010
Сообщений: 88
По умолчанию

1) Открыл набор
2) Создал экземпляр класса, вписал в него поля из БД
3) В цикле перешел на следующую запись и повторил 2) пока не конец таблицы
4) Закрыл набор, разорвал связь с базой

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

Теперь в "массиве" FAsm у меня записи из базы.[/QUOTE]

а когда добавляю запись? То как? Добавить в таблицу а потом обновить массив? И как массив в гриде отобразить?
AK BULLETS вне форума Ответить с цитированием
Старый 13.04.2010, 17:44   #7
Rapid
Форумчанин
 
Аватар для Rapid
 
Регистрация: 01.09.2007
Сообщений: 747
По умолчанию

Цитата:
Добрый день!
Хотелось бы затронуть тему "правильности", "культурности" работы с данными базы данных.
Есть хороший самоучитель. Называется "Иллюстрированный самоучитель по практике программирования"
Никому не верьте.
Rapid вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа для работы с базой данных "Записная книжка" ArtS Помощь студентам 6 27.07.2010 19:12
"ОКРВВЕРХ", "ОКР", "ЕСЛИ". Как бы их связать. Каравай Microsoft Office Excel 13 17.02.2010 09:53
Подскажите что написать в пункте "Описание работы программы" курсовой работы Marsel737 Свободное общение 3 14.01.2010 12:44
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04