К сожалению, код защищен моей работой, поэтому я не могу им поделиться.
Мой коллега создал фрагмент кода, предназначенный для выбора данных из реляционной базы данных, содержащей древовидные структуры в реляционном формате.
Пример древовидной структуры выглядит примерно так:
{
"top_level_node": {
"meta_info_1": "meta_info_keyword1",
"meta_info_2": "meta_info_keyword2",
"meta_info_3": "meta_info_keyword3",
"meta_info_4": "unique string of data",
"main_container": {
"container_attribute": "container_attribute_keyword",
"sub_container_1": {
"container_attribute": "container_attribute_keyword",
"pattern_1": {
"pattern_property_1": "pattern_property_1_keyword",
"pattern_property_2": "pattern_property_2_keyword",
"pattern_property_3": "unique string of data"
},
"pattern_2": {
"pattern_property_1": "pattern_property_1_keyword",
"pattern_property_2": "pattern_property_2_keyword",
"pattern_property_3": "unique string of data"
}
},
"pattern_3": {
"pattern_property_1": "pattern_property_1_keyword",
"pattern_property_2": "pattern_property_2_keyword",
"pattern_property_3": "unique string of data"
}
}
}
}
Код, созданный моим коллегой, включает в себя сначала выполнение 50-строчного рекурсивного запроса CTE, который создает все данные, необходимые для дерева, в линейном формате (1 часть данных на строку).
Затем мой коллега взял эти линейные данные в строки и обошел их с помощью рекурсивной функции PHP, чтобы восстановить древовидную структуру из данных.
Я попытался сказать, что это неправильный подход, потому что:
Данные уже находятся в формате (реляционные таблицы базы данных), который можно использовать для перестроения древовидной структуры с помощью рекурсивной функции php и простых запросов для выбора каждой части данных по мере продвижения. Я утверждаю, что это легче читать и требует только одного рекурсивного цикла.
Это не срочная операция, мы перестраиваем дерево данных для «процесса компиляции», который будет происходить, возможно, раз в месяц. Я утверждаю, что, поскольку время здесь не имеет значения, рекурсивный запрос CTE практически не дает никаких преимуществ.
Запрос очень длинный и сложный для чтения, если кто-то хочет понять, что делает php-код, он должен сначала понять запрос. Я утверждаю, что рекурсия должна быть в коде, а запросы должны быть простыми и понятными, что они извлекают.
Я утверждаю, что теоретически здесь требуется только одна часть рекурсии — либо рекурсивная в SQL, либо рекурсивная в PHP. Я утверждаю, что рекурсию в PHP легче понять, а рекурсия в SQL не способна перестроить древовидную структуру без массивного запроса.
Я прав? Почему, почему нет? Я ошибаюсь? Почему, почему нет? Имеет ли смысл выполнять рекурсивный запрос для преобразования данных из реляционного формата в линейный формат, а затем выполнять другую рекурсивную функцию для преобразования линейных данных в дерево?