Название: 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! |