Russian Qt Forum

Qt => Общие вопросы => Тема начата: RedDog от Июль 05, 2011, 16:29



Название: 3-х звенная архитектура
Отправлено: 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-м пункте могут быть проблемы с трафиком.
Как быть?


Название: Re: 3-х звенная архитектура
Отправлено: brankovic от Июль 05, 2011, 16:32
2. Запрашивать только отображаемые данные и делать кеш на 1-2 станицы для ускорения пролистывания страницы (через тот же XML данные передавать)

а что, уже есть проблемы со скоростью пролистывания, проверено?


Название: Re: 3-х звенная архитектура
Отправлено: RedDog от Июль 05, 2011, 22:09
Предполагаю что могут быть, особенно при медленном интернет-канале


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


Название: Re: 3-х звенная архитектура
Отправлено: RedDog от Июль 06, 2011, 09:58
тут проблемы с траффиком предполагаются исключительно только из-за идиотского, простите, желания пихать всё и вся в хмл. возьмите хотя бы даже QDataStream "из коробки" - и он будет гораздо эффективнее, а функционально даже лучше (датастрим умеет работать с потоком и не хранит всё подряд в строках - можно запросто обернуть в аналог SqlRecord).
Проблемы с трафиком решаются (относительно) через сжатие, к примеру gzip-ом, отправляемого XML потока, но опять таки при больших объемах информации пока из таблицы сделаешь XML, пока сожмешь, пока отправишь, там распакуешь, распарсишь, вобщем времени уйдет много, работать медленно будет. С другой стороны XML довольно универсальный формат и позволит в дальнейшем без особого допила расширять возможности системы в разные стороны.
п.2 если планируется масштабируемость, локальный кэш однозначно нужен; как реализовать - выбор за Вами
В этом весь и вопрос, что как бэ выбрать то не из чего пока. Т.е. я не представляю себе, допустим как обработать скрол пользователем таблицы... допустим на одну строку туда-сюда еще могу прикинуть алгоритм, а если он долго скролит и не по одной стоке а по нескольку сразу, или если PgDown нажмет или если сразу в конец захочет переместиться...


Название: Re: 3-х звенная архитектура
Отправлено: Пантер от Июль 06, 2011, 10:18
Читай про void QAbstractItemModel::fetchMore ( const QModelIndex & parent ) [virtual]


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


Название: Re: 3-х звенная архитектура
Отправлено: asvil от Июль 06, 2011, 10:32
fetchMore предоставляет вам свободу выбора параметра количества строк
fetchMore вызывается в случае отрисовки последней записи


Название: Re: 3-х звенная архитектура
Отправлено: Пантер от Июль 06, 2011, 10:32
http://doc.qt.nokia.com/4.7-snapshot/itemviews-fetchmore.html


Название: Re: 3-х звенная архитектура
Отправлено: RedDog от Июль 06, 2011, 10:56
http://doc.qt.nokia.com/4.7-snapshot/itemviews-fetchmore.html
на первый взгляд работает, если внимательно присмотреться, кривовато отрабатывает перемещение в конец или пролистывание страницы через PgDown.


Название: Re: 3-х звенная архитектура
Отправлено: Пантер от Июль 06, 2011, 11:03
Тут можно поступить проще.
1. Грузишь первые n записей.
2. Грузишь общее количество записей (которое возвращаешь на rowCount ()).
3. Если в data будет запрос записи, которой у тебя нет, загружаешь n записей рядом с нужной.
4. PROFIT!