Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];

Вниз

Понятие NULL   Найти похожие ветки 

 
pasha_golub ©   (2006-10-02 12:54) [200]

NULL = ВНИМАНИЕ! ДАННЫЕ НЕ ПОЛНЫЕ! НЕ РАБОТАЙТЕ!
"" = ПОХРЕНУ! РАБОТАЙТЕ КАК ХОТИТЕ!

Есть разница?


 
pasha_golub ©   (2006-10-02 12:55) [201]


> evvcom ©   (02.10.06 12:49) [196]
>
> Вот, блин, ополчились!
> Не нравится Оракл, не юзайте. На нас спрос будет выше. :
> )
>

Не-е-е, не надо. ;-) Я против Оракла ничего против не имею. Абсолютно. Тут вопрос шире, и абсолютно не привязан к Ораклу или другой СУБД.


 
Игорь Шевченко ©   (2006-10-02 12:56) [202]

pasha_golub ©   (02.10.06 12:54) [200]


> NULL = ВНИМАНИЕ! ДАННЫЕ НЕ ПОЛНЫЕ! НЕ РАБОТАЙТЕ!
> "" = ПОХРЕНУ! РАБОТАЙТЕ КАК ХОТИТЕ!
>
> Есть разница?


Нету


 
evvcom ©   (2006-10-02 12:57) [203]

> [198] kaif ©   (02.10.06 12:50)

Для KELL кроме "KK", "+" и null можно ввести "-" (аналог ИШ [184]), который будет интуитивно понятен, уместится в char(1) (если и "KK" обозначить как "K"), не потребует дополнительного флага, точно также легко уложится в констрейнт и не будет никакой избыточности.


 
kaif ©   (2006-10-02 12:58) [204]

2 Reindeer Moss Eater ©   (02.10.06 12:53) [199]
Все очень просто.
Нет такой сущности как "оклад сотрудника".
Есть сущность "оклад сотрудника, введенный оператором".
Это действительно новый атрибут сущности - ссылка на "источник информации".
(работник, оклад, источник информации)
Если это важно, разумеется.

И здесь опять есть разница между тем, "неизвестно кто внес оклад" или "неизвестно, кто-нибудь вообще внес оклад или нет".


 
kaif ©   (2006-10-02 13:05) [205]

2 evvcom ©   (02.10.06 12:57) [203]
Согласен.
Только вот я не понимаю, зачем настаивать на том, что отождествление NULL и пустой строки создает удобство?
Я пока никакого удобства не вижу. Точнее вижу удобство за счет каких-то новых неудобств. Но при этом отказ от принятого стандарта.
Во имя чего, хотелось бы знать?

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

Меня часто раздражает, что IBX-ы (компоненты Intebase Exress) интерпретируют пустую строку как NULL перед посылкой значения из DBEdit на сервер. Мне это не мнравится. А Игорь, фактически, утверждает, что это должно было бы мне нравится.
А мой опыт говорит мне совершенно о другом.


 
kaif ©   (2006-10-02 13:06) [206]

извиняюсь за орфографические ошибки
:)


 
Reindeer Moss Eater ©   (2006-10-02 13:06) [207]

Но как же так?

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


 
Игорь Шевченко ©   (2006-10-02 13:08) [208]

kaif ©   (02.10.06 13:05) [205]


> А Игорь, фактически, утверждает, что это должно было бы
> мне нравится.


Так что с визуальным представлением будем делать для фактора ? Я уже третий раз задаю этот вопрос, но ответа все равно не вижу.


 
Reindeer Moss Eater ©   (2006-10-02 13:56) [209]

И все же пример с отчеством - это вопрос интерпретации имеющихся значений.
Есть необязательный атрибут "отчество" у сущности "человек".
И varchar2 в Оракле позволяет хранить значение этого атрибута.
Это значение можно получить, напечатать и использовать в выражениях со строками. Все о"кей.

Если же программист заморачивается вопросом: "а что же на самом деле означает пустое значение в поле "отчество" это значит что он на самом деле нуждается еще в одном атрибуте сущности "человек". Точнее не он, а та предметная область для которой он нарисовал свою программу.
Если системе совершенно необходимо знать, если у чела отчество в принципе, то необходимо ввести такой атрибут.
Да и с точки зрения пользовательского интерфейса получается такой прикол:
Оператор допустим узнал, что у клиента нет отчества. А для ввода самого отчетства в программе dbEdit.
Получается:
- во первых не видно, что там находится, нулл или пустая строка.
- во вторых как ввести нулл, если там уже что-то было. (Скажем отчество было, но чел поменял вероисповедание или уехал в Америку и взял себе firstname,secondname, а отчество убрал из документов)

Вывод: В интерфейсе все равно будет какой-то контрол который:
1. Отображает нулл в поле или не нулл.
2. Позволяет явно записать нулл в поле.

Это значит, что просто напросто нужен еще один атрибут.
(Если хотим знать что же означает хранимое значение )

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

Аналогия - полнейшая.


 
kaif ©   (2006-10-02 14:01) [210]

Игорь Шевченко ©   (02.10.06 13:08) [208]
Так что с визуальным представлением будем делать для фактора ? Я уже третий раз задаю этот вопрос, но ответа все равно не вижу.


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

Я говорю о том, как себя будет ощущать SQL-щик, соединившейся с базой и делающий простейший SELECT. Нормальный SQL-щик, увидев поле KELL,  в котором есть и пустые значения и NULL, поймет, что пустые означают, что фактора KELL нет, а NULL - неопределенные, то есть анализ не проводился или данные забыли внести. Если же он заметит еще какое-то поле типа KELL_FLAG,  в котором иногда 1, то ему еще придется делать запрос вида:

 SELECT COUNT(*), KELL, KELL_FLAG

чтобы понять, что означает это флаг.
И если он получит набор вида:

2000, "", 0
5,      "", 1
15,    "K",0
300,  "K",1

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


 
euru ©   (2006-10-02 14:02) [211]


> Reindeer Moss Eater ©   (02.10.06 13:06) [207]

Пустая строка и NULL - это неэквивалентные значения, даже если визуально они похожи.


> Игорь Шевченко ©   (02.10.06 13:08) [208]

В общем случае формат хранения данных <> формат визуального представления данных.


 
Reindeer Moss Eater ©   (2006-10-02 14:03) [212]

Пустая строка и NULL - это неэквивалентные значения, даже если визуально они похожи

Это просто магическое заклинание или что-то иное?

Кстати, как визуально выглядит null?


 
Внук ©   (2006-10-02 14:04) [213]

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


 
Reindeer Moss Eater ©   (2006-10-02 14:05) [214]

kaif ©  
С программером все понятно. Вилки в коде и так далее.
Как быть с пользователем, которму надо занести нулл в отчество?


 
kaif ©   (2006-10-02 14:07) [215]

Вывод: В интерфейсе все равно будет какой-то контрол который:
1. Отображает нулл в поле или не нулл.
2. Позволяет явно записать нулл в поле.

Это значит, что просто напросто нужен еще один атрибут.
(Если хотим знать что же означает хранимое значение )


Не значит.

А вот если сервер не отличает пустую строку от NULL, то тогда нужно второе поле. О чем я и твержу.
И тогда второе поле, в котором указано HAS_NAME3 = 1 сочетается с пустой строкой не ясно как интерпретировать. То ли как то, что у чела отчество имеется, но оно неизвестно оператору, то ли как ошибку ввода данных, то ли как испорченные данные, то ли как то, что чел - сирота.
И будут нужны уже специальные инструкции дополнительно к такой базе данных.
:)


 
Reindeer Moss Eater ©   (2006-10-02 14:08) [216]

Как быть с пользователем, которму надо занести нулл в отчество?


 
Игорь Шевченко ©   (2006-10-02 14:10) [217]

kaif ©   (02.10.06 14:01) [210]


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


Не, ты не понял. Мы берем того же неискушенного пользователя, составившего SQL-запрос и набравшего его...в Excel"е каком-нибудь


 
Внук ©   (2006-10-02 14:10) [218]

>>Reindeer Moss Eater ©   (02.10.06 14:08) [216]
 А зачем ему туда заносить NULL. Что-то изначально неизвестное может стать известным, не наоборот. Хотя, у меня для этого в полях ввода есть специальные кнопочки рядом.


 
Reindeer Moss Eater ©   (2006-10-02 14:12) [219]

Внук ©

Программер использует в своих корыстных целях особенность сервера отличать нулл от пустой строки что бы знать у кого отчества нет вообще.
Замечтаткльно!

Теперь:
Какие интерфейсные средства он дает юзеру что бы тот управлял состоянием отчества?

Как пользователю имея dbedit ввести нулл или пустую строку?
Как ему самому увидеть, есть у чела отчество или нет?


 
Kerk ©   (2006-10-02 14:14) [220]

> [219] Reindeer Moss Eater ©   (02.10.06 14:12)

Вопрос решается встраиванием в Edit кнопочки "X" для удаления данных и подсветкой фона Edit другим цветом (желтым, например). Хотя некоторая неинтуитивность в этом есть


 
kaif ©   (2006-10-02 14:18) [221]

Reindeer Moss Eater ©   (02.10.06 14:05) [214]
kaif ©  
С программером все понятно. Вилки в коде и так далее.
Как быть с пользователем, которму надо занести нулл в отчество?


Все делаем, как Вы и говорите.
ВОт строгое решение:

Имя
Отчество + птичка "отчество отсутствует"
Фамилия

Если юзер установил птичку, в поле пишется NULL.
Если не установил - выдается ошибка "Введите отчество или установите птичку".

Что касается отображения, то тот же IBExpert при выводе на экран результата запроса в поле "Отчество" покажет слово null красного цвета. Это и будет означать, что отчества нет.
Пустая строка в данном случае вообще исключена.
---------------------------------
Пойдем другим путем.
Интерфейс тот же, в поле "Отчество" вместо null  - пустая строка.
Если я не видел интерфейса ввода, то я не различу ситуации "отчества нет" от "его забыли ввести", так как у меня нет в руках дополнительного соглашения о такой реализации.
Хотя такая реализация с точки зрения реализации ничем и не отличается и даже имеет преимущество для конкатенации строк, но она требует дополнительных знаний, кроме стандарта SQL.


 
Reindeer Moss Eater ©   (2006-10-02 14:18) [222]

Вопрос решается встраиванием в Edit кнопочки "X" для удаления данных и подсветкой фона Edit другим цветом (желтым, например). Хотя некоторая неинтуитивность в этом есть

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


 
Внук ©   (2006-10-02 14:18) [223]

>>Reindeer Moss Eater ©   (02.10.06 14:12) [219]
 Фантазируй.
 А к чему эти вопросы?


 
Reindeer Moss Eater ©   (2006-10-02 14:19) [224]

Имя
Отчество + птичка "отчество отсутствует"
Фамилия


Итого:
четыре поля одно из которых для птички.


 
kaif ©   (2006-10-02 14:25) [225]

Вся суть спора вот в чем.
Если рассматривать базу данных как просто ХРАНИЛИЩЕ, то да.
Какая разница, что такое NULL?
Но базу данных мы понимаем, как систему связанной информации, а не просто как ХРАНИЛИЩЕ ДАННЫХ.
А в системе важно различать информация есть, или отсутствует.
Допустим, мы это реализуем с помощью флагов.
Прекрасно.
Только я покажу, что и без всякой нормализации (в одной широченной таблице) тоже можно хранить данные. И приведу миллион человек, которые скажут, что "ВЕСЬ ОПЫТ ИХ ЖИЗНИ УТВЕРЖДАЕТ, ЧТО КРОМЕ EXCEL-А ВООБЩЕ НИЧЕГО НЕ НУЖНО".

Поклонники нормализаций будут голосовать за NULL.
Мне так кажется.

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


 
Reindeer Moss Eater ©   (2006-10-02 14:29) [226]

Согласен.
Только я вот хочу еще знать что же на самом деле означает цифра 5000 в поле саллари у сотрудника.
Что же на смом деле означает цифра 1000 в поле прайс напрртив названия книги.
Что на самом деле означает False в поле married у соседки по офису?

Почему неоднозначными могуть быть только строки?
Куда мне податься?

:)


 
Reindeer Moss Eater ©   (2006-10-02 14:33) [227]

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

Ничуть.
Отдельно поле нужно только когда система хочет знать ответ на вопрос есть/нет. Это отдельный атрибут. Нормальные формы в норме.

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


 
Игорь Шевченко ©   (2006-10-02 14:35) [228]

kaif ©   (02.10.06 14:25) [225]

Не пользуйся Oracle, если он не соответствует твоим религиозным убеждениям, только и всего. Пусть Ларри Элиссону будет хуже. А то приходят тут разные...пуристы :)


 
euru ©   (2006-10-02 14:38) [229]


> Reindeer Moss Eater ©   (02.10.06 14:03) [212]
> Это просто магическое заклинание или что-то иное?
Теория множеств, реляционная алгебра.


Кстати, как визуально выглядит null?
Ага, это из серии "покажите мне ноль яблок".
Пример (гипотетический) реального NULL"а : ежемесячно сотрудникам выдают в конвертах некую заработанную ими сумму. Выдача пустого конверта (пустая строка) означает, что сотрудник ничего в этом месяце не заработал. Невыдача конверта (NULL) означает лишь, что по каким-то причинам его не выдали (например, сумма слишком большой оказалась, а подходящего конверта под рукой не было). С точки же зрения Oracle сотрудник, в случае невыдачи конверта, должен рассматривать это как выдачу пустого конверта и никаких претензий к руководству не предъявлять.


 
kaif ©   (2006-10-02 14:39) [230]

Reindeer Moss Eater ©   (02.10.06 14:19) [224]
Имя
Отчество + птичка "отчество отсутствует"
Фамилия

Итого:
четыре поля одно из которых для птички.


А вот и нет.
Птичка в данном случае только в интерфейсе.
Обе реализации потребуют только три поля.

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

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


 
evvcom ©   (2006-10-02 14:39) [231]

> [205] kaif ©   (02.10.06 13:05)
> Я пока никакого удобства не вижу.

А я не вижу неудобства. Это не пустое заявление. Пока на любой "а как?" я привел "а так!" В чем же неудобство?

> Меня часто раздражает, что IBX-ы (компоненты Intebase Exress)
> интерпретируют пустую строку как NULL перед посылкой значения
> из DBEdit на сервер.

Видимо, Оракл не одинок в своем понимании "как это должно быть".

> Мне это не мнравится.

Чем конкретно? Мне было б по-барабану. Все удобство/неудобство именно с визуализации начинается, и ею же заканчивается. А все проверки типа is null или ="" создают гораздо меньше удобств/неудобств. Имхо.

> [207] Reindeer Moss Eater ©   (02.10.06 13:06)
> Если есть проблема интерпретации двух эквивалентных строковых
> значений в оракле

Это надуманная проблема. На самом деле ее нет.

> [210] kaif ©   (02.10.06 14:01)
> Я говорю о том, как себя будет ощущать SQL-щик, соединившейся
> с базой и делающий простейший SELECT. Нормальный SQL-щик,
> увидев поле KELL,  в котором есть и пустые значения и NULL,
> поймет, что пустые означают, что фактора KELL нет, а NULL
> - неопределенные, то есть анализ не проводился или данные
> забыли внести.

Ну хорошо. Поддерживает такое СУБД, делаешь так. А если нет (Оракл), то делаешь как в [203]. Ты ж ведь с этим согласился! Все интуитивно понятно:
2000,"-" // ОТСУТСТВУЕТ!!! (с) ИШ
5,null // значение не определено
300,"K"
45,"+"


> [215] kaif ©   (02.10.06 14:07)
> А вот если сервер не отличает пустую строку от NULL, то
> тогда нужно второе поле.

Приведи реальный, а не надуманный пример, когда это просто необходимо. С KELL, надеюсь, разобрались? Я предложил вполне логичное решение.

> [220] Kerk ©   (02.10.06 14:14)
> Хотя некоторая неинтуитивность в этом есть

Вот именно неинтуитивность! А зачем это? Для чего различать? Практический смысл?


 
kaif ©   (2006-10-02 14:42) [232]

2 Reindeer Moss Eater ©

Если у Джона Леннона и Жюля Верна нет отчеств, означает ли это то же самое, как то, что отчества у этих двух уважаемых господ совпадают?


 
Внук ©   (2006-10-02 14:42) [233]

>>Игорь Шевченко ©   (02.10.06 14:35) [228]
 Попрошу в обчественном месте не выражаться. Вообще, давно известно, что лучшая СУБД - это FileMaker.


 
Reindeer Moss Eater ©   (2006-10-02 14:47) [234]

Если у Джона Леннона и Жюля Верна нет отчеств, означает ли это то же самое, как то, что отчества у этих двух уважаемых господ совпадают?

Если в Оракле, то отчества этих двух человеков не совпадут.
Там с клиента вставят либо нулл либо пустую строку и поля не будут равны.


 
evvcom ©   (2006-10-02 14:49) [235]

> [221] kaif ©   (02.10.06 14:18)


> то я не различу ситуации "отчества нет" от "его забыли ввести"

Практический смысл сего?

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

Чтобы писать эффективные приложения, программист обязан обладать дополнительными знаниями.

> [229] euru ©   (02.10.06 14:38)

Сумма денег в Оракле имеет тип number. :)

> [230] kaif ©   (02.10.06 14:39)
> если кто-то решит выяснить,
> "а у какого процента людей отчества одинаковые"

Неужели в реальной жизни кого-то интересуют такие отчеты?


 
euru ©   (2006-10-02 14:55) [236]


> Reindeer Moss Eater ©   (02.10.06 14:33) [227]
> Ничуть.Отдельно поле нужно только когда система хочет знать
> ответ на вопрос есть/нет. Это отдельный атрибут. Нормальные
> формы в норме.

Номер Флаг Значение
  1    0   ""
  2    0   "Петрович"
  3    1   ""
  4    1   "Петрович"


Номер 1. Избыточно поле "Значение": по флагу видно, что данных нет.
Номер 2. Неконсистентность данных.
Номер 4. Избыточно поле "Флаг": по значению видно, что данные есть.


 
kaif ©   (2006-10-02 14:55) [237]

Reindeer Moss Eater ©   (02.10.06 14:47) [234]
Если в Оракле, то отчества этих двух человеков не совпадут.
Там с клиента вставят либо нулл либо пустую строку и поля не будут равны.


То есть ORACLE не избавит нас от необходимости в запросе по всему FIO все равно оговаривать OR OTCHESTVO IS NULL ?
Тогда в чем "очевидность" такого решения?
Ведь для пользователя, который легко может делать конкатенации таких пустых строк будет очень странным, что при запросе с

WHERE T1.F = T2.F and T1.I = T2.I and T1.O = T2.O

почему-то (????) выпали все американцы.

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

:))))))


 
Reindeer Moss Eater ©   (2006-10-02 14:58) [238]

Граждане, мы постоянно уходим от сути.
Надо всего навсего решить является ли пустая строка сама по себе (когда она еще не стала пустым отчеством Леннона) таким же самостоятельным полноценным значением как и любая другая строка. То есть правомерно ли было считать, что она является олицетворением значения null для строкового типа.

То есть неопределенного значения или отсутствующего значения. Значения, про которое нельзя ничего определенного сказать.

Что вы можете сказать про длину отчества Джона Уинстона Леннона?


 
kaif ©   (2006-10-02 15:00) [239]

Такой вопрос.
Я хочу, допустим, в ORACLE посчитать среднюю длину отчеств.
Ну, например, что-то вроде:

SELECT AVG(STRLEN(OTCHESTVO)) FROM T1

что я получу?

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

А в ORACLE я получу ошибку?

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

Только не говорите мне, что такой запрос не имеет практического смысла.


 
kaif ©   (2006-10-02 15:03) [240]

2 Reindeer Moss Eater ©   (02.10.06 14:58) [238]

Я готов легко примириться с тем, что ORACLE считает пустую строку за NULL. Если он в выражении WHERE это понимает именно так.

Но меня смущает то, что он допускает при этом конкатенацию таких строк.
Это уже - совершенно вольное обращение с таким понятием.

А если я решу в выражении WHERE употребить конкатенацию, не приду ли я к очевидным противоречиям?



Страницы: 1 2 3 4 5 6 7 8 9 
10 вся ветка

Форум: "Прочее";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 1.09 MB
Время: 0.102 c
2-1160823835
MAX.
2006-10-14 15:03
2006.10.29
подскажите


2-1160646832
GunGarry
2006-10-12 13:53
2006.10.29
чтение из файла


8-1143218448
mobila
2006-03-24 19:40
2006.10.29
ограничить перемещения квадрата


15-1160038958
worldmen
2006-10-05 13:02
2006.10.29
Подобрать Switch.


2-1161018380
Kolan
2006-10-16 21:06
2006.10.29
Как передать объект в виде Integer, а затем это число ..





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский