Каков наилучший архитектурный выбор для просмотра агрегатов постоянно меняющегося набора данных? - PullRequest
2 голосов
/ 06 апреля 2011

Мне нужно выбрать оптимальный способ написания клиентского приложения на C # для просмотра набора данных в нескольких различных представлениях. Один, несколько или все виды могут быть видны одновременно и должны быть согласованными. Упрощенная иллюстрация набора данных будет примерно такой: предположим, около 10000 элементов.

Dataset illustration

На основе этого набора данных должно быть рассчитано количество агрегатов, например, сумма значений для каждого ItemId и для каждого ClientId. Фактические вычисления немного сложнее, но предположим, что необходимо рассчитать около 30 различных агрегатов.

Будет около 10 клиентов, которые будут просматривать данные одновременно. Каждый пользователь сам решит, будут ли данные постоянно обновляться или обновляться автоматически.

Данные хранятся в SQL Server 2008 R2, и все клиенты имеют доступ к этому напрямую и находятся в одной локальной сети.

Пользовательский интерфейс должен быть неблокирующим, чтобы новые данные могли считываться в фоновом режиме, а активные представления обновляться после расчета всех агрегатов.

  1. Какая архитектура / технология / шаблон лучше всего подходит для такого сценария?
  2. Стоит ли использовать WPF, Windows Forms или Silverlight?
  3. Должны ли предварительно рассчитываться представления на сервере или клиент должен выполнять эту обработку?
  4. Должен ли клиент подключаться напрямую к базе данных или через службу WCF?

Ответы [ 3 ]

2 голосов
/ 06 апреля 2011

К сожалению, я думаю, что ответ на большинство ваших вопросов «Это зависит».

1 - MVVM имеет смысл, учитывая ваши требования многих представлений одних и тех же наборов данных.

2- С какой технологией вы больше всего знакомы и каковы сроки вашего приложения.Если вы очень хорошо знакомы с WinForms и имеете плотный график, который имеет смысл.Если нет, и у вас есть время учиться, то Silverlight может иметь больше смысла.Я как бы разозлился на WPF, так как в настоящее время он больше похож на Silverlight ++, а не наоборот.Другими словами, если вам нужно создать приложение Line of Business, выберите Silverlight UNLESS , то есть требование, которое может быть выполнено только с WPF.

3 - Ответ на этот вопрос зависит от2 вещи: как часто обновляются данные и насколько сложны / подходят для SQL вычисления.Как правило, я бы предпочел обрабатывать агрегирование на стороне сервера, но в зависимости от того, какие именно вычисления вы выполняете, которые могут или не могут быть осуществимы.

4 - Это действительно будет сделано для вас в зависимости от вашего выборатехнологии.Silverlight не может подключиться к базе данных напрямую, поэтому вы должны использовать службу.WinForms и WPF могут напрямую подключаться к базе данных.Тем не менее, использование службы доступа к данным может помочь, если вы обнаружите, что каждый клиент напрямую обращается к базе данных, что может быть проблемой производительности.

Многие из этих решений являются компромиссами, и вы можете даже не знать, чтоВы торговали чем-то, пока это не стало проблемой.

TLDR: зависит.

1 голос
/ 07 апреля 2011

Какая архитектура / технология / шаблон лучше всего подходит для такого рода сценариев?

Поскольку это звучит в основном как приложение только для чтения, а не как то, что будет выполнять ввод данных иПроверка, я бы, вероятно, выбрал WPF (10 клиентов не так много).Silverlight будет моим вторым выбором.Любая технология даст вам асиновые обратные вызовы.Я сделал оба;WPF будет более отзывчивым.

Должен ли я использовать WPF, Windows Forms или Silverlight?

Избегать WinForms, как чума.

Должны ли предварительно рассчитываться представления на сервере или клиент должен выполнить эту обработку?

Это зависит от того, какую работу вы хотите выполнить с базой данных.Лично я ненавижу помещать бизнес-логику в базу данных ... Я бы, вероятно, написал упрощенный Service Facade поверх БД, поместил туда свою бизнес-логику и затем представил бы результаты в виде службы WCF клиенту WPF (или какСервис RIA, если я выбрал Silverlight).

Должен ли клиент подключаться напрямую к базе данных или через службу WCF?

Подключение напрямую к БД означает, что вы собираетесь в HAVE, чтобы поместить всю бизнес-логикулибо в БД в views / Sprocs, либо все вычисления должны быть на клиенте (плохо, IMO).Или разложить по двум (хуже).

Лично мне бы хотелось, чтобы вся бизнес-логика находилась в одном месте на сервере, чтобы клиенты, получающие данные, гарантированно получали ТО ЖЕ САМЫЕ результаты.Я не позволил бы клиентам делать расчеты данных.

РЕДАКТИРОВАТЬ: Кроме того, наличие у клиентов ЛЮБОГО вида бизнес-расчетов затрудняет развертывание и управление версиями.Если вы ЗНАЕТЕ, что вся бизнес-логика находится на сервере, то все, что вам нужно сделать для обновления, - это выпустить новую версию сервиса.Тогда вам все равно, сколько у вас клиентов и кто в какой версии клиентского приложения - вы все равно можете гарантировать, что клиенты получают самые новые данные через одну службу.

Я бы, вероятно, либо построил бы представления в БД для наборов результатов (если бы вычисления данных были простыми и легко подходили для представлений), либо на стороне сервера была бы служба, которая выполняла бы вычислениякаждые X минут, а затем кэшировать эти результаты (кешировать в другие таблицы, или другую БД, или нет-sql, что угодно).В этом случае клиенты могут получать данные так часто, как им хочется, но вычисление данных будет фактически контролироваться службой, а не клиентами.Позволить клиентам управлять обновлением данных может быть ошибкой ... Единственный способ, который я считаю приемлемым, - это если вы добавите какой-то механизм регулирования в свои сообщения, чтобы вы могли сказать клиентам: «Не пингуйте менятак быстро для результатов, сервер отстает ".Потому что сервер должен иметь некоторый контроль над нагрузкой.

В этом сценарии есть над чем подумать, и это только мои первые мысли.

1 голос
/ 06 апреля 2011

Я в основном согласен с Барри: MVVM для шаблона проектирования, Silverlight имеет смысл, использование веб-службы также может помочь с авторизацией / предоставлением различных функций для разных клиентов (даже если это не было конкретным требованием)

Единственное, с чем я не согласен, это когда производятся агрегации: я лично считаю, что вы должны отправить минимальный объем данных, необходимый клиенту, и позволить клиентам выполнять как можно больше вычислений. Например, в вашей таблице поле «Значение» выглядит так, как будто это простой продукт «Количество» и «Цена». На самом деле я не вижу причины для вычисления этого в базе данных, затем загрузки его в веб-службу, а затем передачи его клиенту, чтобы клиент отображал только данные. Это означает, что ваша база данных выполняет 95% работы, но вы можете заставить клиента выполнять некоторую работу (10-15%) и снизить нагрузку на вашу базу данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...