Разработка базы данных и приложения - устранение ограничений? - PullRequest
0 голосов
/ 23 ноября 2010

Я работаю над приложением Compact Framework, работающим на Windows Mobile.Он должен использоваться водителями доставки, чтобы сообщать им о своей следующей работе и отслеживать расходы и т. Д. У меня есть база данных SQL CE на мобильных устройствах и SQL Server на сервере.После борьбы с серьезными проблемами с производительностью и конфигурацией Sync Framework я написал свой собственный код синхронизации с использованием WCF.Это работает хорошо и намного быстрее, чем Sync Framework, но меня попросили ускорить его.Теперь мы углубимся в детали проблемы.Надеюсь, я могу объяснить это ясно.

Синхронизация работает по одной таблице за раз и является только односторонней.Обновления отправляются с сервера только на КПК.Передача данных обратно на сервер обрабатывается совершенно по-другому.Прежде всего я удаляю все записи на КПК, которые были удалены с сервера.Из-за ограничений базы данных я должен удалить из «дочерних» таблиц перед удалением из «родительских» таблиц, поэтому я работаю над иерархией снизу.Например, я удаляю записи из таблицы счетов-фактур перед удалением из таблицы продуктов.

Далее я добавляю новые записи на КПК, которые были добавлены на сервер.В этом случае мне нужно сначала обновить родительские таблицы, а затем выполнить иерархию, а потом обновить дочерние таблицы.

Проблема в том, что моему боссу не нравится тот факт, что мое приложение будет хранить большую таблицу, напримертаблица продуктов синхронизируется с сервером, когда драйверу доставки нужна только таблица invoiceProduct.Таблица invoiceProduct связывает таблицу счетов-фактур и продуктов вместе и содержит некоторую информацию о продукте.Я имею в виду, что их дизайн базы данных не нормализован, а название продукта было продублировано и сохранено в таблице invoiceProduct, а также в таблице продуктов.Конечно, мы все знаем, что это плохой дизайн, но кажется, что они сделали это, чтобы улучшить производительность в подобных ситуациях.

Очевидным решением является полное удаление таблицы продуктов из базы данных КПК.Однако я не могу этого сделать, потому что это иногда необходимо.Водители имеют возможность добавлять новый продукт в счет на лету.Мой начальник предполагает, что они могут просто время от времени синхронизировать большую таблицу продуктов или когда они пытаются добавить продукт и обнаруживают, что его там нет.Это не будет работать с текущим дизайном, потому что при загрузке счета-фактуры, содержащего новый продукт, который не находится на КПК, возникнет ошибка внешнего ключа базы данных.Надеюсь, это имеет смысл.Я не хочу снимать ограничения базы данных и портить мою красивую структуру данных: (

Ответы [ 2 ]

1 голос
/ 24 ноября 2010

Кажется, вы столкнулись с некоторой архитектурной проблемой. Я работаю над продуктом, который несколько похож на ситуацию. У меня было клиент-серверное приложение, в которое клиент загружал слишком много ненужных данных.

Мы использовали ADO.NET (набор данных) для отражения того, что база данных имеет на стороне клиента. Класс набора данных похож на SQL Server в памяти CE. У нашей компании появляются большие клиенты, и наша архитектура не достаточно быстра для обработки всех данных.

В прошлом мы делали следующее. Это не быстрое решение:

  1. Убрать «большинство» из ограничений на стороне клиента
    • все часто используемые данные по-прежнему имеют ограничения в набор данных.
  2. Создать логику для загрузки подмножества данных вместо загрузки всего на клиент. Например, мы загружаем только данные о работе за 7 дней вместо данных о работе (что мы делали в прошлом).
  3. Денормализация определенных данных путем добавления новых столбцов, так что нам не нужно загружать дополнительные данные, которые нам не нужны
  4. Некоторые данные загружаются только тогда, когда они необходимы на основе клиентских модулей.

Пока вы сохраняете ограничение базы данных на SQL Server, у вас не должно быть проблем с целостностью данных. Однако на стороне вашего КПК вам потребуется провести дополнительное тестирование, чтобы убедиться, что ваше приложение работает правильно.

Эту проблему нелегко решить, если у вас уже есть существующая архитектура. Надеюсь, эти предложения помогут вам.

1 голос
/ 23 ноября 2010

Добавьте поле create_on для ваших продуктов и отслеживайте, когда в последний раз синхронизировался каждый кпк. Когда счет будет загружен, проверьте, является ли продукт более новым, чем последняя синхронизация, и выполняет ли повторную синхронизацию КПК. Не похоже, что это слишком сильно испортило бы БД?

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