@mcakaneo
Я люблю пиццу

Как не превысить максимально допустимое количество Photos в таблице базы данных с одинаковым albumID?

Извиняюсь за плохо переданную "суть вопроса".
Есть сущности Альбом и Фото.
Фото хранятся не в коллекции альбома, а отдельно. Фото содержит id альбома(albumID), это единственная связь между альбомом и фотографиями.
Есть задача: не превысить число фотографий в альбоме. То есть нужно следить за тем, чтобы фотографий, у которых, например, albumID === 123, в базе данных не перевалило за сотню. А такой исход возможен при таком сценарии: в альбоме уже 99 фото, паралельно выполняются 2 запроса на добавление фото в этот альбом. Сначала первый процесс смотрит, что количество фотографий равно 99 и создаёт новое Фото. Затем второй процесс смотрит, что количество фотографий всё ещё равно 99(первый процесс еще не сохранил фото) и также создаёт новое Фото, затем процессы по очереди сохраняют созданные фото в БД и получается, что в альбоме уже 101 фотография.
(Стоит заметить, что я хочу, чтобы в данном use case создавалось фото, но не происходили изменения в альбоме, то есть Album::photosCount инкрементиться не будет).
Здесь не помогут оптимистическая и пессимистическая блокировки, потому что ничего не изменяется, только создаётся. Может помочь запрет на чтение количества фотографий, чтобы второй процесс ждал пока первый процесс не закончится, чтобы он смог прочитать обновленное количество фото, но не знаю правильно ли это. Или каким-то образом сделать ограничение в базе данных, чтобы небыло больше 100 одинаковых значений в колонке "albumID" в таблице с фотографиями.
Я не нашёл решения в интернете, наверное, потому что в основном все используют коллекции и lazy load, в таком случае очень легко соблюдать инварианты. Но для больших проектов такой подход не уместен(вроде бы) из-за проблем связанных с увеличением количества записей и масштабированием. Естественно мне это сейчас не нужно, просто хочу знать оптимальное решение.
  • Вопрос задан
  • 94 просмотра
Пригласить эксперта
Ответы на вопрос 2
inoise
@inoise
Solution Architect, AWS Certified, Serverless
Это делается с помощью бизнес-логики приложения. Решение на уровне базы данных тут не подойдёт
Ответ написан
tsklab
@tsklab
Здесь отвечаю на вопросы.
Как не превысить максимально допустимое количество 100
Не записывать 101-ую. Например, составной уникальный ключ: код альбома, номер. Нумеровать последовательно. Если одновременно добавляется, то кто первый завершит транзакцию, того и тапки — другому ошибка.

Но не всё так просто
Поиск отсутствующего значения.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы