Russian Qt Forum
Ноябрь 26, 2024, 14:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: 3-х звенная архитектура  (Прочитано 7182 раз)
RedDog
Гость
« : Июль 05, 2011, 16:29 »

Подскажите, как лучше сделать:
Имеем СУБД, сервер, клиент.
Необходимо связать сервер и клиент, что бы на клиенте отображались табличные данные.
Пути решения которые приходят в голову:
1. Запрашивать с клиента и отправлять (к примеру через XML формат) все даные, т.е. всю выборку будет клиент на себя тягать
- тут конечно с трафиком проблемы будут
2. Запрашивать только отображаемые данные и делать кеш на 1-2 станицы для ускорения пролистывания страницы (через тот же XML данные передавать)
- тут встает вопрос о написании своей MVC с учетом логики хеширования записей (пока хз как это делается правильно)
3. Делать промежуточную БД на клиенте и синхронизировать с серверной допустим по ID и по времени модификации
- тут с GUI вроде как все понятно, и можно обойтись стандартным набором объектов
4. Сделать через сериализацию объектов (QSqlQueryModel  и подобных)
сериализацию по этой статье делать: http://habrahabr.ru/blogs/qt_software/83374/
- тут как и в 1-м пункте могут быть проблемы с трафиком.
Как быть?
Записан
brankovic
Гость
« Ответ #1 : Июль 05, 2011, 16:32 »

2. Запрашивать только отображаемые данные и делать кеш на 1-2 станицы для ускорения пролистывания страницы (через тот же XML данные передавать)

а что, уже есть проблемы со скоростью пролистывания, проверено?
Записан
RedDog
Гость
« Ответ #2 : Июль 05, 2011, 22:09 »

Предполагаю что могут быть, особенно при медленном интернет-канале
Записан
ритт
Гость
« Ответ #3 : Июль 06, 2011, 09:36 »

тут проблемы с траффиком предполагаются исключительно только из-за идиотского, простите, желания пихать всё и вся в хмл. возьмите хотя бы даже QDataStream "из коробки" - и он будет гораздо эффективнее, а функционально даже лучше (датастрим умеет работать с потоком и не хранит всё подряд в строках - можно запросто обернуть в аналог SqlRecord).
п.4 ссылку открывать лень
п.3 сразу отпадает, т.к. эффективную синхронизаю двух бд сторонними методами Вы не сделаете
п.2 если планируется масштабируемость, локальный кэш однозначно нужен; как реализовать - выбор за Вами
п.1 для "хэлло датабэйз" - сойдёт, для продакшена - станете заикой...
Записан
RedDog
Гость
« Ответ #4 : Июль 06, 2011, 09:58 »

тут проблемы с траффиком предполагаются исключительно только из-за идиотского, простите, желания пихать всё и вся в хмл. возьмите хотя бы даже QDataStream "из коробки" - и он будет гораздо эффективнее, а функционально даже лучше (датастрим умеет работать с потоком и не хранит всё подряд в строках - можно запросто обернуть в аналог SqlRecord).
Проблемы с трафиком решаются (относительно) через сжатие, к примеру gzip-ом, отправляемого XML потока, но опять таки при больших объемах информации пока из таблицы сделаешь XML, пока сожмешь, пока отправишь, там распакуешь, распарсишь, вобщем времени уйдет много, работать медленно будет. С другой стороны XML довольно универсальный формат и позволит в дальнейшем без особого допила расширять возможности системы в разные стороны.
п.2 если планируется масштабируемость, локальный кэш однозначно нужен; как реализовать - выбор за Вами
В этом весь и вопрос, что как бэ выбрать то не из чего пока. Т.е. я не представляю себе, допустим как обработать скрол пользователем таблицы... допустим на одну строку туда-сюда еще могу прикинуть алгоритм, а если он долго скролит и не по одной стоке а по нескольку сразу, или если PgDown нажмет или если сразу в конец захочет переместиться...
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Июль 06, 2011, 10:18 »

Читай про void QAbstractItemModel::fetchMore ( const QModelIndex & parent ) [virtual]
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
RedDog
Гость
« Ответ #6 : Июль 06, 2011, 10:27 »

Читай про void QAbstractItemModel::fetchMore ( const QModelIndex & parent ) [virtual]
Допустим у меня отображаются 20 записей из 100 (на сервере), т.е. при показе таблицы пользователю я послал на сервер (не СУБД) запрос на выдачу первых 20.
Пользователь проскроллил 15 записей.
какой параметр у fetchMore мне расскажет, что я должен буду запросить с сервера еще 15 записей?
не запрашивать же 15 раз по одной....
Записан
asvil
Гость
« Ответ #7 : Июль 06, 2011, 10:32 »

fetchMore предоставляет вам свободу выбора параметра количества строк
fetchMore вызывается в случае отрисовки последней записи
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #8 : Июль 06, 2011, 10:32 »

http://doc.qt.nokia.com/4.7-snapshot/itemviews-fetchmore.html
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
RedDog
Гость
« Ответ #9 : Июль 06, 2011, 10:56 »

на первый взгляд работает, если внимательно присмотреться, кривовато отрабатывает перемещение в конец или пролистывание страницы через PgDown.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #10 : Июль 06, 2011, 11:03 »

Тут можно поступить проще.
1. Грузишь первые n записей.
2. Грузишь общее количество записей (которое возвращаешь на rowCount ()).
3. Если в data будет запрос записи, которой у тебя нет, загружаешь n записей рядом с нужной.
4. PROFIT!
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.074 секунд. Запросов: 23.