У меня есть форма на веб-сайте, где есть много разных полей. Некоторые из полей являются необязательными, а некоторые являются обязательными. В моей БД у меня есть таблица, которая содержит все эти значения, лучше ли вставлять значение NULL или пустую строку в столбцы БД, где пользователь не помещал какие-либо данные?
Используя NULL
, вы можете различать "put no data" и "put empty data".
Еще несколько отличий:
A LENGTH
of NULL
- NULL
, a LENGTH
пустой строки - 0
.
NULL
сортируются перед пустыми строками.
COUNT(message)
будет считать пустые строки, но не NULL
s
Вы можете искать пустую строку с использованием связанной переменной, но не для NULL
. Этот запрос:
SELECT *
FROM mytable
WHERE mytext = ?
никогда не будет соответствовать NULL
в mytext
, независимо от того, какое значение вы передадите от клиента. Чтобы соответствовать NULL
s, вам придется использовать другой запрос:
SELECT *
FROM mytable
WHERE mytext IS NULL
Одна вещь, которую следует учитывать, если вы когда-либо планируете переключение баз данных, заключается в том, что Oracle не поддерживает пустые строки, Они автоматически преобразуются в NULL, и вы не можете запрашивать их, используя предложения типа WHERE somefield = ''
.
Steve B.
.: см. Этот вопрос: stackoverflow.com/questions/1171196/…
Следует иметь в виду, что NULL может сделать ваши кодеки намного сложнее. В Python, например, большинство адаптеров базы данных /ORM отображают NULL
- None
.
Итак, такие вещи, как:
print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow
может привести к появлению "Hello, None Joe Doe!" Чтобы этого избежать, вам нужно что-то вроде этого кода:
if databaserow.title:
print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow
else:
print "Hello, %(firstname) %(lastname)!" % databaserow
Что может сделать вещи намного сложнее.
Лучше вставить NULL
для согласованности в вашей базе данных в MySQL. Внешние ключи могут храниться как NULL
, но НЕ как пустые строки.
У вас будут проблемы с пустой строкой в ограничениях. Возможно, вам придется вставить поддельную запись с уникальной пустой строкой, чтобы удовлетворить ограничение внешнего ключа. Плохая практика, я думаю.
Смотрите также: Может ли внешний ключ быть NULL и/или дублироваться?
Я не знаю, какая будет лучшая практика, но я бы вообще ошибался в пользу нулевого значения, если вы не хотите, чтобы значение null означало что-то отличное от пустой строки, а пользовательский ввод соответствует определению пустой строки.
Обратите внимание, что я говорю, что вам нужно определить, как вы хотите, чтобы они были разными. Иногда имеет смысл иметь их разные, иногда это не так. Если нет, просто выберите один и придерживайтесь его. Как я уже сказал, я обычно предпочитаю NULL большую часть времени.
О, и имейте в виду, что если столбец имеет значение NULL, запись, скорее всего, будет отображаться практически в любом запросе, который выбирает (имеет предложение where в терминах SQL) на основе этого столбца, если только этот выбор не используется конечно, нулевой столбец.
Я не знаю о производительности. Но с точки зрения качества данных, null - это плохо.
Null дает вам тип maybe
, который заставляет вас писать проверку типа времени выполнения, например:
something = a.b.c.d.something if exist?(a) && exist?(a.b) && exist?(a.b.c) && exist?(a.b.c.d) && exist?(a.b.c.d.something)
.
Эта проблема может быть уменьшена, если вы не используете форматы json/hash/array.