Есть несколько подходов вы могли бы взять с собой, создав таблицу ...
Можно было бы удалить автоматическое приращение и добавить собственное значение для записи.
Профи: У вас есть полный контроль над идентификатором, который вы собираетесь вставить.
Против: Параллелизм будет проблемой в том, что другой процесс мог бы уже записать идентификатор, который вы собираетесь написать. Кроме того, вам все равно придется держать где-нибудь работающий счетчик или анализировать существующие идентификаторы записей.
Другим подходом является создание дополнительного поля идентификатора на вашей таблице, которое можно заполнить на основе комбинированных значений, которые вы хотите.
Пункты: База данных обрабатывает дополнительные поля для идентификации. Против: Вам нужно будет сделать несколько звонков в базу данных, чтобы вставить новую запись. Предполагая, что дефид и batchid не находятся в таблице (поэтому вы не можете использовать триггер), вам нужно будет вставить, получить идентификатор, а затем запустить инструкцию обновления для заполнения поля нового идентификатора.
Конечно, вы всегда можете иметь отделы и партии в отдельных таблицах с внешними ключами в таблице ваших учеников. Данные по-прежнему сохраняются, и вы можете использовать объединения для отчетов или того, что вам нужно, а не для разбора полей идентификатора.
Что касается того, где этот код принадлежит ..., который зависит от архитектуры вашего приложения. Если у вас есть хороший репозиторий, вы можете инкапсулировать эту логику в свою функцию вставки/создания. Если нет, то я боюсь, что контроллер, вероятно, там, где вам придется придерживаться этой логики, которая будет немного грязной.
Надеюсь, это поможет и удачи!
Использование случайного числа для генерации ключа для объекта будет работать в течение короткого времени, но создаст столкновения с большей частотой по мере роста таблицы. Наверное, это не лучшее решение. – ohiodoug
вот что я тоже думал @ohiodoug –