Я знаю, что сообщение длинное, но оно также содержит предложенные решения моей проблемы. Поэтому сам вопрос не такой длинный ... не пугайтесь. :)
Пожалуйста, помогите мне со следующим сценарием:
У меня будет SQL-сервер, на котором я буду хранить наборы данных. У меня также будет куча клиентов ПК (все со своим локальным сервером SQL), которые нужно будет синхронизировать с сервером. ПК будут однозначно идентифицированы.
Пример:
Допустим, у меня есть 2 клиента ПК, ПК1 и ПК2.
На сервере у меня есть следующие наборы данных:
DS1
DS2
На клиентских компьютерах мне не с чего начать. Когда ПК1 подключится к серверу, чтобы увидеть, «что-нибудь новое», он заметит, что ему нужно получить два набора данных, чтобы он обновил свою локальную базу данных с DS1 и DS2. То же самое произойдет с ПК2. Теперь, скажем, PC2 локально модифицирует DS2. Когда ПК2 подключится к серверу, он обновит DS2 на сервере с изменениями, внесенными в его локальный DS2. Наконец, когда ПК1 снова подключится, чтобы увидеть, есть ли какие-либо изменения, он заметит, что DS2 изменился, и извлечет его и перезапишет свой локальный DS2 с DS2 с сервера.
Не беспокойтесь о проблемах параллелизма, потому что не все ПК могут изменять любой набор данных. Только владелец определенного набора данных может изменить его (владелец определяется как один компьютер.)
Я подумал о нескольких решениях, но они не кажутся очень эффективными; может быть, у кого-то еще будет несколько идей.
1-е решение:
На сервере я создам таблицу с именем «SyncTable», в которую я буду записывать любые изменения в наборы данных.
Пример: * * тысяча двадцать-пять
Допустим, ПК1 должен получить DS1, а ПК2 - DS4 и DS5.
Таблица синхронизации будет содержать:
PC1 DS1
PC2 DS4
PC2 DS5
Итак, когда PC2 подключается к серверу, он смотрит на эту таблицу, отмечает, что ему нужно загрузить DS4 и DS5, идет дальше и делает это, а затем удаляет свои две записи из таблицы сервера. Таким образом, таблица сервера будет содержать «PC1 DS1» только после синхронизации самой PC2. В следующий раз, когда подключается ПК2, он отмечает, что для него нет записей, и, таким образом, знает, что он "актуален". Когда ПК1 подключится, произойдет точно то же самое: он заметит, что ему нужно загрузить DS1, загрузить его и затем удалить запись.
Проблема в том, что если будет 10 000 ПК и, возможно, 5000 измененных наборов данных, у меня будет много записей в этой таблице.
Вторым решением будет сохранение измененной временной метки, связанной с каждым набором данных. Проблема заключается в том, что клиентские ПК должны были бы просмотреть ВСЕ свои локальные записи и сравнить локальные метки времени с последней меткой времени на сервере, чтобы увидеть, есть ли какие-либо изменения. Не уверен, насколько эффективно это дается большое количество записей. Похоже, было бы лучше, если бы они знали, где искать изменения, а не каждый раз просматривать все записи ...
Поэтому, у вас есть предложения по этому поводу?
Используемая технология: MS SQL Server Compact Edition 3.5 на клиентских ПК и MySQL на сервере. Связь будет осуществляться через веб-сервисы. Поэтому репликация слиянием / удаленный доступ к данным отсутствуют.
Спасибо!