Для ясности, этот вопрос и ответ касаются использования отрицательных чисел для суррогатных ключей, а не для натуральных ключей.
Насколько я знаю, есть три причины считать это плохой практикой.
- Это нарушает принцип наименьшего удивления .
- Некоторые люди считают, что все идентификационные номера неотрицательны.
- Некоторые люди используют отрицательные числа для обозначения ошибок.
Первый имеет какое-то значение для этого. Вы никогда не увидите примеров SQL или ответов на SO, которые используют отрицательные идентификационные номера. (Я собираюсь изменить это, начиная с сегодняшнего дня.)
Второе и третье являются следствиями первого, в котором программисты часто принимают поведение без сюрпризов. (Это напоминает мне, что я обнаружил, что VBA позволит мне умножить две даты, возвращая число, которое, я думаю, будет выражаться в квадратных датах.)
Для номера 2 программисты приложений могут вносить незначительные ошибки, не допуская места для входа в код пользовательского интерфейса, что может привести к -123456, похожему на 123456.
Третий связан с написанием кода, который возвращает идентификационные номера. Код, который возвращает один идентификатор, может возвращать -1 как код ошибки. Но -1 является действительным идентификационным номером в большинстве случаев. (Большинство баз данных не ограничивают число идентификаторов диапазоном неотрицательных целых чисел.)