Позвольте мне проиллюстрировать этот вопрос на упрощенном примере. Предположим, я строю проект с использованием python с реляционной базой данных PostgreSQL. В моей базе данных у меня есть две таблицы "parent" и "child", которые связаны с N по M через таблицу "parent_child". Я хочу иметь возможность получать некоторые данные о конкретном дочернем элементе, принадлежащем конкретному родителю, безопасным способом, что позволяет мне сделать следующий запрос (X, Y и Z - литералы, предоставленные пользователем):
SELECT child.age FROM parent, parent_child, child
WHERE child.id = parent_child.child_id AND parent_child.id = X
AND parent_child.parent_id = parent.id AND parent.id = Y
AND parent.password = Z;
Скажем, пользователь приходит и вводит неправильное значение для X, Y или Z, запрос вернет пустой набор, который может быть обнаружен, и передаст пользователю сообщение об ошибке. Проблема, конечно, в том, что я не могу определить, какое значение вызывает проблемы, и, следовательно, не могу предоставить пользователю конкретную информацию о том, что он неправильно ввел?
Самое простое решение - разбить запрос на несколько частей. Сначала убедитесь, что parent.id существует.
SELECT parent.id FROM parent WHERE parent.id = Y;
Во-вторых, проверка правильности пароля.
SELECT parent.id FROM parent WHERE parent.id = Y and parent.password = Z;
В-третьих, проверка, существует ли ребенок.
SELECT child.id FROM child WHERE child.id = X;
В-четвертых, проверка того, что ребенок принадлежит родителю, и возвращение необходимой нам информации.
SELECT child.age FROM child, parent_child WHERE parent_child.child_id = child.id AND parent_child.parent_id = Y AND parent_child.child_id = X;
Эти четыре запроса позволят нам проверять конкретные сведения о предоставленной пользователем информации и сообщать о конкретных проблемах по мере их возникновения. Очевидно, что в четырех запросах на один запрос возникает много дополнительных затрат, и я считаю, что четыре запроса менее читаемы, чем один. Так есть ли в любом случае лучшее из обоих миров? Отдельный запрос и подробные сообщения об ошибках?