2010-09-02 3 views
7

Мне было интересно в последнее время. Допустим, мы делаем webapp с JSF + Spring + JPA/Hibernate (или хорошо какие-либо другие технологии), и мы можем сказать, что у нас есть «пользовательская» сущность. Мы хотим, чтобы у Пользователя был уникальный логин. Если мы хотим это сделать, мы можем поместить @UniqueConstraint в столбец «Вход», но все же наше приложение должно проверить во время регистрации пользователя, является ли вход пользователя действительным (уникальным) или нет, без этого и только с ограничением DB мы просто получим ошибку. Это заставило меня подумать, нужны ли DB-ограничения действительно/полезны? Единственное, что я могу придумать, когда они дадут нам какие-либо преимущества, - это когда кто-то пытается взломать нас (но я думаю, что наше приложение должно быть доказательством SQL-инъекции в любом случае) или мы пытаемся вручную изменить содержимое базы данных (что не должно действительно произойдет). На самом деле теперь, когда я думаю об этом, существуют ли ограничения DB в целом необходимые/хорошие практики? Как и длина строки и т.д.Нужны ли уникальные ограничения для БД?

+0

Неужели кто-то действительно думает, что когда-либо можно оставить один вектор атаки широко открытым в предположении, что атака должна пройти через отдельный вектор 1-го? Или кто-то написал это, чтобы быть провокационным и стимулировать обсуждение? – bbadour

ответ

8

Для меня, категорически да, см Database as a Fotress Дэн Chak из 97 Думает Каждый архитектор программного обеспечения должен знать. Он говорит это намного лучше, чем мог.

+0

Действительно понравилась ссылка, спасибо! –

+0

Книги очень хорошие, хотя все эссе в ней - * с открытым исходным кодом *, поэтому вы можете прочитать их на этой вики бесплатно –

4

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

Вы можете изменять содержимое БД вручную (то есть обновление до новой версии)

Вы можете забыть проверить некоторые ограничивают в вашем коде.

Вы можете посмотреть на это, как на проверку клиента/сервера. Ваша программа - клиент, db - сервер. Чаще всего проверка клиента достаточно, но вы должны иметь проверку сервера на случай, если что-то пойдет не так.

3

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

Правда в том, что приложения среднего уровня приходят и уходят, но данные живут вечно.

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

1

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

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

0

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

1

Если вы хотите иметь плохие данные, тогда снимите уникальные ограничения в базе данных. Я работаю над базами данных с 1970-х годов и запросил или импортировал данные, хранящиеся в сотнях баз данных. Я никогда не видел хороших данных в базах данных, где ограничения были неправильно установлены на уровне приложения. Многие вещи, кроме приложения, попадают в базу данных (импорт из других систем, быстрое обновление данных prod для исправления проблемы с данными, которая запускается из окна запроса, других приложений и т. Д.). Много раз приложение заменяется и ограничения теряются.

0

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

Это самая забавная вещь, которую я когда-либо читал. Вы просто получаете сообщение об ошибке? Это действительно все, что вам нужно? Вы когда-нибудь слышали об улавливании ошибок? Попробуйте Catch ring any bells?

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

+0

Ну, мне нужно будет узнать больше об этом, так как я использую настраиваемый обработчик исключений JSF, который перенаправляет меня к странице_not_found.jsf каждый раз, когда он ловит исключение, и поскольку ConstraintViolationException является подслоем Exception, он также будет пойман и перенаправлен на страницу. Не совсем уверен, что мои пользователи будут довольны этим. –

+0

Опираясь на брошенные ошибки из базы данных, как правило, вы получаете одну ошибку за раз, что приводит к ужасному пользователю. Если вы проверите все свои проблемы спереди, вы можете сразу отобразить их пользователям. – Shlomo

0

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

Смежные вопросы