Мы работаем над веб-приложением, пока недоступным для пользователей. Мой начальник заметил, что вновь созданные записи получают идентификатор более 10 000, даже если в таблице всего менее 100 записей. Она предположила, что веб-интерфейс по какой-то причине создает в 100 раз больше временных записей, чем фактические (и удаляет их), и это может привести к исчерпанию диапазона в течение нескольких месяцев после выпуска.
Я не думаю, что она права относительно причины инфляции ID (коллега, который может ответить на это, находится в отпуске, поэтому мы не знаем наверняка), но давайте предположим, что это так. Она сказала, что не хотела бы использовать столбец bigint и хотела бы, чтобы мы прекратили автоинкрементирование столбца ID и писали код на стороне сервера, который выбирает первое «неиспользуемое» целое число и использует его в качестве идентификатора.
Я аспирант по информатике с небольшим практическим опытом, занимающий младшую должность разработчика. Она имеет многолетний опыт управления всеми базами данных нашей организации и разработки большинства из них. Я думаю, что она неверна в этом случае, что bigint ID нечего бояться, и что имитация функциональности СУБД пахнет антипаттерном. Но я пока не доверяю своему суждению.
Каковы аргументы за и против каждой позиции? Какие плохие вещи могут случиться, если мы используем bigint, и каковы опасности переосмысления функции автоинкрементации колеса ? Есть ли третье решение, которое лучше, чем одно? Каковы могут быть ее причины для того, чтобы избежать инфляции по номиналу? Мне также интересно услышать о прагматических причинах - может быть, идентификаторы bigint работают в теории, но на практике вызывают головные боли?
Приложение не должно обрабатывать очень большие объемы данных. Я сомневаюсь, что он достигнет 10 000 реальных записей в течение следующих нескольких лет.
Если это имеет какое-то значение, мы используем сервер Microsoft SQL. Приложение написано на C # и использует Linq to SQL.
Обновить
Спасибо, я нашел существующие ответы и комментарии интересными. Но я боюсь, что вы неправильно поняли мой вопрос, поэтому они содержат то, что я хотел знать.
Меня не очень беспокоит реальная причина высоких идентификаторов. Если мы не сможем найти его самостоятельно, я мог бы задать другой вопрос. Что меня интересует, так это понять процесс принятия решений в этом случае. Для этого, пожалуйста, предположите, что приложение будет писать 1000 записей в день, а затем удалит 9999 из них . Я почти уверен, что это не так, но это то, во что верил мой босс, когда она сделала свой запрос. Итак, в этих гипотетических обстоятельствах, каковы будут плюсы и минусы использования bigint или написания нашего собственного кода, который будет присваивать идентификаторы (таким образом, чтобы повторно использовать идентификаторы уже удаленных записей, чтобы гарантировать отсутствие пробелов)?
Что касается фактической причины, я сильно подозреваю, что это потому, что мы когда-то писали код для импорта данных из другой базы данных, в качестве доказательства концепции, что более поздняя миграция может быть выполнена в определенной степени. Я думаю, что мой коллега на самом деле создал несколько тысяч записей во время импорта, а затем удалил их. Я должен подтвердить, так ли это на самом деле, но если это так, то даже не нужно предпринимать какие-либо действия.