Плюсы и минусы: отлов ошибок базы данных и проверка ввода пользователя - PullRequest
0 голосов
/ 07 декабря 2011

У меня есть приложение с базой данных, которая имеет много внешних ключей.

Большая часть вставляемых данных поступает от пользователей.

Мне просто интересно: это лучше?выполнить проверку пользовательского ввода перед вставкой или вставкой и просто написать код перехвата ошибок?

Есть ли преимущества в производительности / стилистике / безопасности?и то и другое, но выполнение проверки раньше кажется более безопасным вариантом, если был выполнен только один из двух.

Ответы [ 3 ]

4 голосов
/ 07 декабря 2011

Это блестящий вопрос - и, на мой взгляд, одно из преимуществ использования объектно-реляционного картографа.

Как правило, реляционные инструменты, предоставляемые вашей базой данных, предназначены для защиты достоверности данных - у «клиента» должны быть отношения «менеджер аккаунта», «имя_пользователя» не может быть нулевым, «идентификатор_пользователя» должно быть уникальным и т. Д.

Эти инструменты необходимы, но не достаточны для проверки данных, вводимых пользователями в базу данных.

Ваш код переднего / среднего уровня имеет свои собственные правила, которые обычно не выражаются в реляционных терминах;в большинстве современных языков разработки речь идет об объектах и ​​отношениях между объектами или их атрибутами - например, номер телефона должен содержать цифры, а имя должно начинаться с заглавной буквы.

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

В этом случае моя предпочтительная архитектура:

  • Проверяйте как можно раньше - в JavaScript для веб-приложений или в коде GUI для настольных приложений.Это уменьшает количество циклов и, таким образом, создает более отзывчивый пользовательский опыт.
  • Пусть каждый уровень реализует проверку для своей логики домена ключа - ваши классы должны проверить свои ожидания, ваша база данных должна проверить внешние ключи и обнуляемость.
  • Не полагайтесь на "более высокие" уровни дляподтвердить - вы не можете предсказать, как ваш код будет использоваться в будущем;класс, который вы написали для одного приложения, может быть повторно использован другим.
  • Разработайте способ синхронизации правил валидации между уровнями - с помощью технологии или процесса.
0 голосов
/ 07 декабря 2011

Независимо от того, что вам нужно ловить ошибки.Кто знает, что будет?Тайм-аут SQL?Никакая проверка данных не поможет в решении подобных проблем.

Как и большинство проблем, их дешевле всего обнаружить рано;не позволяйте пользователям вводить неверные данные / проверять данные перед отправкой на сервер.Не бизнес-логика как таковая, но даты не содержат буквенных символов и т. Д.

На промежуточном уровне я все равно проверю входные данные.Другой разработчик может назвать вашу бизнес-логику без проверки входных данных.Я предпочитаю свою бизнес-логику в этой области, потому что ее легче писать и отлаживать, чем создавать логику в хранимых процедурах.

В базе данных я предпочитаю ограничения, когда правила являются абсолютными, например, если у вас нет внутреннего пользователябез идентификатора пользователя;причина в том, что другие разработчики не должны писать сценарии, которые будут делать то, что не должно быть разрешено.

0 голосов
/ 07 декабря 2011

Не думаю, что это должен быть вопрос, о котором.Я всегда делаю оба, как вы предложили.Что касается плюсов и минусов, я скажу, что я считаю, что легче находить проблемы с пользовательским вводом и обрабатывать их в удобной для пользователя форме в начале жизненного цикла, а не ждать, пока база данных не выдаст ошибку.Однако, если ваша проверка не улавливает все или если есть ошибка базы данных, не связанная с пользовательским вводом, все равно важно отловить ошибку в какой-то момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...