Почему отрицательный id или ноль считается плохой практикой?
почему отрицательный id или ноль считается плохой практикой при вставке первичного ключа в таблицу базы данных?
Я думаю, что это может быть полезно в некоторых случаях, но люди говорят, что не рекомендуется, несмотря на то, что они никогда не говорят/знают почему.
Итак, мне было интересно, есть ли, по определению, какое-то ограничение или если у него не должно быть никаких проблем или если это просто соглашение, и если действительно есть какое-то ограничение об этом, почему это не так функция заблокирована?
3 ответов
чтобы быть ясным, этот вопрос и ответ касаются использования отрицательных чисел для суррогатных ключей, а не для естественных ключей.
насколько я знаю, есть три причины считать это плохой практикой.
- это нарушает принцип наименьшего сюрприза.
- некоторые люди предполагают, что все идентификационные номера неотрицательны.
- некоторые люди используют отрицательные числа указывают на ошибки.
первый имеет некоторые в этом есть смысл. Вы никогда не видите примеры SQL или ответы на так, чтобы использовать отрицательные идентификационные номера. (Я собираюсь изменить это, начиная с сегодняшнего дня.)
второй и третий являются следствиями первого, в том, что программисты часто предполагают неожиданное поведение. (Это напоминает мне открытие, что VBA позволит мне умножить две даты, возвращая число, которое будет выражено, я думаю, в квадратных датах.)
для номера 2 программисты приложений могут вводить тонкие ошибки, не разрешение места для входа в код пользовательского интерфейса, который может сделать -123456 похожим на 123456.
третий связан с написанием кода, который возвращает идентификационные номера. Код, возвращающий один id-номер, может возвращать -1 в качестве кода ошибки. Но в большинстве случаев -1 является допустимым ID-номером. (Большинство баз данных не ограничивают id-номера диапазоном неотрицательных целых чисел.)
ответ @Mike Sherrill 'Cat Recall' является IMHO неправильным.
негативы: причина не использовать негативы для идентификаторов заключается в том, что отрицательные числа не переносятся. Двоичное представление десятичного значения зависит от базовой числовой архитектуры, и это влияет на то, как отрицательное десятичное значение будет представлено в неотрицательном потоковом формате (например, hex, base36 и т. д.). Аналогично, в качестве идентификаторов не используются значения с плавающей запятой, хотя в ограничения единой архитектуры теоретически возможны.
ноль: ноль может служить идентификатором. Это не рекомендуется, хотя, потому что он часто обозначает пустое поле / нулевое значение.
существует более 51 миллиона сайтов, обсуждающих эту проблему.
Я согласен с @Mike Sherrill, и, вероятно, распространено, что нули/пустые поля или отрицательные идентификаторы создают серьезные проблемы при определении истинных значений. Он не служит никакой информационной цели и может привести только к неправильным ответам и недоверию к самой базе данных.
разрешение нулевых значений, отрицательных значений в ваших столбцах вводит совершенно новую степень неопределенности в вашу базу данных. предположения должны быть сделаны программистом SQL для счетчика ошибочных результатов нулевых значений в базе данных.