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

Вниз

Дейт.Введение в БД. Null - да или нет?   Найти похожие ветки 

 
kaif   (2004-01-21 14:40) [40]

Что касается философии самого NULL, то я считаю, что это очень глубокомысленная вещь. Достаточно заметить, что утверждение NULL=NULL ложно. И ложно утверждение NULL<>NULL. Если бы во времена Аристотеля можно было бы до такого додуматься, планета сейчас выглядела бы иначе... Здесь мы покидаем привычную нам (в математике) систему обозначения вещей. Для Канта, например, очевидно, что A=A. И так для любого сивола. Математики любят с этим играться (с такими выкладками). Даже великий Рассел из-за этого недоразумения путается в парадоксе про критянина, говоря, что парадокс о критянине можно свести к утверждению "я лгу". Нельзя свести. И я горжусь тем, что создатели реляционной теории баз данных на практике решили проблему, введя понятие NULL. "Неизвестно что" не может быть равно самому себе. Как это ни странно. Поэтому утверждения типа "нечто равно себе" и "нечто тождественно себе" суть два разных утверждения.
Мне кажется, что:

IS NULL - тождественность
= NULL - равенство

Если мы не знаем чего-то, то единственное, что мы знаем, так это то, что мы ничего не знаем. Можно ли это называть знанием? Есть ли здесь парадокс? Изобретатель понятия NULL - сам Сократ, ИМХО. Просто он это сформулировал, как парадокс. Для всех. Кроме него самого. А то, что парадокса нет, вылезло не в метафизических или логических рассуждениях, а когда попытались работать с информацмей на практике. И стало ясно, что из того, что мы чего-то не знаем еще нельзя делать вывод о том, что мы уже что-то узнали, ура!
При выполнении SELECT незнание (NULL) из одного места передается в другое. Передача сообщения о незнании...
Говоря в стиле Copyr25, со времен Сократа до нас дошел NULL, который он поместил в свою базу знаний, состоящую из одной таблицы с одним полем и одной записью.


 
hCat   (2004-01-21 14:44) [41]


> kaif © (21.01.04 14:21) [36]

В этом случае (on delete set null) полагаю разработчики IB имели ввиду ситуацию связи многие ко многим. В описанном вами варианте ахинея, совершенно согласен.


 
kaif   (2004-01-21 14:52) [42]

2 Johnmen © (21.01.04 14:25) [38]
А ты можешь создать запись со значением NULL в поле, которое ссылается на пустую таблицу через FOREIGN KEY DELETE SET NULL?
У меня были проблемы с этим делом.

Игорь Шевченко © (21.01.04 14:23) [37]

> FOREIGN KEY ON DELETE SET NULL.

Для этой задачи (с накладными) разумнее объявлять CASCADE


Это не всегда возможно. Например, я хочу "отрезать" период с 1 января 2004 года. Накладные, датированные после 1 января 2004 года должны попасть в новую базу. Заказы, на которые они ссылаются, могут датироваться 1 июня 2003 года. Они уже действительно не нужны. Но накладные нужны. Мне приходится разрешать все ссылки и переносить такие заказы тоже. Только ради сохранения ссылочной целостности.

В конце концов я остановился на такой идеологии:
1.Я применяю ON DELETE CASCADE в отношениях шапка-детали документов (для упрщения удаления документа).
2.Я применяю простой FOREIGN KEY во всех ссылках на справочники и внутри справочной системы (для запрета на удаление используемого справочного элемента).
3.Я применяю такой же простой FOREIGN KEY в ссылках документов друг на друга (если они важны), препятствуя удалению, например, заказа, если по нему имеется накладная.

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


 
DiamondShark   (2004-01-21 15:07) [43]

NULL нужны.
Хотя бы из соображений функциональной полноты.


 
Johnmen   (2004-01-21 15:10) [44]

>kaif ©

Я нравится философия на тему баз данных :)

Мне показалось, что ты не совсем осознаешь, что есть NULL. Точнее, не есть !
Нулл - это определение отсутствия. Но не значение !!! Отсюда понятно, что операция нулл=нулл просто абсурд !


 
kaif   (2004-01-21 15:23) [45]

2 Johnmen © (21.01.04 15:10) [44]
Можалуй ты прав.
Можно ли сказать, что небытия нет? Или небытие в данном случае есть? NULL это небытие данных. Реляционная теория баз данных разрешила спор греков о пустоте. Природа не боится пустоты, если существует NULL. Изобретение NULL настолько же велико, как открытие вакуума!
NULL это информационный вакуум.
А может и космический вакуум не равен самому себе?
Что мы вообще имеем в виду, говоря вакуум?
И можно ли ссылаться на вакуум? Нельзя. Поэтому NULL в ссылке должен пониматься как "отсутствие ссылки", а не как "пустая ссылка". Следовательно, FOREIGN KEY не должен содержать NULL. Так как он не либо содержит отсутствующих ссылок - либо он не форейн кей.


 
kaif   (2004-01-21 15:28) [46]

Поэтому в Дельфи nil это пустой указатель, а NULL - тип данных VARIANT. Однако в программном тексте на Object Pascal (в D6, по крайней мере), я могу спокойно убедиться, что:

if NULL=NULL then
ShowNessage("Природа программирования на pascal боится пустоты!");
Выведет сообщение на экран. И никаких IS.


 
stone   (2004-01-21 15:47) [47]


> kaif © (21.01.04 15:28) [46]


Я думаю не стоит примешивать сюда Дельфи. Например, в Си nil отсутствует, его заменяет именно NULL.

Кроме того, Дельфи отработает NULL не всегда, так следующий код:

v := null;
ShowMessage(IntToStr(VarAsType(v, varInteger)));


приводит к ошибке: "Could not convert variant of type (Null) into type (Integer)"

В теме идет речь об использовании NULL именно в вопросах проектированиия БД.


 
Johnmen   (2004-01-21 15:51) [48]

>kaif © (21.01.04 15:23)

:)))

Про небытие ничего сказать нельзя. Также, как ничего нельзя сказать про то, чего нет...

>Следовательно, FOREIGN KEY не должен содержать NULL

И не содержит ! Ничего не содержит !


 
Mike B.   (2004-01-21 16:07) [49]

Когда я ещё был маленький мальчик, мне было очень интересно почему нельзя делить на ноль.
То есть меня не удивлял сам факт запрета - уже тогда мне было понятно, что в этом мире вообще ничего нельзя делать интересного и приятного, а наоборот нужно делать скучное и противное. Умываться например нужно, а побрызгаться уже нельзя. Но мне было интересно, что же будет, если всё же на этот ноль разделить? Ничего не будет, отвечали взрослые, потому что нельзя делить, понимаешь, НЕЛЬЗЯ. Ну так я понимаю, что нельзя. В розетку например пальцы тоже совать нельзя, но всё равно ведь можно сунуть и тогда убьет током. И вообще, как правило все идиотские запреты взрослых как-то всё же обосновывались - глисты там подхватишь или дядя будет ругаться. А тут нельзя делить и всё. Видимо, думал я, тогда произойдёт что-то такое страшное, что даже взрослые боятся об этом говорить.
А потом, гораздо позже, я узнал что если разделить на ноль, получится Бесконечность. И ничего в этой Бесконечности нет страшного - так просто цыферка, восьмёрка на боку. Бывает плюс бесконечность, бывает минус. Её даже можно складывать и вычитать. Только Бесконечность плюс Бесконечность всё равно будет Бесконечность, хотя чисто по ощущениям, две Бесконечности конечно больше, чем одна. И Бесконечность минус Бесконечность тоже будет Бесконечность, небольшая, но всё равно без конца и края.
И совершенно непонятно, зачем от меня это так долго скрывали. Видимо люди ничего вообще не понимают в Бесконечности, а когда они чего-то не понимают, то это сразу нельзя.
За.... уже совсем.
(с) Дм. Горчев

А если серьезно, в том же Дейте содержатся ссылки на обширную библиографию по данному вопросу. Особенно много ссылок на тов. Дарвена (Darwen) и Уотсона. Советую найти - зачитаешься.


 
DiamondShark   (2004-01-21 17:48) [50]


> Следовательно, FOREIGN KEY не должен содержать NULL

Не должен, но может.
Например, в таблице "Человеки" NULL в поле "Жена" будет означать "нету жаны".


 
Тимохов   (2004-01-21 18:10) [51]

Null нужен.
Я бы, правда, еще добавил бы к нему unassigned.
Вообще круто было бы...


 
Sandman25   (2004-01-21 18:47) [52]

[51] Тимохов © (21.01.04 18:10)

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

[24] Polevi © (21.01.04 13:53)

Верю. Если Вам не нужно считать AVG().


 
Fantasist   (2004-01-21 20:32) [53]


> Я думаю не стоит примешивать сюда Дельфи. Например, в Си nil отсутствует, его заменяет именно NULL.


Не путайте понятие с условным обозначением. NULL в БД - это действительно отсутсвие значения. В С (как и в С++ и Делфи, да и пожалуй во всех остальных языках) такого понятия нет. Там есть понятие нуля. Хотя в С/С++ некоторые любят определять макрос NULL, но он на самом деле является обыкновенным числовым нулем (обычно имеющий тип void*). В Делфи nil - это тоже просто 0, но только для указателей. Ноль ведет себя как любое другое целое число.

В БД NULL-ов стараюсь избегать. Из моего опыта проблем с ними больше, чем пользы.


 
Fantasist   (2004-01-21 20:47) [54]


> Кроме того, Дельфи отработает NULL не всегда, так следующий код:

v := null;
ShowMessage(IntToStr(VarAsType(v, varInteger)));

приводит к ошибке: "Could not convert variant of type (Null) into type (Integer)"


А это уже работа с типом variant, спецификация которого включает себя понятие NULL. Оно похоже на понятие null из БД, однако variant не относиться к простым типам.



Страницы: 1 2 вся ветка

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

Наверх




Память: 0.56 MB
Время: 0.009 c
3-29209
Caries
2004-01-20 11:14
2004.02.10
Как программно добавить поле lookup в TTable?


1-29316
ncua
2004-01-29 22:56
2004.02.10
Как изменять размеры контролов разтягивая мышой в runtime


1-29303
Petrovitch
2004-01-30 11:01
2004.02.10
Рус/Lat как переключить в программе?


3-29205
Pako
2004-01-20 08:40
2004.02.10
Select


14-29588
Ig
2004-01-20 00:20
2004.02.10
Как в строковом массиве определить длину?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский