![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| Irokez |
|
|||
![]() индеец ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 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) ответ на первый вопрос: чтобы привести мысли в порядок, думаю у вас найдутся идеи как это организовать лучшим образом или просто советы |
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 11 Всего: 261 |
Я в свое время очень серьезно думал над таким вопросом... Пришел к выводу, что оптимальным ИМХО вариантом будет следующий.
В каждой таблице, которую надо синхронизировать ставится поле - время изменения записи. Ну тут я думаю ты понял для чего... При каждой синхронизации ищутся записи, которые изменялись. Т.е. при любом действии ты обновляешь это поле. Что касается удаления... Физическое заменяется на логическое, а следовательно идет через опять же редактирование поля времени. Если в реале надо удалить, то можно на серверах делать файлики за каждый день куда писать запросы для синхрогнизации... |
|||
|
||||
| Bikutoru |
|
|||
|
Увлекающийся ![]() ![]() Профиль Группа: Участник Сообщений: 522 Регистрация: 24.5.2005 Где: Москва Репутация: 2 Всего: 22 |
Сразу оговорюсь, что я работал с вариантом, в котором одно место является только источником, а второе только приёмником данных.
Я делал так: 1. Каждая запись содержит несколько информационных полей. Часть из них являются уникальной характеристикой записи (в моём случае это были два поля - производитель и название модели телефона). Добавляем одно дополнительное поле, содержащее некое хеш-значение от всех информационных полей (при любой модификации любого информационного поля пересчитывается), и одно поле, являющееся флагом модификации данного поля на "приёмнике" (при любой модификации инфориации на "приёмнике" устанавливается, но есть возможность сбросить этот флаг) 2. Берем уникальную характеристику и хеш-значения всех записей с "источника". 3. Берем уникальную характеристику, хеш-значения и флаги модификации с "приёмника". 4. Выбираем все записи "источника", которых нет в "приёмнике" (т.е. на "приёмнике" нет записи с такой уникальной характеристикой), или хеш-значения которых различны на "источнике" и "приёмнике" (при одинаковом значении уникальной характеристики). 5. Отсеиваем записи, у которых на "приёмнике" установлен флаг модификации. 6. Записываем информацию на "приёмник". Конечно, это не совсем то, что тебе нужно, но может поможет чем-то. Это сообщение отредактировал(а) Bikutoru - 24.9.2005, 10:54 -------------------- Человек, словно в зеркале мир — многолик, Он ничтожен — и он же безмерно велик! Омар Хайям |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Базы Данных | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |