Уникальное ключевое ограничение
Каков наилучший способ обработки вставки / обновления данных в таблицу с уникальными ключевыми ограничениями на уровне приложения? Вот что я придумал:
1. Запустите запрос к таблице перед вставкой данных, чтобы посмотреть, не нарушит ли это ограничение.
Pros
- Вы имеете полный контроль, поэтому вам не нужно иметь дело с сообщениями об ошибках, специфичными для СУБД.
- Дополнительный уровень проверки целостности данных
Cons
- Это может привести к снижению производительности, поскольку в большинстве случаев не будет нарушений ограничений.
- Вам нужно будет заблокировать таблицу во время выполнения запроса на дубликаты данных.
2. Ничего не делать. Обновите таблицу и посмотрите, что прилипает.
Pros
- Просто!
- В целом быстрее, так как вам не нужно запускать дополнительный запрос при каждом обновлении таблицы.
Cons
- Ваша процедура проверки зависит от уровня базы данных.
- Если данные не сохраняются, вам нужно пройтись по трассировке стека, чтобы найти причину.
Какое из них является наиболее широко принятым решением? Есть ли альтернативы этим?
Я использую Java, JPA, Hibernate и Spring BTW. Любые предложения, даже специфичные для фреймворка, приветствуются!
Спасибо!
4 ответа
Вы уже подвели итог. Если производительность является проблемой, перейдите на второй путь. Если честность вызывает беспокойство, идите по 1-му пути.
Я лично поддерживаю целостность по производительности. Оборудование довольно дешевое, целостности нет.
Смежные вопросы:
Третий вариант - использовать операцию MERGE (иногда называемую UPSERT), если ваша СУБД поддерживает это. Обычно для СУБД существует особый способ проверки, была ли вставлена строка или нет.
Избегайте тавтологии "уникального" ключа. Ключи уникальны, поэтому слова "ключ" вполне достаточно, чтобы сказать, что вы имеете в виду.
Уникальный ключ обычно является бизнес-требованием, поэтому вы должны использовать бизнес-уровень, чтобы проверить, доступен ли тот, который вы намереваетесь использовать. Передача проверки в базу данных является оптимизацией, которая должна выполняться только при необходимости.
Мне нравится "оптимистический" подход ("ничего не делать"). Вы уже перечислили плюсы. Вы правы, что в этом случае вы делегируете валидацию слою БД. Но если вы используете JPA, слой БД также генерируется Java-слоем, так что фактически ваша проверка зависит от вашей аннотации в Java-коде. Поэтому это не большое преступление.