Эта рекурсия в SQL и PHP кажется посторонней - PullRequest
0 голосов
/ 10 декабря 2018

К сожалению, код защищен моей работой, поэтому я не могу поделиться им.

Мой коллега создал фрагмент кода, предназначенный для выбора данных из реляционной базы данных, содержащей древовидные структуры в реляционном формате.

Примером древовидной структуры является что-то вроде:

{
    "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"
            }
        }
    }
}

Код, который создал мой коллега, включает в себя сначала выполнение рекурсивного запроса CTE из 50 строк, который производит все данные, необходимые в деревев линейном формате (1 фрагмент данных на строку).

Затем мой коллега взял эти линейные данные в строках и обработал их с помощью рекурсивной функции PHP для восстановления древовидной структуры из данных.

Я пытался сказать, что это неправильный подход, потому что:

  1. Данные уже имеют формат (реляционные таблицы БД), который можно использовать для восстановления древовидной структуры с помощью рекурсивногоФункция PHP и простые запросы, чтобы выбрать каждый кусок данных, как вы идете.Я утверждаю, что это проще для чтения и требует только одного рекурсивного цикла.

  2. Это не чувствительная ко времени операция, мы перестраиваем дерево данных для «процесса компиляции»что произойдет, может быть, один раз в месяц.Я утверждаю, что поскольку время здесь не важно, рекурсивный запрос CTE практически не дает преимуществ.

  3. Запрос чрезвычайно длинный и сложный для чтения, если кто-то хочет понять, что такое код phpделает, они должны сначала понять запрос.Я утверждаю, что рекурсия должна быть в коде, а запросы должны быть простыми и легкими для понимания того, что они получают.

Я утверждаю, что теоретически здесь требуется только один фрагмент рекурсии- либо рекурсивный в SQL, либо рекурсивный в PHP.Я утверждаю, что рекурсию в PHP легче понять, а рекурсия в SQL не способна перестроить древовидную структуру без большого запроса.

Я прав?Почему, почему нет?Я ошибся?Почему, почему нет?Имеет ли смысл выполнять рекурсивный запрос для преобразования данных из реляционного формата в линейный формат, а затем выполнять другую рекурсивную функцию для преобразования линейных данных в дерево?

1 Ответ

0 голосов
/ 10 декабря 2018

Ваш коллега разработал технику, которая позволяет ему получать данные для рекурсивной структуры в одном запросе.Для этого могут быть веские технические причины.Его запрос является рекурсивным, потому что это разумный метод для преобразования древовидной структуры данных в таблицу.Затем он строит новое дерево на другой стороне из этой таблицы данных, снова рекурсивная операция, потому что это дерево, которое он строит.

Чтобы удалить одну или обе рекурсии, вы должны ответить на вопрос «как я могу написать один запрос, который возвращает все данные в рекурсивной структуре, не требующей выравнивания?»В качестве альтернативы, вы можете отказаться от идеи сплюснутого списка и получить данные для каждой ветви (и каждой ветви каждой ветви) в отдельных запросах.Я подозреваю, что его подход намного быстрее.

Короче говоря, вы не правы и не ошибаетесь.«Правильный» подход - это тот, который наилучшим образом удовлетворяет функциональным и нефункциональным требованиям вашего программного обеспечения (для некоторого определения «лучший»), каким бы он ни был.При принятии такого рода решений всегда участвуют компромиссы.Чтобы получить желаемую скорость, вам, возможно, придется пожертвовать некоторой читабельностью, краткостью и удобством сопровождения кода.Вот как это работает.

...