Антипаттерн: как не надо генерировать новые идентификаторы | OTUS
⚡ Подписка на курсы OTUS!
Интенсивная прокачка навыков для IT-специалистов!
Подробнее

Курсы

Программирование
Python Developer. Professional
-3%
Разработчик на Spring Framework
-5%
iOS Developer. Professional
-8%
Golang Developer. Professional
-6%
Базы данных
-12%
Agile Project Manager
-5%
Android Developer. Professional
-11%
Microservice Architecture
-5%
C++ Developer. Professional
-5%
Highload Architect
-6%
JavaScript Developer. Basic
-8%
Backend-разработчик на PHP
-9%
Архитектура и шаблоны проектирования C# Developer. Professional
-9%
Team Lead
-6%
Kotlin Backend Developer
-9%
Разработчик программных роботов (RPA) на базе UiPath и PIX Unity Game Developer. Basic Разработчик голосовых ассистентов и чат-ботов Node.js Developer Интенсив «Оптимизация в Java» Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes iOS Developer. Basic Супер-интенсив «СУБД в высоконагруженных системах» Супер-интенсив "Tarantool"
Инфраструктура
DevOps практики и инструменты
-12%
Базы данных
-12%
Network engineer. Basic
-10%
Network engineer
-4%
Инфраструктурная платформа на основе Kubernetes
-6%
Экспресс-курс по управлению миграциями (DBVC)
-10%
Мониторинг и логирование: Zabbix, Prometheus, ELK
-10%
Administrator Linux. Professional
-6%
Разработчик IoT
-13%
Основы Windows Server Cloud Solution Architecture Разработчик голосовых ассистентов и чат-ботов VOIP инженер Супер-практикум по работе с протоколом BGP NoSQL Супер-практикум по использованию и настройке GIT Супер-интенсив «СУБД в высоконагруженных системах» Экспресс-курс «IaC Ansible»
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

Антипаттерн: как не надо генерировать новые идентификаторы

SUBD_Deep_7.5_site-5020-482cec.png

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

Не буду описывать весь спектр вариантов. Однако худшее, что можно придумать —сделать view, в котором будут объединены все эти таблицы, а потом при генерации нового идентификатора делать выборку вида:

SELECT MAX(id)
FROM view

Затем, например, прибавлять к полученному результату 1 или ваш шаг изменения номера.

К каким проблемам может привести такая, на первый взгляд, простая, а значит, возможно, и наиболее эффективная идея?

Смотрите, как только ваше приложение дорастёт до небольшой конкуретности запросов на вставку, для которых нужно будет генерировать новые идентификаторы, вы увидите неприятные последствия своего решения: 1) у вас могут возникнуть дубликаты идентификатора; 2) если вы сделали защиту от дубликатов, могут возникнуть ошибки при попытке вставить одинаковый идентификатор.

Какие есть варианты?

Для генерации сквозного идентификатора лучшим выбором будет использование последовательности. Во многих СУБД (например, PostgreSQL, Oracle, MS SQL) для этого предусмотрен отдельный объект. Работа с такими объектами поддерживается на уровне СУБД и существуют специальные средства получения нового элемента, так что вы будете надёжно защищены от ситуации, когда параллельные запросы, вдруг, получают одинаковый следующий идентификатор.

Узнать больше можете на наших курсах по СУБД. Набор в группу уже начался, не пропустите!

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться