[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Апдейт базы данных
Bolik
Привет,

у меня есть довольно большая база адресов (больше миллиона с перспективой роста), которую нужно каждый месяц актуализировать. таблица с адресами довольно тяжелая (>1GB), много текстовых полей. вот сижу и думаю как лучше сделать.

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

думаю просто добавить в базу таблицу updates и писать туда старые адреса. т.е. если адрес изменился, то новый адрес идет в общую таблицу, а старый в updates. смущает количество запросов в базу для каждого отдельно взятого адреса:
берем новый адрес
ищем по ключу адрес в общей таблице (SELECT)
сравниваем и если есть изменения
пишем старый адрес в updates (INSERT)
обновляем запись в общей таблице (UPDATE)
для маленькой базы данных это не было бы проблемой, но в моем случае думаю на каждый адрес будет уходить пару секунд, а при 2-2.5 млн. адресов (из которых только 1 млн. уникальных) каждый апдейт будет испытанием...

может кто-то подскажет как лучше сделать? где почитать как правильно делать такие вещи?

заранее спасибо!
sergeiss
Цитата (Bolik @ 27.06.2014 - 17:15)
смущает количество запросов в базу для каждого отдельно взятого адреса:

Ну да, многовато будет.

Я бы так сделал, наверное. К каждому адресу добавить поле "дата изменения" и, возможно, сам список изменений. Как только что-то меняешь, то в старой записи выставляем дату и вносим список изменений, а новые данные пишем в новую запись. Может быть, еще даже сохраняем ссылку на предыдущую запись, в отдельном поле.

В итоге ты только апдейтишь и добавляешь данные в одной таблице.

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

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Bolik
спасибо.
но мне как-то не хочется еще больше увеличивать размер таблицы, она и без истории расти будет. с общей таблице можно записать дату последнего изменения, если такое имеется, что именно изменилось (что-то вроде 100110) и возмножо еще ссылку на старую (ые) запись (и) в таблице update (тут надо подумать).

есть еще мысли? smile.gif
SlavaFr
В общем Адрес это отдельный обэкт и меняется только в том случае, если улицу переиминовывают или делают вместо улицы скоростную дорогу.
Речь идет о временнй связи определенных объектов с этим Адрессом и эта связь может храниться в отдельной таблице.
Если в таблице Адресов за исключением ключа нет индексов и нет частого поиска по другим полям, то проблемам с update и insert не откуда взяться

_____________
↓↓↓↓↓↓↓↓↓↓
ответ может быть здесь
или в mysql_error();
vital
Сделали селект - если изменилось - сделали апдейт.
А данные в таблицу истории писать триггером на апдейт и не мучаться.

_____________
"Нужно быть готовым прислушиваться к тем, кто может тебя чему-нибудь научить. Иначе ты никогда не вырастешь."

Откровенно я никому ниразу не нагрубил. А дать подзатыльник зарвавшемуся юнцу, так это и ему на пользу, и мне в удовольствие. © AllesKlar
FatCat
Цитата (Bolik @ 27.06.2014 - 17:23)
есть еще мысли?

Делал похожее, только не по адресам, а по редактированным сообщениям на форуме - чтобы по каждому сообщению можно было вытянуть историю редактирований.

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

Запрос к актуальной таблице:
SELECT * FROM posts WHERE pid = xxx

Если же хотим получить все прошлые редакции этого сообщения, запрос:
SELECT p.*, pp.post, pp.post_date
FROM posts p
LEFT JOIN posts_edited pp ON(p.pid=pp.pid)
WHERE pid = xxx


И таки да, никаких апдейтов. При каждом редактировании, старая информация из таблицы posts добавляется в таблицу posts_edited.

_____________
Бесплатному сыру в дырки не заглядывают...
Bolik
спасибо за советы!
у меня тоже поле в главной таблице поле уникальное по adress_id, в апдейтах оно будет не уникальным. буду пробовать, самому интересно сколько времени на все понадобится. на создание таблицы уходит 3 дня) посмотрим сколько на апдейт.
Быстрый ответ:

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