Я могу придумать пару разумных решений, в зависимости от того, как используются ваши данные и как они изменяются.
1) Предполагая, что сегодняшняя иерархия является наиболее важной. Я бы сохранил сегодняшнюю иерархию с обычным столбцом ParentId в каждой записи. Для предыдущих версий иерархии у меня была бы таблица истории
ItemId, ParentId, ValidFromDate, ValidToDate
Каждый раз, когда изменяется иерархия, вы добавляете новую строку в таблицу истории.
2) Если какая-либо / все иерархии имеют одинаковую важность, я бы сохранил иерархию базовой линии, а затем реализовал таблицу транзакций иерархии.
TransactionId, ItemId, Action (Move/Delete/Add), DateTime, OldParentId, NewParentId