Вопрос по схеме БД OSM

Всем привет!

Разбираясь с внутренним устройством OSM поймал себя на мысли, что у меня отсутствует четкая картина как происходит обновление и создание нового объекта на уровне БД.

Как я сейчас вижу этот процесс:
имеем таблицы [node\way\relation] и связанные с ними (такие как [node\way\relation]tags, relation_members, way_nodes). Так же имеются таблицы, почти схожие по своей структуре и связям, НО с приставкой current*.

Насколько я понимаю, таблицы current_* хранят в себе текущую актуальную информацию (т.е. последние версии объектов) и именно эта информация используется, например, когда мы в GUI выбираем пункт “Отобразить данные карты”. Истории же изменений объектов (предыдущие версии) хранятся в таблицах без приставки current.

Далее мы начинаем добавлять/изменять объекты. И тут у меня возникают следующие вопросы:

  1. В случаем когда мы создаем новый объект он помещается в таблицы current_*?
  2. А что происходит, когда мы обновляем существующий объект? Данные удаляются из таблиц current? Или обновляются поля version и timestamp, а допустим тэги перезаписываются, чтобы остались только тэги, соответствующие последней версии объекта?
  3. И еще один вопрос по внутреннему устройству БД: есть таблица Redactions, на ID которой ссылаются таблицы [node\way\relations], для чего она? Не нашел упоминаний.

Спасибо большое за внимание к моему вопросу!

  1. Может есть специальное время, например во время снятия дампа планеты (хотя вроде бы делают это на репликационной базе), старые версии удаляются из current_*. Хотя с учётом, что заливка правки может занимать минуту другую, вполне возможно это делать сразу же.
  2. Это наверное пользователи.

Спасибо за ответ.
Думаю, это не пользователи, так как для них своя таблица, для changeset’ов своя. А таблица redactions связана именно с таблицами, хранящими историю объектов.

Это скрытие некоторых версий объектов OSM (обычно по причинам нарушения авторского права, если удаления данных недостаточно).

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

В последствии этот механизм стал применяться для выпиливания различных данных.

Спасибо за разъяснения

Идеи по первому и второму вопросу имеются? Готов обсуждать)

http://wiki.openstreetmap.org/wiki/Rails_port/Database_schema

Mavl, спасибо!
И все же - объясните на конкретном примере, вот мы создали точку(раньше ее не было) с одним каким нибудь свойством. В какую таблицу попадет, master или current? Далее мы ее обновили, добавив еще одно свойство, что при этом произошло?

Данные о точке при создании попадают сразу в обе таблицы. При обновлении этой точки в таблице current_* существующая запись обновляется, а в таблицу истории добавляется новая запись для следующей версии. Просто в current_* таблицах хранится последняя версия объекта, а в таблицах истории хранятся все версии объекта.

Спасибо еще раз! Все встало на свои места!