Оптимизация клиент-серверного приложения с использованием локальной БД?

У меня есть клиент-серверное приложение, написанное на С# с использованием WPF. База данных на сервере становится довольно большой, и приложение должно загружать большую часть своих данных (давайте не будем обсуждать эту ее часть... просто поверьте мне и примите ее такой, какая она есть). Вместо этого я мог бы извлекать данные по мере необходимости по запросу, однако это создает проблемы с производительностью из-за постоянных запросов туда и обратно с удаленной базой данных.

Однако было бы здорово, если бы при запуске приложения я мог передать данные, которые мне нужны, клиенту и сохранить их в локально работающей базе данных. Затем приложение запрашивает локальную базу данных, а не базу данных удаленного сервера. Таким образом, приложение занимает мало памяти, но по-прежнему имеет быстрый доступ к данным, поскольку оно является локальным.

Можно ли таким образом использовать SQL Server Express или LocalDB? то есть разрешить им работать на клиентских машинах и синхронизировать с базой данных сервера при запуске приложения? Если да, будет ли это рекомендуемым или нерекомендуемым их использование?

Спасибо


person Nullqwerty    schedule 14.09.2012    source источник


Ответы (3)


Ознакомьтесь с MS Sync Framework, если вы еще этого не сделали: http://msdn.microsoft.com/en-us/sync/bb736753.aspx Это крутая кривая обучения, но она предназначена для таких сценариев.

Приложение может загружать новые/обновленные данные в локальную базу данных при запуске или по мере необходимости. Это полезно для производительности или когда сетевое соединение может быть нестабильным.

person Mike Payne    schedule 14.09.2012
comment
Очень интересно! Не знал, что это существует. Спасибо! - person Nullqwerty; 17.09.2012

Попробуйте SQL Lite

SQL LITE

Функции SQL LITE

person TheJoeIaut    schedule 14.09.2012
comment
Интересно. Кажется, лучше, чем SQL Express для этих целей. Спасибо! - person Nullqwerty; 17.09.2012

Не могли бы вы подумать об этом с другой стороны и вместо того, чтобы выдвигать дополнительные проблемы вашему клиенту, просто подумать о том, чтобы поместить тонкий слой перед вашей базой данных?

Если бы вы использовали тонкий слой на основе NoSQL (наиболее популярны MongoDB или CouchDB), вы могли бы просто кэшировать свои объекты внутри него, чтобы снять нагрузку с вашей базы данных и перенести ее в кеш, а затем вы также получаете возможность масштабировать свой кеш. горизонтально через другие поля, если хотите.

Я знаю, что это противоречит части вашего вопроса «Использование локальной БД», но я не хотел игнорировать тот факт, что вы можете решить свою проблему, не касаясь клиента (возможно, несколько изменений строки подключения, но ваши модели останутся такой же).

person Grofit    schedule 14.09.2012
comment
Интересная идея, и я определенно был бы заинтересован в этом подходе. Я изучал его с тех пор, как вы его опубликовали. Меня больше всего беспокоит уровень усилий, которые потребуются для добавления mongo-db в качестве посредника. Сначала это казалось не таким уж плохим, но теперь кажется, что оно может быть лучше, чем предполагалось вначале. Спасибо за подсказку! - person Nullqwerty; 17.09.2012
comment
Что ж, вы можете сделать его настолько простым или сложным, насколько вам нужно, поскольку Mongo, например, просто хранит ваши объекты как есть (сериализация и базовый транспорт выполняются за вас), вам просто нужно сохранять и извлекать объекты. Как правило, вы бы использовали какой-либо веб-сервис для предоставления данных, он может не соответствовать тому, что вам нужно, но может иметь большое значение для распределения нагрузки запросов на чтение, предоставляя всегда простые запросы POCO, а не сложные запросы и т. д., которые являются еще одной проблемой дизайна для другого обсуждения. - person Grofit; 18.09.2012