Во время одного из последних уроков в университете (я студент), лектор попросил нас разработать базу данных (MySQL Server, если это имеет значение) и крошечное клиентское приложение, которое будет использовать базу данных в качестве источника данных.
Одним из требований было то, что столбец идентификаторов (который является PK в каждой таблице) должен быть последовательным, потому что это хорошая практика (согласно словам лектора). То есть, когда строка таблицы удаляется, ее PK необходимо повторно использовать в последующих вставках. У меня есть средние знания в RDBMS, PK и столбцы идентичности. Из того, что я понимаю, этот столбец идентификаторов - это просто способ позволить БД автоматически генерировать PK при вставке строк и ничего более. И значение столбца идентичности никоим образом не должно быть связано с атрибутами строки (если это не естественный ключ).
Это требование (строго последовательная идентификационная колонка) было для меня подозрительным. Я попытался спросить лектора, что не так, если идентификация не последовательная (с пробелами, вызванными удалениями), но получила очень абстрактный ответ, такой как «это удобно для пользователей и полезно для администраторов БД, которые поддерживают базу данных». Никаких конкретных примеров. Аргумент «удобно для пользователей» звучит глупо, потому что он не имеет никакого значения в бизнес-сфере.
Поэтому мне любопытно, реальны ли эти причины? Я могу думать только об одном случае, когда требуется повторное заполнение столбца идентификаторов - когда пространство идентификаторов исчерпано. Но это более сложная проблема, когда тип столбца идентификаторов был выбран неправильно, например, просто int
вместо bigint
или uniqueidentifier
когда таблица содержит миллиард строк. Предположим, столбец идентификаторов является кластеризованным индексом: могут ли пробелы в столбце идентификаторов влиять на производительность индекса? Может быть, существуют другие реальные причины автоматического повторного заполнения столбца идентификаторов после каждого удаления, о котором я не знаю?
Заранее спасибо!