rails nil в базе данных [дубликат]

datePickerDialog.setTitle("");
65
задан 3 revs, 3 users 100% 2 October 2008 в 18:25
поделиться

30 ответов

Лучше всего знать о нормальных формах, так это то, что они являются гидами и проводниками, которых нельзя упрямо придерживаться. Когда мир академических наук сталкивается с реальным миром, вы редко находите много выживших воинов адемии.

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

Как друг любите говорить: «Не позволяйте совершенству быть врагом добра». Подумайте, Вольтер также сказал это. 8) [/ д2]

26
ответ дан 2 revs 20 August 2018 в 06:50
поделиться
  • 1
    Хорошая точка зрения. Я не могу рассчитывать на то, сколько раз мне приходилось сражаться с администраторами баз данных, потому что они хотели пожертвовать работой и взять еще несколько уровней накладных расходов ради драконовской нормализации. – Matias Nino 2 October 2008 в 18:37
  • 2
    «Нормализация драконов» - Вау, я обмотаюсь над этим. – ScottCher 3 October 2008 в 19:13
  • 3
    Можете ли вы подробнее остановиться на «Необязательные отношения, закодированные в внешнем ключе». пожалуйста? – pingu 6 December 2013 в 16:40
  • 4
    Возможно, гипотетический пример может помочь. Существует таблица под названием «Человек». с одной строкой на человека. Первый столбец «id» и используется как первичный ключ. Существует столбец под названием «SpouseId». Когда есть супруг, он содержит внешний ключ, который ссылается на Person.id супруга. Когда нет супруга, он содержит NULL. – Walter Mitty 6 December 2013 в 17:22
  • 5
    Спасибо за быстрое разъяснение! Могу ли я сделать тонкую корректировку вашего примера, чтобы убедиться, что это будет действительное использование NULL? Персональный стол с окном. Действительным занятием может быть «Priest». или "Nun" так что для них SpouseId всегда будет NULL. Короче говоря, все еще допустимо использовать NULL, если не все записи имеют потенциальное значение не NULL? – pingu 6 December 2013 в 18:23
  • 6
    Ваше дело выходит за рамки первоначального вопроса. Возможно, вам захочется исследовать «четвертую нормальную форму». – Walter Mitty 7 December 2013 в 18:50
  • 7
    Ошибки и неожиданности неизбежны в программировании. По моему опыту, строгое исключение NULL приводит к гораздо более сложным проектам баз данных со многими другими таблицами. Разрешение NULL при необходимости является сравнительно менее сложным и подверженным ошибкам. – Sam Watkins 17 January 2017 в 08:43

Нулевые маркеры в порядке. Действительно, они есть.

36
ответ дан 2 revs, 2 users 67% 20 August 2018 в 06:50
поделиться
  • 1
    технически в СУБД-говорить, null - это не значение; это отсутствие ценности, например. неизвестный – Matt Rogish 2 October 2008 в 18:03
  • 2
    Исправлена. Быстрая поездка в Википедию указывает, что NULL является «маркером». а не значение. – Patrick McElhaney 2 October 2008 в 18:07
  • 3
    Нулевые маркеры тоже прекрасны. :) – Ken Wootton 2 October 2008 в 18:51
  • 4
    как и большинство функций чего-либо, нули прекрасны, только если вы знаете, как их использовать. Помните, что для каждой строки * требуется один бит памяти для каждого столбца, который разрешает NULL. – dvb 25 December 2010 в 21:27
  • 5
    Без объяснения, этот ответ может стать бесполезным, если кто-то другой выскажет противоположное мнение. Например, если кто-то отправляет заявку, например, & quot; Нулевые маркеры не в порядке. Действительно, это не так. & Quot; , как бы этот ответ помог читателю выбрать два противоположных мнения? Рассмотрим edit , чтобы лучше соответствовать Как отвечать на рекомендации – gnat 22 June 2015 в 17:04

Это огромная банка червей, потому что NULL может означать так много вещей:

  • Нет даты смерти, потому что человек все еще жив.
  • Нет сотового телефона номер, потому что мы не знаем, что это такое или даже если оно существует.
  • Нет номера социального страхования, потому что этот человек знает, что его нет.

Некоторые из их можно избежать путем нормализации, некоторые из них можно избежать из-за наличия значения в этом столбце («N / A»), некоторые из них могут быть смягчены за счет наличия отдельного столбца для объяснения присутствия NULL (" N / K "," N / A "и т. Д.).

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

Из-за прежней причины вы найдете случаи, когда нуль является неизбежным.

Из-за последней причины вы все равно должны сделать все возможное, чтобы свести к минимуму их число.

Несмотря на это, всегда используйте ограничения NOT NULL для защиты от нулей, где требуется значение.

6
ответ дан 2 revs, 2 users 93% 20 August 2018 в 06:50
поделиться
  • 1
    Хороший аргумент для разрешения зарезервированных значений для столбцов вне нормального диапазона столбца. Позволит нам иметь разнообразную самодокументируемую гибкость в дизайне столбцов с такими константами, как перечисления, чтобы представлять «UNKNOWN», «NO DEATH DATE» и т. Д. Без бесконечных ограничений и флагов. – Cade Roux 3 October 2008 в 04:10
  • 2
    NULL означает только одно: «у нас нет этих данных». Если вам требуется более подробное объяснение этого (и это обычно НЕ необходимо), вы можете добавить больше столбцов, чтобы объяснить это. – Sam Watkins 17 January 2017 в 08:45
  • 3
    @SamWatkins Я думаю, что мы имеем в виду & quot; mean & quot; двумя разными способами. – David Aldridge 17 January 2017 в 14:44

Один аргумент против нулей состоит в том, что они не имеют четко определенной интерпретации. Если поле имеет нулевое значение, это можно интерпретировать как любое из следующего:

  • Значение «Nothing» или «Empty set»
  • Нет значения, которое делает
  • Значение еще не введено.
  • Значение представляет собой пустую строку (для баз данных, которые не различать нули и пустые строки).
  • Некоторые значения для конкретного приложения (например, «Если значение равно null, тогда используйте значение по умолчанию».)
  • Ошибка произошло, что привело к тому, что у поля было нулевое значение, если это действительно не так.

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

36
ответ дан 4 revs 20 August 2018 в 06:50
поделиться
  • 1
    Хорошая точка зрения. Это хорошо в настройке уровня на уровне базы данных / приложения, хотя, поскольку приложение позволяет интерпретировать, что означает нуль. Я уверен, что DBA хотели бы иметь это в противном случае. :) – Matias Nino 2 October 2008 в 18:35
  • 2
    Целое число также не имеет четко определенного значения. Но вам нечего мешать добавлять в документацию. – Jonathan Allen 6 October 2008 в 06:18
  • 3
    Другим значением является «К сожалению, мой процесс не смог заполнить поле w / предполагаемое значение». Для полей, которые являются FKs, к набору перечислимых значений, можно добавить представление NULL в эту основную таблицу. С помощью этой технологии вы все же можете разрешить «нет данных». концепции, но быть в курсе – 6eorge Jetson 6 October 2008 в 07:09
  • 4
    +1, потому что это знаменитый аргумент против нулей в схемах базы данных, обнародованный CJ Date (я не обязательно согласен с ним), например. его книга Введение в системы баз данных – MarkJ 11 December 2009 в 02:17
  • 5
    NULL означает, что «у нас нет этого значения». В большинстве случаев нам не нужно ничего знать о том, почему значение не существует, так как нам не нужно знать, кто ввел определенную ценность и когда, и не ожидается ли изменение стоимости в будущем, и не будет значение является определенным или неопределенным. Как разработчик, я бы скорее рассмотрел поля с нулевым значением (когда это необходимо), чем сложность распространения ненужных таблиц. – Sam Watkins 17 January 2017 в 08:31

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

Это попытка убедиться все данные действительны и оценены.

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

-Aamam

65
ответ дан Adam Davis 20 August 2018 в 06:50
поделиться
  • 1
    Вы не можете быть в первой нормальной форме с нулевыми столбцами. Одна ссылка, в которой явно указывается это en.wikipedia.org/wiki/Database_normalization#First_normal_form "Проще говоря, таблица с уникальным ключом и без каких-либо столбцов с нулевым значением находится в 1NF. & Quot; – Adam Davis 6 October 2008 в 18:03
  • 2
    Ссылки: CJ Дата довольно хорошо известна в реляционных базах данных. Он является главным сторонником «нулей, считающихся вредными». например см. здесь dcs.warwick.ac.uk/~hugh/TTM/Missing-info-without-nulls.pdf – MarkJ 11 December 2009 в 02:13
  • 3
    Итак, если у вас есть таблица пользователя и столбец дня рождения, который не является обязательным, а все остальные столбцы, вы создаете таблицу дней рождения? Это звучит глупо. = | – ANeves 14 April 2010 в 11:08
  • 4
    @sr pt - Да, это глупо. Существует баланс между соблюдением хороших стандартов нормализации и здравомыслием при разработке базы данных. На обоих концах есть крайности - база данных может быть слишком нормализована. – Adam Davis 14 April 2010 в 13:50
  • 5
    Мне действительно интересно, когда база данных по нормализации? Реляционный дизайн не может содержать нулевые значения, если разреженный шаблон таблицы исключает null и сохраняет базу данных исключительно реляционной, в чем проблема? Люди упоминают о присоединениях, но я бы бросил вызов этому понятию, так как отношение с двумя кортежами почти не подходит для соединения с базовым столом даже при чрезвычайно высоких нагрузках. Разумеется, воздействие зависит только от производительности проекта? Люди не нормализуют базы данных, потому что в какой-то момент становится сложнее разрабатывать и запрашивать. Хотя усилия должны улучшить это, не нарушая реляционных принципов. – npeterson 9 April 2012 в 20:03

В то время как технические значения NULL в порядке, как значение поля, они довольно часто неодобрились. В зависимости от того, как данные записываются в вашу базу данных, возможно (и обычно) заканчиваться пустым строковым значением в поле, а не NULL. Таким образом, любой запрос, который имеет это поле как часть предложения WHERE, должен будет обрабатывать оба сценария, которые являются ненужными нажатиями клавиш.

2
ответ дан CNote 20 August 2018 в 06:50
поделиться

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

  • Ничто никогда не равно null, и ничто никогда не будет равным, больше или меньше нуля, поэтому вам нужно установить значения NULL для значения-заполнителя, если вы хотите провести какое-либо массовое сравнение.
  • Это также проблема с составными ключами, которые могут использоваться в соединении. Если естественный ключ содержит нулевой столбец, вы можете захотеть использовать синтетический ключ.
  • Нули могут выпадать из подсчетов, что может и не быть семантикой, которую вы желаете.
  • Нули в столбец, с которым вы можете присоединиться, будет исключать строки из внутреннего соединения. В общем, это, вероятно, желаемое поведение, но оно может ловить ловушки слонов для людей, делающих отчетность.

Существует множество других тонкостей для нулей. В SQL для Smarties у Джо Селко есть целая глава по этому вопросу и является хорошей книгой и стоит читать в любом случае. Некоторыми примерами мест, где нули являются хорошим решением, являются:

  • Необязательные отношения, в которых объединенный объект может присутствовать или не присутствовать. Null - единственный способ представить необязательную взаимосвязь в столбце внешнего ключа.
  • Столбцы, которые вы можете использовать для нулевого значения, чтобы исключить счет.
  • Необязательные числовые (например, валютные) значения, которые могут быть или не быть. В числовых системах нет эффективного значения заполнитель для «не записанных» (особенно в тех случаях, когда ноль является юридическим значением), поэтому нуль действительно является единственным хорошим способом сделать это.

Некоторые примеры мест, где вам может понадобиться избегать использования нулей, потому что они могут вызвать тонкие ошибки.

  • Значения «Не записано» в полях кода с FK против справочной таблицы. Используйте значение placeholder, чтобы вы (или какой-либо случайный бизнес-аналитик спустили по треку) не случайно отбрасывали строки из результирующих наборов при выполнении запроса к базе данных.
  • Поля описания, где ничего не было введено, null string ('') отлично подходит для этого. Это экономит необходимость обработки нулей в качестве специального случая.
  • Дополнительные столбцы в системе отчетов или хранилища данных. В этой ситуации сделайте строку-заполнитель для «Not Recorded» в измерении и присоединитесь к этому. Это упрощает запросы и отлично работает с специальными инструментами отчетности.

Опять же, книга Целько - хорошее отношение к этой теме.

5
ответ дан ConcernedOfTunbridgeWells 20 August 2018 в 06:50
поделиться

В базу данных значение null переводится как «У меня нет значения для этого». Это означает, что (интересно), логический столбец, который допускает null, является совершенно приемлемым и появляется во многих схемах базы данных. Напротив, если у вас есть логическое значение в вашем коде, которое может иметь значение «true», «false» или «undefined», вы, скорее всего, увидите, что ваш код рано или поздно завершится: d)

Итак, да, если вам нужно разрешить возможность того, что поле вообще не имеет значения, то допустимость нулей в столбце вполне приемлема. Это значительно лучше, чем потенциальные альтернативы (пустые строки, ноль и т. Д.)

3
ответ дан Dan 20 August 2018 в 06:50
поделиться
  • 1
    Для этого я использовал бы логический объект. – James A. N. Stauffer 2 October 2008 в 18:24
  • 2
    Мод +1 для предупреждения о коде, направленном на ежедневный – user 16 October 2008 в 20:10
  • 3
    Чтобы сделать thedailywtf.com, вам также понадобится значение FileNotFound ;-) – kurosch 24 October 2008 в 23:04

В соответствии с строгой реляционной алгеброй нули не нужны. Однако для любого практического проекта они необходимы.

Во-первых, многие реальные данные неизвестны или неприменимы, а nulls хорошо реализуют это поведение. Во-вторых, они делают взгляды и внешние соединения более практичными.

4
ответ дан Dour High Arch 20 August 2018 в 06:50
поделиться

Существует другая альтернатива использованию «N / A» или «N / K» или пустой строки - отдельная таблица.

Например. если мы можем или не можем знать номер телефона клиента:

CREATE TABLE Customer (ID int PRIMARY KEY, Name varchar(100) NOT NULL, Address varchar(200) NOT NULL);
CREATE TABLE CustomerPhone (ID int PRIMARY KEY, Phone varchar(20) NOT NULL, CONSTRAINT FK_CustomerPhone_Customer FOREIGN KEY (ID) REFERENCES Customer (ID));

Если мы не знаем номер телефона, мы просто не добавляем строку во вторую таблицу.

8
ответ дан finnw 20 August 2018 в 06:50
поделиться

Это абсолютно нормально с нулевым значением.

0
ответ дан HAXEN 20 August 2018 в 06:50
поделиться

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

Во всей простоте определите NULL и придерживайтесь его. Я использую его для обозначения «значение в этом поле пока неизвестно». Это значит, и ТОЛЬКО это. Если вам нужно, чтобы это означало что-то еще AS WELL, вам нужно пересмотреть свою модель данных.

1
ответ дан Jack 20 August 2018 в 06:50
поделиться

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

Или вы можете по умолчанию использовать значения (требуя, чтобы код обрабатывал эти значения по умолчанию). Вы можете предположить, что все строки пустые, а не нулевые, например, в вашей модели.

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

3
ответ дан JeeBee 20 August 2018 в 06:50
поделиться

Нули с ними сложно работать, но они имеют смысл в некоторых случаях.

Предположим, что у вас есть таблица счетов с столбцом «PaidDate», у которого есть значение даты. Что вы помещаете в эту колонку до того, как счет был оплачен (если вы не знаете заранее, когда он будет оплачен)? Это не может быть пустая строка, потому что это неверная дата. Не имеет смысла давать ему произвольную дату (например, 1/1/1900), потому что эта дата просто неверна. Кажется, единственное разумное значение - NULL, потому что оно не имеет значения.

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

Избегайте нулевых значений, если это возможно, но не исключайте их из-за того, что они имеют действительное использование.

3
ответ дан Jim 20 August 2018 в 06:50
поделиться
  • 1
    У меня не было бы таблицы счетов с «PaidDate», столбца, именно из-за проблемы с NULL. Вместо этого у меня был бы «счет-фактура», «кредиторская задолженность» и «дебиторская задолженность». таблицы с внешним ключом, связывающим счета-фактуры с кредиторской задолженностью. Это также решает проблему, когда счет-фактура выплачивается несколькими партиями. – benjismith 6 October 2008 в 07:03
  • 2
    Я был бы доволен NULL PaidDate, не добавляя дополнительных таблиц, если бы бизнес-требования не заслуживали их, но это просто пример. Вот еще один: Столбец Nullable ExpiryDate для страниц в системе управления контентом. Как заметил Джим, добавление произвольной даты не имеет смысла. – Nick 22 April 2009 в 16:25

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

Если что-то «не существует», вы должны использовать NULL вместо пустой строки или другого флага.

16
ответ дан Ken 20 August 2018 в 06:50
поделиться
  • 1
    «Вы должны быть осторожны при установке ключей на нуль .... & quot; Столбец первичного ключа может never быть NULL. Любой столбец, который является частью первичного ключа, никогда не может быть NULL. – Taptronic 2 October 2008 в 18:11
  • 2
    Более или менее поддерживая то, что вы сказали для акцента. ;-) – Taptronic 2 October 2008 в 18:12
  • 3
    & quot; Если что-то "отсутствует" & quot; то вы должны использовать NULL вместо пустой строки или другого флага. & quot; Это повторяется – Bob Probst 2 October 2008 в 18:19
  • 4
    Если что-то отсутствует, в некоторой таблице должна отсутствовать строка. & Quot; NULL, & Quot; не «отсутствует», «NULL», «все». Это повторяется. – Constantin 14 October 2008 в 09:44
  • 5
    Если что-то отсутствует, в некоторой таблице должна отсутствовать строка. & Quot; NULL, & Quot; не «отсутствует», «NULL», «все». Это повторяется. (Повторяется) – simon 4 November 2009 в 16:31

Все сводится к нормализации в сравнении с простотой использования и проблемами производительности.

Если вы собираетесь придерживаться полных правил нормализации, вы закончите писать материал, который выглядит так:

Выберите c.id, c.lastname, ....... от клиента c левым join customerphonenumber cpn на c.id = cpn.customerid left join customeraddress ca на c.id = ca.customerid left join customerphonenumber2 cpn2 на c.id = cpn2.customerid и т. д. и т. д. и т. д.

0
ответ дан Kevin 20 August 2018 в 06:50
поделиться

Лично я считаю, что нули должны использоваться только тогда, когда вы используете это поле в качестве внешнего ключа для другой таблицы, чтобы символизировать, что эта запись не ссылается ни на что в другой таблице. Кроме этого, я считаю, что нулевые значения на самом деле очень сложны при программировании логики приложения. Поскольку нет прямого представления нулевой базы данных в большинстве языков программирования для многих типов данных, это приводит к созданию большого количества кода приложения, чтобы справиться со значением этих нулевых значений. Когда БД встречает нулевое целое число и пытается, например, добавить к нему значение 1 (aka null + 1), база данных вернет значение null, так как именно так определяется логика. Однако, когда язык программирования пытается добавить null и 1, он обычно генерирует исключение. Таким образом, ваш код заканчивается проверкой того, что делать, когда значение равно null, что часто просто приравнивается к преобразованию в 0 для чисел, пустой строке для текста и некоторой нулевой дате (1900/1/1?) Для полей даты .

1
ответ дан Kibbee 20 August 2018 в 06:50
поделиться
  • 1
    мой язык в порядке с нулевыми примитивами :) – TheSoftwareJedi 2 October 2008 в 18:14

Один раз, если вы используете базу данных Oracle. Если вы сохраните пустую строку в столбце типа CHAR, тогда Oracle будет принуждать значение NULL без запроса. Поэтому довольно сложно избежать значений NULL в строковых столбцах в Oracle.

Если вы используете значения NULL, научитесь использовать SQL-команду COALESCE, особенно со строковыми значениями. Затем вы можете запретить использование значений NULL в вашем языке программирования. Например, представьте себе человека, имеющего имя FirstName, MiddleName и FamilyName, но вы хотите вернуть одно поле;

  SELECT FullName = COALESCE(FirstName + ' ', '') + COALESCE(MiddleName+ ' ', '') + COALESCE(FamilyName, '') FROM Person

Если вы не используете COALESCE, если какой-либо столбец содержит значение NULL, вы получаете NULL вернулся.

2
ответ дан Liam Westley 20 August 2018 в 06:50
поделиться

Вместо того, чтобы записывать все проблемы NULL и tristate vs логической логики и т. д. - я предлагаю этот подробный совет:

  1. Не разрешать NULL в ваших столбцах, пока вы обнаружите, что добавляете магическое значение для представления отсутствующих или неполных данных.
  2. Поскольку вы задаете этот вопрос, вы должны быть very осторожны в том, как вы приближаетесь к NULL. Там много неочевидных ловушек. Если вы сомневаетесь, не используйте NULL.
10
ответ дан Mark Brackett 20 August 2018 в 06:50
поделиться

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

В CDM, если объект имеет необязательное поле, вы должны подтипировать объект и создать новый объект, если это поле не является ноль. Это теория в CDMs

В физическом мире мы делаем всевозможные компромиссы для реального мира. В реальном мире NULLS более чем хороши, они существенны

3
ответ дан Mark Brady 20 August 2018 в 06:50
поделиться

Мое мнение спорно в течение дня - по умолчанию позволяет NULLs в столбцах базы данных, вероятно, худшее общепризнанной дизайнерское решение во всех RDBMS земли. Каждый производитель делает это, и это неправильно. NULL отлично подходят для определенных, специфичных, продуманных экземпляров, но идея о том, что вы должны явно запретить NULL для каждого столбца, делает небрежную нулеустойчивость более распространенной, чем она должна быть.

2
ответ дан mattmc3 20 August 2018 в 06:50
поделиться

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

Просто для того, чтобы сказать, как вы можете иметь имя, отчество, фамилию для каждого человека. (Второе имя и Фамилия не являются обязательными, тогда в этом случае вам нужны NULL) и как вы можете иметь Факс, Бизнес-телефон, Офисный телефон для всех в списке блога.

NULLS - это хорошо, и вы должны обращаться с ними должным образом при поиске. В SQL Server 2008 существует концепция разреженных столбцов, в которой вы также можете избежать пространства для NULL.

Не путайте NULL с нулями и любым другим значением. Люди делают это, говорят, что это правильно.

Спасибо Naveen

1
ответ дан naveen 20 August 2018 в 06:50
поделиться

Я согласен со многими ответами выше, а также считаю, что NULL можно использовать, когда это необходимо, в нормализованном дизайне схемы, особенно там, где вы, возможно, захотите избежать использования какого-либо «магического числа» или значения по умолчанию, которое в поворот, может ввести в заблуждение!

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

3
ответ дан RobS 20 August 2018 в 06:50
поделиться

Технически нули являются незаконными в реляционной математике, на которой основана реляционная база данных. Итак, из чисто технической, семантической реляционной модели точки зрения нет, они не в порядке.

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

Я всегда очень осторожен в отношении нулей и стараюсь нормализовать их, когда только могу. Но это не значит, что иногда они не лучший выбор. Но я определенно склоняюсь к стороне «no nulls», если вы действительно не уверены, что с нулями лучше в вашей конкретной базе.

2
ответ дан Scott Alan Miller 20 August 2018 в 06:50
поделиться
  • 1
    по общему признанию, моя реляционная алгебра / исчисление немного ржаветь, но мне бы хотелось увидеть ссылку на «nulls являются незаконными в отношении реляционной математики» ... – Steven A. Lowe 6 October 2008 в 06:31
  • 2
    Нули не являются «незаконными», но они не нужны, потому что полученная тройная логика может быть сведена к однозначной логике. По общему признанию, "можно уменьшить до" не "легко заменяется на". – Dour High Arch 20 November 2009 в 01:07

null означает, что нет значения, а 0 - нет, если вы видите 0, вы не знаете значения, если вы видите нуль, вы знаете, что это недостающее значение

Я думаю, что значения null clearer, 0 и '' запутывают, поскольку они явно не показывают намерение сохраненного значения

2
ответ дан SQLMenace 20 August 2018 в 06:50
поделиться

NULL пород. Если в некоторых случаях это не было необходимо, SQL не имел бы IS NULL и IS NOT NULL в качестве специальных случаев. NULL является корнем концептуального универсального, все остальное НЕ является NULL. Используйте NULL свободно, когда возможно, что значение данных будет отсутствовать, но не пропущено. Значения по умолчанию могут компенсировать только NULL, если они абсолютно правильны все время. Например, если у меня однобитовое поле «IsReady», это может иметь смысл для этого поля иметь значение по умолчанию false и NULL не допускается, но это неявно утверждает, что мы знаем , что все, что не готово, когда на самом деле у нас нет таких знаний. Скорее всего, в сценарии рабочего процесса лицо, которое решает, готовое или не просто не имело шансов вступить в свое мнение, так что дефолт ложного может быть действительно опасным, заставляя их игнорировать решение, которое, как представляется, имеет был сделан, но фактически был дефолт.

как в сторону, а в отношении среднего начального примера у моего отца не было среднего имени, поэтому его средний начальный результат был бы NULL - не пустым, или звездочкой - кроме армии, где его средний начальный был NMI = No Middle Initial. Как это глупо?

2
ответ дан Steven A. Lowe 20 August 2018 в 06:50
поделиться

Я бы сказал, что Nulls обязательно следует использовать. Нет другого правильного способа представления недостатка данных. Например, было бы неправильно использовать пустую строку для представления отсутствующей строки адреса, иначе было бы неправильно использовать 0 для представления отсутствующего элемента данных возраста. Потому что и пустая строка, и 0 являются данными. Null - лучший способ представить такой сценарий.

8
ответ дан Vaibhav 20 August 2018 в 06:50
поделиться
  • 1
    «Null - лучший способ представить такой сценарий». Я не согласен. Учитывая (first_name, middle_initial, last_name), что означает NULL в среднем значении? Не ясно; либо мы не знаем, либо его не существует. NULL не говорит нам, какой. – Dave 2 October 2008 в 18:25
  • 2
    И если мы не знаем, потому что мы не спрашивали, или они отказались это раскрыть. И если последнее, это из-за стыда или злобы? мы не можем сказать. Если для вашего приложения важно знать разницу, вы можете сохранить причину в другом месте. Если это не импорт, кого, черт возьми, волнует? – user 2 October 2008 в 18:35
  • 3
    Вы могли бы иметь таблицу адресов и не иметь ничего там для ссылки на таблицу Person. Мне это нравится лучше. – Joe Phillips 2 October 2008 в 18:56
  • 4
    Неверно, что нет «другого правильного способа представления отсутствия данных». Действительно, согласно реляционной алгебре, использование нулей неверно. Правильный способ состоит в том, чтобы иметь отдельные таблицы для каждого необязательного поля, как предлагает Кейд. Как отмечали другие, это быстро становится громоздким. – Dour High Arch 3 October 2008 в 17:54
  • 5
    В Oracle, пустая строка, на самом деле, NULL :) – Camilo Díaz Repka 6 October 2008 в 05:49

Не стоит недооценивать сложность, которую вы создаете, создавая поле NULLable. Например, следующее, где предложение выглядит так, как оно будет соответствовать всем строкам (бит может быть только 1 или 0, правильно?)

where bitfield in (1,0)

Но если бит бит имеет значение NULLable, он пропустит некоторые. Или возьмите следующий запрос:

select * from mytable
where id not in (select id from excludetable)

Теперь, если excludetable содержит нуль и a 1, это означает:

select * from mytable
where id <> NULL and id <> 1

Но «id & lt;> NULL» является false для любого значения id, поэтому это никогда не вернет строки.

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

26
ответ дан 2 revs 20 August 2018 в 06:50
поделиться
  • 1
    Можете ли вы подробнее остановиться на «Необязательные отношения, закодированные в внешнем ключе». пожалуйста? – pingu 6 December 2013 в 16:40
  • 2
    Возможно, гипотетический пример может помочь. Существует таблица под названием «Человек». с одной строкой на человека. Первый столбец «id» и используется как первичный ключ. Существует столбец под названием «SpouseId». Когда есть супруг, он содержит внешний ключ, который ссылается на Person.id супруга. Когда нет супруга, он содержит NULL. – Walter Mitty 6 December 2013 в 17:22
  • 3
    Спасибо за быстрое разъяснение! Могу ли я сделать тонкую корректировку вашего примера, чтобы убедиться, что это будет действительное использование NULL? Персональный стол с окном. Действительным занятием может быть «Priest». или "Nun" так что для них SpouseId всегда будет NULL. Короче говоря, все еще допустимо использовать NULL, если не все записи имеют потенциальное значение не NULL? – pingu 6 December 2013 в 18:23
  • 4
    Ваше дело выходит за рамки первоначального вопроса. Возможно, вам захочется исследовать «четвертую нормальную форму». – Walter Mitty 7 December 2013 в 18:50
  • 5
    Ошибки и неожиданности неизбежны в программировании. По моему опыту, строгое исключение NULL приводит к гораздо более сложным проектам баз данных со многими другими таблицами. Разрешение NULL при необходимости является сравнительно менее сложным и подверженным ошибкам. – Sam Watkins 17 January 2017 в 08:43
27
ответ дан 2 revs 31 October 2018 в 06:07
поделиться
27
ответ дан 2 revs 31 October 2018 в 06:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: