С MS Sync Framework 2.0, как я могу лучше всего обрабатывать связанные таблицы? - PullRequest
5 голосов
/ 18 февраля 2010

Sync Framework синхронизирует данные по таблицам, но мои сущности нормализуются по наборам связанных родительско-дочерних таблиц.Это создает проблемы для моего приложения, когда родительская строка может появиться на сервере для обработки, но дочерние строки могут не появиться в течение нескольких секунд.Если между моим клиентским приложением и сервером существует проблема с подключением, дочерние строки могут не отображаться в течение некоторого времени.

Как мне спроектировать мое приложение для обработки дочерних таблиц, синхронизируемых отдельно от родительских таблиц?

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

Ниже приведены некоторые мои собственные идеи.

Ответы [ 6 ]

2 голосов
/ 21 февраля 2010

Используя Sync Framework, добавьте связанные таблицы в свои собственные группы синхронизации. Например. Добавьте таблицы OrderHeader и OrderDetail в свою собственную группу синхронизации, которая называется Orders.

Не помещайте ничего в группу синхронизации, если это не связано напрямую.

Затем синхронизируйте каждую из групп синхронизации в транзакции. Таким образом, вы гарантированно синхронизируете обе таблицы или ни одну из них ...

Пожалуйста, спросите, требуется ли вам более подробная информация об этом процессе.

0 голосов
/ 22 февраля 2013

Недостаточно места внутри поля для комментариев для моих мыслей:

Синхронизировать главные объекты вместо реляционных данных? Я не знаю, сможем ли мы сделать это с помощью Sync Framework ... может быть, реализовать собственный провайдер?

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

База данных A

BeginTransaction
    Substract $500 from account 1
    Add $200 to account 2
    Add $300 to account 3
EndTransaction

База данных B

BeginTransaction
    Substract $100 from account 1
    Add $100 to account 4
EndTransaction

Когда вы синхронизируете, вы обнаружите конфликт на 1, но не на 2, 3 и 4. С этим примером вы можете разработать стратегию слияния, но это не всегда так.

0 голосов
/ 03 марта 2010

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

Плюсы:

  • Может быть полностью реализовано в базе данных.
  • Нет необходимостизаменить любые части Sync Framework.
  • Может достаточно хорошо масштабироваться до большого числа строк, если вы тщательно следите за тем, как было построено и отфильтровано представление, и как были проиндексированы базовые таблицы.

Минусы:

  • Нормализация базы данных может считаться плохой.
  • Может плохо масштабироваться для большого количества таблиц и столбцов, требующих большого количества объединений.
  • Необходимо также агрегировать данные отслеживания изменений.
  • При использовании представления необходимо создать триггеры, чтобы сделать его обновляемым.
0 голосов
/ 18 февраля 2010

А как насчет контрольных сумм? Каждый раз, когда приложение вносит изменения в объект, оно вычисляет хэш на основе самого последнего содержимого объекта и сохраняет его в родительской строке. Когда приложение читает объект, оно может пересчитать хеш. Если доступные в данный момент данные не совпадают с хешем, сохраненным с сущностью, приложение знает, что нужно выполнить дополнительную синхронизацию.

Плюсы:

  • Может быть довольно простым изменением модели предметной области приложения, которое не включает изменение внутренних компонентов Sync Framework.

Минусы:

  • Приложению потребуется считывать все строки, которые относятся к сущности, в память каждый раз, когда оно вносит изменения.
  • Это было бы намного сложнее, если бы приложению приходилось поддерживать обновления для одной и той же сущности, поступающие от нескольких клиентов.
  • Необходимо тщательно планировать, какие изменения синхронизируются в каждом направлении и когда вычисляется соответствующий хэш. В зависимости от ваших данных вам может понадобиться синхронизировать одни и те же таблицы несколько раз.
  • Заказ на одно приложение; вы не можете взять тот же код и применить его к чему-то другому.
0 голосов
/ 18 февраля 2010

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

Плюсы:

  • Это может быть гибкий и надежный способ работы с данными и не зависит от большого количествасложный код синхронизации, но дополнительные фрагменты появятся позже.
  • Если данные синхронизируются от пользователя к серверу для отправки в какую-либо другую серверную систему, эта система может не поддерживать частичное представление.
0 голосов
/ 18 февраля 2010

Я мог бы настроить Sync Framework, чтобы он уважал отношения с базой данных. Когда пользовательский SyncAdapter встречает строку с изменениями, он может пройти через дочерние отношения в схеме базы данных, чтобы обнаружить любые изменения в связанных строках. Все эти изменения будут добавлены в один и тот же набор данных и синхронизированы как одна транзакция.

Плюсы:

  • Это кажется лучшим решением с точки зрения целостности данных. Я могу быть уверен, что конкретный объект либо содержит все доступные изменения от клиента, либо ни одного из них.
  • Мне не нужно менять свои сущности или описывать их каким-либо особым образом для настраиваемого адаптера - всю необходимую информацию можно получить для уже существующих отношений с базой данных.
  • Мне не нужно делать ничего особенного с моей схемой базы данных - я могу в значительной степени указать свой код на любую базу данных, и она будет просто работать.

Минусы:

  • Настройка Sync Framework таким способом может потребовать много усилий и потребует подробных знаний о внутренностях платформы.
  • Пользовательский адаптер должен обнаруживать и обрабатывать циклические связи с базой данных.
...