Я бы сделал тупо в лоб — человек рисуется любым элементом, хоть div, хоть button, но по рассчитываемым в жаваскрипте координатам.
Наколбасить рекурсивную (причем скорее head-recursive) функцию, скажем, draw_ancestors(). В ней, когда отрисуется нижний, заведомо более населенный уровень, и только тогда уже по полученным снизу координатам уже рассчитывать координаты для текущего и вернуть их в верхний уровень в стеке.
Как оптимизировать структуру БД и общение с ней в таком случае — отдельный вопрос. Я бы попробовал интереса ради вообще no-sql решение с получением сразу всего дерева в JSON.