Двусторонняя синхронизация с iPhone и веб-сервисом - PullRequest
4 голосов
/ 30 декабря 2010

Да, я знаю, что есть пара вопросов, связанных с синхронизацией с iPhone и Web DB, но ни один из них мне не помог. Я также много гуглил, но редко встречал информацию о двусторонней синхронизации. Может быть, я просто использовал неправильные ключевые слова.


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

Идея моего приложения состоит в том, чтобы помочь мне синхронизировать свои заметки, которые я буду брать с собой на ходу с iPhone, на работе или дома с веб-приложением. Эти два конца всегда должны синхронизироваться, потому что я не знаю, какое устройство (iPhone или компьютер) я буду использовать, чтобы взять, отредактировать или просто прочитать мои заметки.

Что у меня с обеих сторон:

Для моего веб-сервиса (и веб-приложения) я буду использовать rails, и я думаю, что mysql на стороне БД. На iPhone я буду использовать БД SQLite с оболочкой Objective-C (FMDB). Оба будут обмениваться данными через JSON (используя фреймворк JSON на стороне iPhone).

Мои идеи пока:

  1. Первичный ключ должен быть уникальным с обеих сторон

    В качестве первичного ключа я буду использовать UUID. Я думаю, что это уникальное решение с обеих сторон, и оно не создаст дубликатов (по крайней мере, я надеюсь).

  2. Редакции для изменения данных

    Каждое изменение будет сохранено как ревизия с ключом SHA1, который я создам из date + note data. Объект ревизии также включает в себя такую ​​информацию, как:

    • дата
    • какой объект примечания относится к этой ревизии
    • изменения сделаны на каком устройстве?
    • что меняли? (на самом деле я не уверен, что включу эту информацию)

Мое "решение" до сих пор состоит в том, что я буду отслеживать каждую модификацию (создавать, обновлять, удалять) в таблице историй с ревизиями с обеих сторон. Со стороны iPhone я сначала обновлю свою таблицу истории из веб-базы данных, а затем зафиксирую свои изменения в веб-базе данных. Это должно работать, верно?

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

Сводка моих вопросов:

  1. Мое "решение" хорошо или плохо? Что я должен изменить, чтобы сделать его лучше?
  2. Как я могу обрабатывать конфликты изменений, чтобы пользователь их не замечал?
  3. У вас есть какие-нибудь ресурсы, которые я мог бы прочитать о двусторонней сортировке?

EDIT:

Спасибо всем за ваши ответы. Теперь я знаю, что я не одинок в этой «проблеме», и не существует простого и подходящего решения для всех приложений. Я предполагаю, что до сих пор хорошо справляюсь со своими идеями или решениями и постараюсь придумать правила синхронизации.

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

Что вы думаете?

Ответы [ 2 ]

11 голосов
/ 02 января 2011

«Это зависит».

Каждый любит эту строку в своих ответах.

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

Без конфликта синхронизация проста.

Односторонняя синхронизация "проста", потому что это как двусторонняя синхронизацияЗа исключением того, что правила конфликта всегда благоприятствуют одной стороне.«Сделай так, чтобы это выглядело так».Простое правило.

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

Под конкретными изменениями я не подразумеваю «запись изменена», так как это слишкомгрубая.Скорее вы хотите знать, что «lastName» записи изменилось.Это изменилось в 01.01.2011 12: 23: 45.

Когда сторона A говорит, что lastName изменено на «Джонсон» в 01.01.2011 12:22:45, и сторона B говорит, что lastName изменено на «Смит»«01.01.2011 12:22:46, тогда« Смит »- правильный ответ, поскольку он самый последний.

Но подождите, вы видели, что там произошло?Я просто вытащил правило из воздуха."Последние победы".Может быть, это не работает для вас, может быть, у вас есть другие правила.«Это зависит».

Так что, на самом деле, все сводится к правилам.Вы можете сделать это так хорошо, как вы хотите.ВСЕГДА будут конфликты.Вот для чего нужны правила.

Так что вам нужно решить, что это за приложение.

1 голос
/ 05 января 2011

на самом деле я считаю, что единственная проблема в любой двухсторонней синхронизации происходит только при наличии конфликтов. В самом деле. Возьмем для примера любую систему контроля версий (svn, cvs, git и т. Д.). Они разрешают этот конфликт более детально, поскольку разделяют сам файл и проверяют конфликты строк, поэтому изменения в двух разных частях файла не рассматриваются как конфликты. Однако я полагаю, что это решение было бы неосуществимо, потому что его трудно реализовать :) ...

Если вы решаете обрабатывать конфликты на уровне заметок, а не строк, то, вероятно, в конце дня вам нужно придумать какое-то бизнес-правило, которое определяет, что происходит, когда есть изменения, которые приводят к конфликту , Возможности:

  1. Используйте последнее изменение. Переопределите старшее. Это просто.

  2. Решение, которое использует Dropbox, я видел его пару раз, когда мы меняли один и тот же документ на нескольких компьютерах, - это создание нескольких файлов с добавлением суффикса, чтобы пользователи знали об изменениях на нескольких машины. Нечто подобное можно легко сделать и с заметками.

Я не уверен, что помог, хотя ... Moszi

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