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