Верстка генеалогического древа
Я бы сделал тупо в лоб — человек рисуется любым элементом, хоть div, хоть button, но по рассчитываемым в жаваскрипте координатам.

Наколбасить рекурсивную (причем скорее head-recursive) функцию, скажем, draw_ancestors(). В ней, когда отрисуется нижний, заведомо более населенный уровень, и только тогда уже по полученным снизу координатам уже рассчитывать координаты для текущего и вернуть их в верхний уровень в стеке.

Как оптимизировать структуру БД и общение с ней в таком случае — отдельный вопрос. Я бы попробовал интереса ради вообще no-sql решение с получением сразу всего дерева в JSON.
Первое что пришло на ум: таблица. Количество столбцов — максимальная ширина дерева (как раз те самые горизонтальные «отростки» в виде сестер, братьев), количество строк — максимальная высота дерева (мамы, папы, бабушки, дедушки). Как то так.