Разбираясь с внутренним устройством OSM поймал себя на мысли, что у меня отсутствует четкая картина как происходит обновление и создание нового объекта на уровне БД.
Как я сейчас вижу этот процесс:
имеем таблицы [node\way\relation] и связанные с ними (такие как [node\way\relation]tags, relation_members, way_nodes). Так же имеются таблицы, почти схожие по своей структуре и связям, НО с приставкой current*.
Насколько я понимаю, таблицы current_* хранят в себе текущую актуальную информацию (т.е. последние версии объектов) и именно эта информация используется, например, когда мы в GUI выбираем пункт “Отобразить данные карты”. Истории же изменений объектов (предыдущие версии) хранятся в таблицах без приставки current.
Далее мы начинаем добавлять/изменять объекты. И тут у меня возникают следующие вопросы:
В случаем когда мы создаем новый объект он помещается в таблицы current_*?
А что происходит, когда мы обновляем существующий объект? Данные удаляются из таблиц current? Или обновляются поля version и timestamp, а допустим тэги перезаписываются, чтобы остались только тэги, соответствующие последней версии объекта?
И еще один вопрос по внутреннему устройству БД: есть таблица Redactions, на ID которой ссылаются таблицы [node\way\relations], для чего она? Не нашел упоминаний.
Может есть специальное время, например во время снятия дампа планеты (хотя вроде бы делают это на репликационной базе), старые версии удаляются из current_*. Хотя с учётом, что заливка правки может занимать минуту другую, вполне возможно это делать сразу же.
Спасибо за ответ.
Думаю, это не пользователи, так как для них своя таблица, для changeset’ов своя. А таблица redactions связана именно с таблицами, хранящими историю объектов.
Это скрытие данных, не удовлетворяющих изменившейся лицензии. Во время перехода на новую лицензию не все пользователи дали согласие и их правки были вврезаны и скрыты
В последствии этот механизм стал применяться для выпиливания различных данных.
Mavl, спасибо!
И все же - объясните на конкретном примере, вот мы создали точку(раньше ее не было) с одним каким нибудь свойством. В какую таблицу попадет, master или current? Далее мы ее обновили, добавив еще одно свойство, что при этом произошло?
Данные о точке при создании попадают сразу в обе таблицы. При обновлении этой точки в таблице current_* существующая запись обновляется, а в таблицу истории добавляется новая запись для следующей версии. Просто в current_* таблицах хранится последняя версия объекта, а в таблицах истории хранятся все версии объекта.