Почему отрицательный идентификатор или ноль считается плохой практикой?

Почему отрицательный идентификатор или ноль считается плохой практикой при вставке первичного ключа в таблицу базы данных?

Я думаю, что это может быть полезно в некоторых случаях, но люди говорят, что это не рекомендуется, несмотря на то, что они никогда не говорят / не знают почему.

Итак, мне было интересно, есть ли, по определению, какое-то ограничение, или у него не должно быть никаких проблем, или это просто соглашение, и если на самом деле есть какое-то ограничение по этому поводу, почему эта функция не блокируется?

3 ответа

Решение

Для ясности, этот вопрос и ответ касаются использования отрицательных чисел для суррогатных ключей, а не для натуральных ключей.

Насколько я знаю, есть три причины считать это плохой практикой.

  1. Это нарушает принцип наименьшего удивления.
  2. Некоторые люди считают, что все идентификационные номера неотрицательны.
  3. Некоторые люди используют отрицательные числа для обозначения ошибок.

Первый имеет какое-то значение для этого. Вы никогда не увидите примеров SQL или ответов на SO, которые используют отрицательные идентификационные номера. (Я собираюсь изменить это, начиная с сегодняшнего дня.)

Второе и третье являются следствиями первого, в котором программисты часто принимают поведение без сюрпризов. (Это напоминает мне, что я обнаружил, что VBA позволит мне умножить две даты, возвращая число, которое, я думаю, будет выражаться в квадратных датах.)

Для номера 2 программисты приложений могут вносить незначительные ошибки, не оставляя места для входа в код пользовательского интерфейса, что может привести к тому, что -123456 будет выглядеть как 123456.

Третий связан с написанием кода, который возвращает идентификационные номера. Код, который возвращает один идентификатор, может возвращать -1 как код ошибки. Но -1 является действительным идентификационным номером в большинстве случаев. (Большинство баз данных не ограничивают номера идентификаторов диапазоном неотрицательных целых чисел.)

Ответ @Mike Sherrill 'Cat Recall' ИМХО неверен.

Отрицательные значения: причина не использовать отрицательные значения для идентификаторов в том, что отрицательные числа не переносимы. Двоичное представление десятичного значения зависит от базовой числовой архитектуры, и это влияет на способ представления отрицательного десятичного значения в неотрицательном потоковом формате (например, hex, base36 и т. Д.). Точно так же нельзя использовать значения с плавающей запятой в качестве идентификаторов, хотя в рамках ограничений одной архитектуры это теоретически возможно.

Ноль: ноль может служить идентификатором. Это не рекомендуется, потому что это часто обозначает пустое поле / значение NULL.

Существует более 51 миллиона сайтов, обсуждающих эту проблему.

Я согласен с @Mike Sherrill, и вполне вероятно, что NULL / пустые поля или отрицательные идентификаторы создают серьезные проблемы при определении истинных значений. Он не служит никакой информационной цели и может привести только к неправильным ответам и недоверию к самой базе данных.

Допуская нулевые значения, отрицательные значения в ваших столбцах привносят совершенно новую степень неопределенности в вашу базу данных. Предположения должны быть сделаны программистом SQL для подсчета ошибочных результатов значений NULL в базе данных.

Другие вопросы по тегам