У меня есть 2 таблички (условно. На самом деле гораздо больше и логика уже есть - но я думаю, она неправильная):
course, module
И связь course —> OneToMany —> module
У сущности модуля есть поле порядка order (то, каким оно отображается на экране), которое начинается с 1, при создании нового объекта назначается МАКС+1, а при удалении кого-то, все порядки выше должны сместиться на единицу вниз.
Задача:
Пусть есть курс с айди 1, в котором хранятся модули (1, 2, 3, 4) с такими же порядками.
я получаю запрос из серии
{
moduleId: 2,
newOrder: 3
}
И тогда у модуля 2 порядок станет 3 - а у модуля 3 он соответственно станет на единичку ниже, то есть 2.
Или, если такой запрос:
{
moduleId: 2,
newOrder: 4
}
То у модуля 2 порядок станет 4, а у 3 и 4 модулей соответственно 2 и 3.
Вопрос в логическое реализации: как это сделать, чтобы
а) это было экономично по запросам
б) оптимизировано
в) избегать ошибок гонки запросов (если одновременно, например, был создан новый модуль) (например селект фор апдейт в транзакции)
г) и как следует поступить, если в курсе могут храниться не только модули, но и тесты, например? Текущая наша реализации имеет 2 отношения один ко многим к табличкам модуля и теста - но тогда происходит смешения порядков, и это немножко неудобно обрабатывать. Плюс порядки с текущей реализацией уже слетали, появлялись объекты с одинаковыми порядками. Есть вариант создать единый объект внутренности курса - и у него сделать поле type означающее тип объекта.
Если есть какой-то паттерн или маст хэв для этого - то я буду супер благодарен, если еще его скажете. Если удобно будет кодом - пишите кодом, я пойму; если удобно словами - словами.