На самом деле, я бы сказал, что это не столько иерархическая система, сколько семантическая сеть с ощутимыми расхождениями между значениями тегов. Что я имею в виду: математика ближе к экспериментальной физике, чем к садоводству.
Возможность создать такую сеть: создать пары тегов и позволить людям оценивать воспринимаемое расстояние (используя меру, например, 1-10, что-то вроде [синонимы, похожи, ..., антонимы], ...) при поиске ищите все теги на определенном расстоянии.
Должна ли мера быть равной дистанции, если она идет в противоположном направлении ([a, b] close -> [b, a,] close)? Или близость подразумевает [a, b] закрытие и [b, c] закрытие -> [a, b] закрытие?
Может быть, первое слово по умолчанию вызовет другое семантическое поле? Если вы начинаете с «социального работника», «аналитик» находится рядом. Если вы начинаете с «программист», «аналитик» также рядом. Но, начиная с любой из этих точек, вы, вероятно, не посчитаете другую как близкую («социальный работник» никоим образом не близок к «программисту»).
Таким образом, вы будете оценивать и оценивать только пары в обоих направлениях (в случайном порядке).
[TagRelations]
tagId integer
closeTagId integer
proximity integer
Пример выбора похожих тегов:
select closeTagId from TagRelations where tagId = :tagID and proximity < 3