[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сонхронизация данных
kasichvadim
Здравствуйте уважаемые форумчане! Помогите в таком вопросе:
Имеем две таблицы в разных БД на разных серверах. Первая таблица содержит некоторые данные (для примера id, username, firstname, lastname, email)
Вторая таблица будет аккумулировать данные с первой БД и иметь слеющие поля id, id_user (связь с первой таблицей), username, firstname, lastname, email.
Задача заключается в том, чтобы при каждом запуске скрипта он подключался к БД1 брал оттуда записи, которых нет в БД2 и добавлял их, но еще нужно проверять актуальность данных в записях, которые уже присутсвуют в БД2 (допустим пользователь сменил username либо email в БД1 и данное изменение нужно синхронизировать с БД2)
Записей будет много - 500000+

Сразу была идея сделать в БД2 дополнительное поле c хэшем данных, которые могут измениться (md5($username.$firstname.$lastname.$email)). При запуске скрипта выбираем все записи со второй бд в массив $hashes такого плана "id юзера => хэш"

Затем выбираем данные с донора БД1 и проверяем
if (!isset($hashes[id юзера])){
//тут инсертим новую запись
}elseif (isset($hashes[id юзера]) && $hashes[$id юзера] != $hash){
//хеш не совпал, значит данные изменились. апдейтим
}


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

Помогите советом, как такое лучше реализовать?

P.S. В кодах примера могут быть неточности, так как это просто наброски на быструю руку, чтобы донести суть задачи.

Спасибо!








Спустя 37 минут, 50 секунд (28.02.2012 - 23:54) SlavaFr написал(а):
в таблице 1 делаеш дополнительные поля с
insert_date, update_date
при инзерте ставиш актуальное время в insert_date a при упдате в update_date.

это дает тебе возмножность селектировать все строки которые были изменены или добавлены с определенного время.


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

Спустя 12 минут, 22 секунды (29.02.2012 - 00:06) kasichvadim написал(а):
ах да, забыл уточнить, БД1 изменять не могу (так как не моя), только читать sad.gif

Спустя 1 час, 9 минут, 53 секунды (29.02.2012 - 01:16) SlavaFr написал(а):
а скрипты на на сервере где база2 находится изменять можно?

Если нет, то можно делать дамп, инсталировать его на сервере 1 и посредством sql искать и устранять разницу между таблицами.

Спустя 6 минут, 24 секунды (29.02.2012 - 01:22) kasichvadim написал(а):
Все, кроме первой read only БД полностью в моем распоряжении

Спустя 11 минут (29.02.2012 - 01:33) SlavaFr написал(а):
ну тогда просто измени скрипты которые вносят новые строки или изменяют имеющиеся так, чтоб они сразу делали изменения в другой базе данных. В случае если будут произведены изменения ручками на прямую в таблицах, конечно понадобится делать дамп, так как я описал в предыдущем ответе.

Спустя 8 минут, 26 секунд (29.02.2012 - 01:42) kasichvadim написал(а):
Дело в том, что скриптов еще нет. Я их буду только писать smile.gif
Просто у меня в голове пока только одно решение, которое озвучил в первом посте, и которое я считаю не очень правильным

Спустя 8 часов, 28 минут, 45 секунд (29.02.2012 - 10:11) vmunt написал(а):
500000 записей из двух баз данных сканированием синхронизировать -- жуть!

Я бы всё-таки уговорил хозяина DB1 на занесение двух полей (added и modified, оба заполняются при INSERT-е, последнее меняется при UPDATE), как было предложено SlavaFr (привёт тезке!). Сразу стало бы всё намного проще.

Если нет, то сортируем обе таблицы по одинаковому ключевому полю (username или id / id_user), и одним циклом просматриваем все записи до конца DB1, проверяя условия:
1. Предварительный цикл если в DB2 ключ меньше, чем в DB1, то удаляем запись и считываем другой ключ из DB2,
2. Цикл если ключ DB2 больше, чем DB1, то вставляем запись
3. Если ключи равны, то сравниваем записи и обновляем, если есть разница и переходим на следующий ключ DB2
4. После этого берём следующий ключ DB1
Цикл закончен.
После цикла, если записи в DB2 остались ещё, удаляем их все.

P.S.: Вариант с хэшами не прокатывает, потому что хэши всё равно в DB1 внести не получится? Так?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.