Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> синхронизация баз, помогите с алгоритмом 
:(
    Опции темы
Irokez
Дата 23.9.2005, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


индеец
***


Профиль
Группа: Участник Клуба
Сообщений: 1180
Регистрация: 20.10.2004

Репутация: 3
Всего: 53



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

алгоритм я себе представляю так:
1) найти записи из первой базы, отсутствующие во второй (новые записи) и добавить их во вторую БД
2) найти записи отсутствующие в первой базу, присутствующие во второй (удаленные записи) и удалить их из второй БД
3) найти соответствующие записи из первой БД, отличающиеся от записей во второй (измененные записи) и сделать идентичными в обеих базах

отсюда появляются проблемы:
А) откуда узнать была ли запись удалена в первой базе или же она была добавлена во второй?
Б) как найти соответствующие записи, если они различаются?

на помощь приходят следующие поля:
1) ID - идентификационные номера рядов (счетчик)
2) created - дата создания записи (datetime)
3) modified - дата изменения записи

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

вроде бы теперь можно все это кодить.. только все таки возникают вопросы:
1) зачем я это все тут расписал?
2) можно ли считать что записи с одинаковой датой создания (datetime - Y-m-d H:i:s) будут соответствующими? возможно есть другие варианты? было бы хорошо синхронизировать ID тоже, т.к они используются и в других таблицах
3) как проводить синхронизацию, если нет транзакций? (таблицы - MyISAM)

ответ на первый вопрос: чтобы привести мысли в порядок, думаю у вас найдутся идеи как это организовать лучшим образом или просто советы
PM   Вверх
Mal Hack
Дата 23.9.2005, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 11
Всего: 261



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

Что касается удаления... Физическое заменяется на логическое, а следовательно идет через опять же редактирование поля времени.

Если в реале надо удалить, то можно на серверах делать файлики за каждый день куда писать запросы для синхрогнизации...
PM ICQ   Вверх
Bikutoru
Дата 24.9.2005, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 2
Всего: 22



Сразу оговорюсь, что я работал с вариантом, в котором одно место является только источником, а второе только приёмником данных.
Я делал так:
1. Каждая запись содержит несколько информационных полей. Часть из них являются уникальной характеристикой записи (в моём случае это были два поля - производитель и название модели телефона). Добавляем одно дополнительное поле, содержащее некое хеш-значение от всех информационных полей (при любой модификации любого информационного поля пересчитывается), и одно поле, являющееся флагом модификации данного поля на "приёмнике" (при любой модификации инфориации на "приёмнике" устанавливается, но есть возможность сбросить этот флаг)
2. Берем уникальную характеристику и хеш-значения всех записей с "источника".
3. Берем уникальную характеристику, хеш-значения и флаги модификации с "приёмника".
4. Выбираем все записи "источника", которых нет в "приёмнике" (т.е. на "приёмнике" нет записи с такой уникальной характеристикой), или хеш-значения которых различны на "источнике" и "приёмнике" (при одинаковом значении уникальной характеристики).
5. Отсеиваем записи, у которых на "приёмнике" установлен флаг модификации.
6. Записываем информацию на "приёмник".

Конечно, это не совсем то, что тебе нужно, но может поможет чем-то.

Это сообщение отредактировал(а) Bikutoru - 24.9.2005, 10:54


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.1341 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.