Следует ли проверять уникальные поля на уровне базы данных?

Я пишу довольно большое веб-приложение для моего проекта BSc и пишу его на PHP с помощью MySQL.

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

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

Это правильный способ приблизиться к валидации?

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

Тебе нужны оба. И в целом уникальные ограничения не должны быть единственными, которые заботятся о вашей базе данных. Рекомендуется также использовать ограничения внешнего ключа и, если применимо, более сложные проверки данных (пользовательские ограничения). Однако, поскольку вы используете MySQL, не многие из них действительно доступны для вас

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

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

Если два запроса выполняются параллельно, оба могут принимать один и тот же адрес электронной почты, и у вас есть 2 пользователя с одинаковым адресом электронной почты.

Кроме того, возможно, вы сделаете фильтрацию поиска в базе данных, поэтому в MySQL вы хотите иметь индекс по электронной почте. Итак, тогда нет большой разницы в том, что эта колонка уникальна.

Да, база данных должна проверять правильность данных. База данных хранит данные независимо от того, как они туда попали. Иногда возможно, вы будете работать с базой данных из другого приложения, и это приложение также должно проверять данные. Более безопасно проверять правильность данных как в приложении (интерфейс и бэкэнд), так и на уровне базы данных.

Часто это случай разработки кода. Это пример Дэйкстры «Разделение проблем» .

Учитывая, что создание полей Unique означает, что вы:

Don't need to write validation code, ergo ultimately you write less code

The validation for values in the database, is in a logical place; bound to the database!

Это вопрос моделирования данных. Просто задайте себе вопрос: «Где это имеет смысл для этого кода?». По-моему, использование уникального значения в базе данных – правильный путь. Он абстрагирует валидацию от вашего PHP-кода и означает, что вы можете изменить его, не изменяя ни одну из ваших основных логических моделей.

Валидация должна выполняться на стороне клиента (например, javascript), поскольку она, как правило, дает лучший пользовательский интерфейс. Он должен использоваться serveride, потому что клиентская сторона может быть обойдена. И должен быть применен в базе данных, потому что любое ограничение, которое не применяется в базе данных, не является ограничением … это всего лишь предложение.

Создание ограничений UNIQUE в поле для адресов электронной почты является наилучшим подходом из-за высокой избирательности, но не забудьте также установить поле NOT NULL ,

Я считаю, что использование ограничений будет намного лучше, но вы также можете сделать это через запрос, например:

 SELECT COUNT(*) FROM table WHERE email = '$email' 

Подробнее об этой теме: индексы mysql 5.0 – уникальные и не уникальные

И вот однажды вы решите переключиться с MySQL на другую базу данных, и все ваши «проверки» больше не существуют (например, для перехода на базу данных, например, MongoDB).

Пожалуйста, не делайте этого – делайте это на уровне приложения. Это просто, контролируется версиями, проверяемо и т. Д.

Во что бы то ни стало – создайте свой уникальный индекс в MySQL, но я бы не стал полагаться только на него.