Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / обновление записей с логами / 1 сообщений из 1, страница 1 из 1
16.09.2013, 17:28:14
    #38397956
Jude
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обновление записей с логами
Добрый день!

есть таблица логов. например так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE tbl_log (
id int(11) NOT NULL auto_increment,
new_pole_id varchar(20) default NULL,
old_pole_id int(11) default NULL,
New_value varchar(50) default NULL,
old_value varchar(50) default NULL,
ftimestamp timestamp NULL default CURRENT_TIMESTAMP,
table_name varchar(20) default NULL COMMENT 'Это поле, в котором указывается таблица, которую обновили',
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;


и есть две таблицы:
"новая" tbl_new = в нее льем из внешних источников данные.
и
"боевая" tbl_old = в ней находятся данные, которые нужно проверить на предмет изменений и проапдейтить.
структура у данных разная.


как я вижу решение:
1) хранимка, которая после заливки в tbl_new - вызывается внешним скриптом.
2) в хранимке фиксируется ид записи tbl_log , максимальный в логе на данный момент.
3) делается запрос, на подобии:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
insert 
into tbl_log(
new_pole_id,
old_pole_id,
new_value,
old_value,
table_name
)

 select sac.id, cn.id,sac.nw_name,cn.nw_name,'new_to_olq_upd' from 
 old_tbl cn join 
 rel_tbl rn on
not isnull( cn.`nw_ID`) 
and 
 cn.rel_id = rn.id
 join
 new_tbl sac
 on
 sac.id = cn.nw_ID
 and
 sac.nw_name<>cn.nw_name
 and 
 (sac.`region_id` = rn.`nw_rel_id`
 and 
 cn.rel_id <>:non_rel_id
 or
 cn.rel_id = :non_rel_id
 and
 not exists (select 1 from rel_tbl where rel_tbl.nw_rel_id = sac.region_id )
 );


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

4) обновляем главную таблицу:
(то же, но апдейт, при этом беру записи из лога - вяжу по ид записи таблицы old_tbl.id. беру записи с tbl_log.id которые старше той, которую получил в п.2)
5) повторяю п. 3. с ключем "после обновления".
6) проверяю сколько записей в п.5 = если больше 0 = значит не все записи обновились.
7) соммит

а вот теперь вопрос:
прошу прокомментировать подход. не лучше ли делать лог через триггер?

что должно быть:
лог изменений.
+
изменения.

структура
new_tbl:
-id
-nw_name
-region_id

old_tbl
-id
-nw_name
-nw_ID
-rel_id

rel_tbl:
-id
-nw_rel_id

:non_rel_id = объединяет записи, где new_tbl.region_id не в rel_tbl.nw_rel_id.
группа данных, не подходящих по структуре среди вновь залитых - складируется отдельно.
гарантируется уникальность new_tbl.id

собственно работаю в сторону уменьшения времени. с корректными логами.

мысль в том, что в рамках сессии не должно быть записей другими хранимками - следовательно набор id >запомненого в п.2
должен быть достаточным.
объемы:
в New_tbl = 40к строк. в др варианте 300к строк.
в old_tbl = 30к .. в др варианте 40к строк.
таблица old_tbl - будет постепенно , но бодро "пухнуть" с использоватием данных из new_tbl. задача не инсертить новых данных, а только апдейтить старые, где поле NW_NAME изменилось.

советы и комментарии,
особенно по каким граблям мне придется пройти - жду.
спасибо.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / обновление записей с логами / 1 сообщений из 1, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]