Почему отрицательный идентификатор или ноль считается плохой практикой? - PullRequest
20 голосов
/ 19 января 2012

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

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

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

Ответы [ 3 ]

26 голосов
/ 21 января 2012

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

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

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

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

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

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

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

9 голосов
/ 29 декабря 2015

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

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

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

0 голосов
/ 29 декабря 2015

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

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

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

...