Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 про NULL в базах и какова нынешняя мода  [new]
Gobzo Kobler
Member

Откуда: у людей такая фантазия?
Сообщений: 387
Всегда считал, что NULL значения быть не должно, вместо них должны быть разумные значения по умолчанию. Работая на самых разных приложениях постоянно вижу, что 99% баз заполнены NULL по самое нехочу.

Какова сейчас последняя мода: оставлять все NULL и ждать пока заполнится и постоянно писать в коде проверки на NULL или же раздавать значения по умолчанию и трактовать NULL в таблице как ошибку и в запросе как отсутствие связанной записи?
17 янв 03, 19:43    [109092]     Ответить | Цитировать Сообщить модератору
 Re: про NULL в базах и какова нынешняя мода  [new]
ura
Member [заблокирован]

Откуда: Киев
Сообщений: 932
А какие, собственно, возражения против NULL ?
Допустим в таблице персон есть дата смерти. Если человек еще жив - что там должно быть, кроме NULL ?
17 янв 03, 20:55    [109132]     Ответить | Цитировать Сообщить модератору
 Re: про NULL в базах и какова нынешняя мода  [new]
Слон
Member

Откуда:
Сообщений: 717
Я не согласен. NULL - значит не определено. На этом построена логика обработки данных. Мне кажется, что гораздо проще и правильнее грамотно строить структуру базы данных, минимизируя потребность в NULL, но ни в коем случае не использовать для замены NULL "разумные значения по умолчанию". Конечно, если по определению столбец должен быть всегда определен, то defaults - вещь полезная.

-- Слон
17 янв 03, 20:55    [109133]     Ответить | Цитировать Сообщить модератору
 Re: про NULL в базах и какова нынешняя мода  [new]
Gobzo Kobler
Member

Откуда: у людей такая фантазия?
Сообщений: 387
Типичные неграмотные представления о построении баз. Дата смерти является всего навсего поставщиком значения, но никак не связана с установлением факта смерти. Факт смерти должен устанавливаться полем-триггером. Если триггер взведен, значит смерть зафиксирована и можно обратиться е ее дате.
17 янв 03, 21:34    [109147]     Ответить | Цитировать Сообщить модератору
 Re: про NULL в базах и какова нынешняя мода  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145719
На мой взгяд, большое количество нулов, так же как и большое количество значений по умолчанию, происходит от неверного проектирования баз.
Опять же, на мой взгляд, нулы допустимы для неизвестных в данный момент второстепеных параметров, а дефолты - для наиболее часто встречаюшихся или вычисляемых предопределенных (типа даты записи).

А видимое Вами большое количество нулов говорит о низкой квалификации архитекторов. Если какие-то поля не являются обязательными, то я бы, скорее всего, вывел их в отдельную таблу и, при нужде - "left outer join"
17 янв 03, 21:38    [109149]     Ответить | Цитировать Сообщить модератору
 Re: про NULL в базах и какова нынешняя мода  [new]
ura
Member [заблокирован]

Откуда: Киев
Сообщений: 932
2 Gobzo Kobler
Во первых можно запросто объединить признак смерти и дату смерти. Если человек умер - дата is not NULL. (хотя я и не имел этого ввиду в первом посте)
Во вторых - а что все-таки должно стоять в поле "Дата смерти" при жизни ?
17 янв 03, 21:44    [109155]     Ответить | Цитировать Сообщить модератору
 Re: про NULL в базах и какова нынешняя мода  [new]
Слон
Member

Откуда:
Сообщений: 717
>>>Типичные неграмотные представления о построении баз
Прекрасно. Кстати, почему по-вашему NULL значения быть не должно? С точки зрения грамотного представления о построении баз?

-- Слон
17 янв 03, 21:44    [109156]     Ответить | Цитировать Сообщить модератору
 Re: про NULL в базах и какова нынешняя мода  [new]
ura
Member [заблокирован]

Откуда: Киев
Сообщений: 932
2 Слон
Как-то мы синхронно отвечаем

Типичные неграмотные представления о построении баз - это конечно он погорячился...
17 янв 03, 21:49    [109160]     Ответить | Цитировать Сообщить модератору
 Re: про NULL в базах и какова нынешняя мода  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145719
Я не говорил, что NULL - это плохо. Хотя в "Просто трепе" можно найти и мое противоположное мнение.

Типичные неграмотные представления о построении баз
Я этого не писал.

Каждая неграмотная база сугубо индивидуальна.

Спасибо, ura, напомнил. Null допустим для второстепенных и заранее неизвестных данных.
17 янв 03, 22:21    [109168]     Ответить | Цитировать Сообщить модератору
 Re: про NULL в базах и какова нынешняя мода  [new]
Слон
Member

Откуда:
Сообщений: 717
Cat2,

Вопрос был к зачинателю топика :)

-- Слон
17 янв 03, 22:23    [109169]     Ответить | Цитировать Сообщить модератору
 Re: про NULL в базах и какова нынешняя мода  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145719
Слон> Издержки несинхронной дискуссии и пятничного состояния
17 янв 03, 22:42    [109174]     Ответить | Цитировать Сообщить модератору
 Re: про NULL в базах и какова нынешняя мода  [new]
Слон
Member

Откуда:
Сообщений: 717
Cat2,

Не трави душу. Скоро и я буду


WHILE OBJECTPROPERTY(dba_id, 'IsInGoodCondition') <> 1
BEGIN

SELECT TOP 1 [can] FROM [SixPackOfBeer] ORDER BY [Temperature] ASC
UNION ALL
SELECT TOP 1 [piece] FROM [BunchOfVobla]

EXEC dbo.[usp_ProcessRecordset]
END


-- Слон
17 янв 03, 23:03    [109182]     Ответить | Цитировать Сообщить модератору
 Re: про NULL в базах и какова нынешняя мода  [new]
VVG_
Member

Откуда: Санкт-Петербург
Сообщений: 1203
Мля, ну скока вас всех учить? ORDER BY [Temperature] DESC и нах эта зима.
18 янв 03, 03:06    [109239]     Ответить | Цитировать Сообщить модератору
 Re: про NULL в базах и какова нынешняя мода  [new]
Слон
Member

Откуда:
Сообщений: 717
Теплое пиво.... Ну Вы, батенька даете. Это же саботаж какой-то просто!

-- Слон
18 янв 03, 04:17    [109243]     Ответить | Цитировать Сообщить модератору
 Re: про NULL в базах и какова нынешняя мода  [new]
Gobzo Kobler
Member

Откуда: у людей такая фантазия?
Сообщений: 387
Смерть - штука простая. Выносится, как и остальные даты, в отдельную таблицу. Признаком мертвого человека является наличие записи с кодом "умер". Если такой записи нет, значит человек живой. Или прикажете в таблице "человек" держать отдельно даты рождения, смерти, брака, развода, совершеннолетия, выдачи паспорта, получения водительских прав, судимостей и так далее?

То-то, пионеры.
18 янв 03, 06:33    [109247]     Ответить | Цитировать Сообщить модератору
 Re: про NULL в базах и какова нынешняя мода  [new]
Слон
Member

Откуда:
Сообщений: 717
На вопрос о том, почему NULL - неправильно, так и не было ответа. Это наверное признак профессионализма. Все таки хотелось бы не голословное утверждение услышать, а обоснование позиции. Насчет смерти - ответ тоже дан без учета возможной реальной потребности иметь неопределенную дату в таблице. Хорошо, пример был приведен не самый лучший. Ну, а как поступить в случае, когда есть описание процеса, его начала и его окончания. Тоже приводить в супернормальную форму или все-таки сделать что-нибудь наподобие ProcessID, ..., StartDate, EndDate - где EndDate позволяет NULL? Вам слово - пенсионеры.

-- Слон
18 янв 03, 10:46    [109268]     Ответить | Цитировать Сообщить модератору
 Re: про NULL в базах и какова нынешняя мода  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145719
Если пульса нет, то никакоЙ признак не поможет
18 янв 03, 11:01    [109271]     Ответить | Цитировать Сообщить модератору
 Re: про NULL в базах и какова нынешняя мода  [new]
ura
Member [заблокирован]

Откуда: Киев
Сообщений: 932
А почему только даты выносятся в отдельную таблицу - с таким же успехом можно все атрибуты сущности повыносить - и это будет правильным в определенных случаях. Просто есть различные подходы к проектированию баз - и говорить о профессионализме или непрофессионализме разработчика только по выбранной концепции преждевременно - у него, скорее всего, есть на то основания. А что касается значительного кол-ва NULL-ов - они допустимы, когда выбран подход более-менее универсального построения структуры таблиц с целью минимизации их изменения в дальнейшем. А без NULL-ов совсем нельзя - зачем заменять их бессмыссленными значениями типа 'Нет данных', 'Отсутствует' - NULL именно для этого и был придуман людьми очень профессиональными в области баз данных
19 янв 03, 00:43    [109400]     Ответить | Цитировать Сообщить модератору
 Re: про NULL в базах и какова нынешняя мода  [new]
Shark
Member

Откуда:
Сообщений: 2365
>Слон:Хорошо, пример был приведен не самый лучший.
Да нет, удачный ваш пример.
>Смерть - штука простая. Выносится, как и остальные даты, в отдельную >таблицу. Признаком мертвого человека является наличие записи с >кодом "умер". Если такой записи нет, значит человек живой. Или прикажете >в таблице "человек" держать отдельно даты рождения, смерти, брака, >развода, совершеннолетия, выдачи паспорта, получения водительских прав, >судимостей и так далее?
>
>То-то, пионеры.
Какая ужасная чушь.
Для каждого поля, которое может быть неопределено, заводить отдельную таблицу.
Маэстро, разработайте 1 (один) реальный проект, и Вам станет проще беседовать про SQL.
19 янв 03, 08:59    [109419]     Ответить | Цитировать Сообщить модератору
 Re: про NULL в базах и какова нынешняя мода  [new]
Glory
Member

Откуда:
Сообщений: 104760
Думаю, что вопрос многогранный. Поэтому начну издалека

1. Реальность
такова, что у физической сущности могут быть параметры, значения которых неизвестны. Обычно это связано с временной координатой, т.е. значение неизвестно до/после конкретного момента времени.
Здесь, я думаю, спорить вроде бы не о чем.

2. Моделирование
т.е. оторажение физической сущности в абстрактную должно таким образом учитывать особенности параметров первой.
Другими словами неизвестное значение атрибута абстрактной сущности имеет место быть.

Для неизвестного значения можем выбрать
- между NULL
- и специальным значением


Преимущества одного являются недостатки другого. А именно
- NULL является международным стандартом, что обеспечивает поддержку во многих SQL серверах и упрощает импорт/экспорт данных и адаптацию кода (WHERE myfield IS NULL vs WHERE myfield = 'UKNOWN VALUE')

- обработка NULL в запросе может влиять на результаты и скорость запроса. Конкретно это JOIN-ы и неоптимальный план выполнения при использовании условий типа WHERE end_date IS NULL OR end_date > '20020101' или WHERE ISNULL(end_date, '99991231') > '20020101'

- отображение в результатах NULL-ов может неправильно трактоваться пользователем. Ведь они не так хорошо знакомы со стандартами


Таким образом выбор способа хранения неизвестного значения это персональный вопрос для каждого поля, в зависимости от конкретного приложения.
По-моему все поля, которые будут использоватся в объединениях, обязательно должны инициироватся специальным значение вместо NULL.
Я лично стараюсь избегать NULL-ов, но не ставлю самоцелью избавится от них вообще.
19 янв 03, 15:11    [109475]     Ответить | Цитировать Сообщить модератору
 Re: про NULL в базах и какова нынешняя мода  [new]
snake
Member

Откуда: Russia, Penza
Сообщений: 2290
отображение в результатах NULL-ов может неправильно трактоваться пользователем...
и
все поля, которые будут использоватся в объединениях, обязательно должны инициироватся специальным значение вместо NULL...
IMHO,такое должно правильно отображаться контролами на форме, чтобы правильно трактоваться пользователем...
20 янв 03, 09:53    [109643]     Ответить | Цитировать Сообщить модератору
 Re: про NULL в базах и какова нынешняя мода  [new]
sergwsk
Member

Откуда: М
Сообщений: 558
Своё ИМХО:
Работая 3 года с SQL сервером совершенно спокойно использую NULL. Одновременно с этим при разработки клиента (VB) вношу специальную обработку для NULL. Иногда такой подход позволяет избавляться от неожиданных ошибок времён времени исполнения - т.к. например при значении первичного ключа = NULL программа чаще "опрокидывается", нежели при значении "по умолчанию", например, -1. И такие ошибки возникают, как правило, при первых же тестированиях клиента. Опять же, при итеративном подходе к разработке программ дополнительные ограничения типа Default или NOT NULL можно вводить постепенно, по мере достижения определенной устойчивости модели предметной области.
С другой стороны некоторые мои коллеги при создании таблицы ВСЕГДА задают для большинства полей комбинацию DEFAULT + NOT NULL. У них другой подход к построению клиент-серверных приложений, возможно связанный с особенностью разработки клиента на MS Access 97.
ЗЫ. Никогда не задаю комбинацию DEFAULT + NOT NULL для полей типа DATETIME, даже дату модификации записи задаю явно или через триггер.
20 янв 03, 10:15    [109659]     Ответить | Цитировать Сообщить модератору
 Re: про NULL в базах и какова нынешняя мода  [new]
akuz
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 6749
обработка NULL в запросе может влиять на результаты и скорость запроса.

Это ключевая фраза.

Следует отличать простые атрибуты от внешних ключей.

Возьмём для примера структуру.

create table dept (

id int primary key,
name varchar(100)
)

create table employee (
id int primary key,
lastname varchar(100),
firstname varchar(100),
dept int --ссылка на dept

)


Допустим для обеспечения целостности мы вводим внешний ключ между dept.id и employee.dept. Так же из условий задачи известно, что значения в полях таблицы employee - firstname и dept могут быть не заполнены.

Вариант решения с NULL


create table dept (
id int primary key,
name varchar(100) not null
)

create table employee (
id int prymary key,
lastname varchar(100) not null,
firstname varchar(100) null,
dept int null
)


Вариант решения с выделенным значением


create table dept (
id int primary key,
name varchar(100) not null
)

create table employee (
id int prymary key,
lastname varchar(100) not null,
firstname varchar(100) not null default('N/A'),
dept int not null default (0)
)

Перед использованием таблицы employee необходимо выполнить.
insert dept values (0, 'N/A')

Сравним варианты на примере запросов

Вывести всех емплоёв из департамента 'FO'
1/1.
select e.id, e.lastname, firstname = isnull(e.firstname, 'N/A'), name = e.lastname + isnull(' ' + e.firstname, '')

from employee e
inner join dept d on d.id = e.dept
where d.name = 'FO'

2/1.
select e.id, e.lastname, e.firstname, name = e.lastname + isnull(' ' + nullif(e.firstname, 'N/A'), '')

from employee e
inner join dept d on d.id = e.dept
where d.name = 'FO'

Практически не отличаются, во втором варианте чуть более запутанная структура кода.

Вывести всех емплоёв с именем начинающимся на 'N' с указанием имени департамента
1/2.
select e.id, name = e.lastname + ' ' + e.firstname, dept = isnull(d.name, 'N/A')

from employee e
left join dept d on d.id = e.dept
where e.firstname like 'N%'

2/2.
select e.id, name = e.lastname + ' ' + e.firstname, dept = d.name

from employee e
inner join dept d on d.id = e.dept
where e.firstname like 'N%'
and e.firstname <> 'N/A'


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

Вывести всех емплоёв для которых определён депт
1/3.
select e.id, name = e.lastname + ' ' + e.firstname, d.name

from employee e
inner join dept d on d.id = e.dept

2/3. вывести всех емплоёв для которых определён депт
select e.id, name = e.lastname + ' ' + e.firstname, d.name

from employee e
inner join dept d on d.id = e.dept
where e.dept <> 0


Во втором варианте - дополнительное условие. По быстродействию первый вариант предпочтительней.


Из приведённых примеров запросов я делаю такие выводы:
Для неключевых полей по быстродействию оба варианта практически равноценны. Во втором варианте более запутанная структура кода.
Для ключевых полей при больших объёмах данных второй вариант по быстродействию предпочтительней.

Итоговая структура.

create table dept (
id int primary key,
name varchar(100) not null
)

create table employee (
id int prymary key,
lastname varchar(100) not null,
firstname varchar(100) null,
dept int not null default (0)
)

Ну это так - для понимания.

А вообще, слушайте Glory он дело говорит. :)
20 янв 03, 11:57    [109782]     Ответить | Цитировать Сообщить модератору
 Re: про NULL в базах и какова нынешняя мода  [new]
Genady
Member

Откуда: Москва
Сообщений: 2005
Как однако все увлеклись. :-)
Конечно не плохо было бы нормализовать всю БД по самую... ну эту как ее, 5 НФ.
Однако же осознание того, что даже в OLTP базах кроме insert-ов и update-ов присутствют так же и select-ы, бьет бедных архитекторов пыльным мешком по самой по макушке. Посему, пока такая ситуация будет сохраняться, этот спор будет вечным. :р
20 янв 03, 12:04    [109793]     Ответить | Цитировать Сообщить модератору
 Re: про NULL в базах и какова нынешняя мода  [new]
Glory
Member

Откуда:
Сообщений: 104760
Согласен с Genady.
Это вопрос из разряда - суррогатные ключи против естественных или identity против selfmaded key.
20 янв 03, 12:25    [109813]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить