Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Обязательность полей / 25 сообщений из 77, страница 1 из 4
30.12.2004, 13:07
    #32851415
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обязательность полей
Стоит ли В справочнике иметь "пустой" элемент, для того чтобы в полях , использующих этот справочник поставить признак "Обязательное".

Т.е.
Пусть есть таблица "Клиенты" и таблица "Города"
В таблице "Клиенты" поле "ИзГорода" - ВК на "Города"
Бывает что не известно из какого города клиент, соответсвенно "ИзГорода"=NULL,
тогда в запросе придётся использовать LEFT JOIN, а если сделать "ИзГорода" обязательным и в "Города" добавить "---", тогда INNER JOIN.

Вопросы : Кто как ? Почему?

IMHO, Mon$te®
...
Рейтинг: 0 / 0
30.12.2004, 13:15
    #32851442
tru55
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обязательность полей
Ну не зря же существует null. Он строго означает "нет значения", а все другое - зависит от контекста. Т.е. в общем случае придется для каждой сущности иметь свое значение "Null"
...
Рейтинг: 0 / 0
30.12.2004, 13:36
    #32851490
Серега
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обязательность полей
4d_monsterВопросы : Кто как ? Почему?
Иногда отсутствие NULL повышает производительность запросов (типа при where field_name is null индексы не работают). Но все это надо взвешивать в каждом конкретном случае.
...
Рейтинг: 0 / 0
30.12.2004, 13:41
    #32851495
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обязательность полей
Спасиббо за ответы.

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

Как только стал вводить тестовые строки (прям в таблицы), понял: надо и то и другое.

IMHO, Mon$te®
...
Рейтинг: 0 / 0
30.12.2004, 14:31
    #32851588
Роман Дынник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обязательность полей
некоторые утверждают что присутствие null свидетельствует об ошибке проектирования.
Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
30.12.2004, 14:58
    #32851661
guest_20040621
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обязательность полей
> По логике задачи мне казалось что надо использовать и null и " - - - ".

По логике задачи нет и не может быть null значений и тем более непонятных значений "---".

Описанные связи огранизуются только и исключительно посредством третьей таблицы.
...
Рейтинг: 0 / 0
30.12.2004, 15:16
    #32851695
Old Nick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обязательность полей
Абсолютно правильная система (идеальная, как идеальный газ):
1. не должна иметь null
2. для ввода первичных данных должен использоваться только insert (никаких update и delete не должно быть вообще в системе)
3. для отчетов и вывода данных использовать только select

В принципе это реализуемо, но на практике не всегда целесообразно
...
Рейтинг: 0 / 0
30.12.2004, 15:44
    #32851764
tru55
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обязательность полей
2 Роман Дынник
2 Old Nick

Что-то я не въехал. Это новогодний прикол?
...
Рейтинг: 0 / 0
30.12.2004, 16:07
    #32851812
Old Nick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обязательность полей
Поясню для непонимающих приколов :-)

1.

Можно реализовать города в виде папок, тогда клиентов можно хранить кроме папки Клиенты еще и в конкретных городах, как в папках. При этом не значит что клиентов будет 2, просто ссылка на клиента будет в двух папках. В таком случае если какой-то клиент находится только в папке Клиенты, это значит что город для него еще не определен. В дальней его можно будет поместить в конкретную папку Город. Почитайте Анатолия Тенцера, у него это хорошо описано. И у меня сделано так же.

2.

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

Тоже не менее часто необходимо удалять объекты не физически, а логически, чтобы иметь возможность восстановления записи. Для этого достаточно создать создать таблицу Deleted и помещать туда указатели на удаленные объекты.

3.

При правильно построенной архитектуре сложные выборки будут не нужны, только группировки с вычислениями.
...
Рейтинг: 0 / 0
30.12.2004, 16:21
    #32851849
tru55
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обязательность полей
1. Понял очень смутно, видимо привык объясняться в терминах реляционной модели, т.е. в таблицах. Однако насчет null - абсолютно несогласен, это в порядке вещей и очень даже логично

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

3. Против SELECT для запросов я и не возражал, только непонятно - сложная выбока и SELECT - это не одно и то же?
...
Рейтинг: 0 / 0
30.12.2004, 16:23
    #32851852
Old Nick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обязательность полей
Я ведь написал, что это в идеале :-)

На практике полностью придерживаться этих правил далеко не всегда целесообразно

--------------------
Не учи отца и баста!
...
Рейтинг: 0 / 0
30.12.2004, 16:29
    #32851870
Old Nick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обязательность полей
tru55

А знаешь откуда взялся на самом деле null? Его ведь не специально придумали.

Возмем к примеру таблицу в которой хранится вся информация базы, как она будет выглядеть?

Table_ID
Column_ID
Row_ID
Value

так вот, если у нас в какой-то ячейке пользовательской таблицы значение null, то это значит, что для этой ячейки нет записи в вышеприведенной таблице и при формировании пользовательской таблицы в этом месте просто получается дыра. Это можно хорошо проследить если поработать с кубами (OLAP). Именно поэтому

--------------------
Не учи отца и баста!
...
Рейтинг: 0 / 0
30.12.2004, 16:36
    #32851884
tru55
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обязательность полей
С OLAP не работал, спорить не буду. Однако простой пример (из любимой Oracle обучалки) - для простоты.

Есть отделы department
dep_id
dep_name

Есть служащие employees
emp_id
emp_name
dep_id

где dep_id - внешний ключ на department

Завожу я служащего, который еще не приписан к отделу. Что в таком случае должно содержать dep_id ?
И ведь подобных случаев масса.
...
Рейтинг: 0 / 0
30.12.2004, 16:39
    #32851888
Old Nick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обязательность полей
А ведь служащий может быть не к одному отделу приписан. Допустим я в отделе ИТ и при этом мне не хватает денег и я решил подрабатывать техничкой по вечерам, а потом еще и сторожить по ночам :-)
...
Рейтинг: 0 / 0
30.12.2004, 16:55
    #32851915
guest_20040621
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обязательность полей
> Однако простой пример (из любимой Oracle обучалки)

Для "обучалки" такой пример подойдет. Для проектирования - нет. Учите матчасть.
...
Рейтинг: 0 / 0
30.12.2004, 16:58
    #32851924
ЦК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обязательность полей
2 tru55

> 2 Роман Дынник
> 2 Old Nick
>
> Что-то я не въехал. Это новогодний прикол?

Ага. Приколисты. Как они, интересно, собираются работать без null с таким случаем:

"на сегодня не введен курс рубля к баксу"

---
ping eblan.us
...
Рейтинг: 0 / 0
30.12.2004, 17:06
    #32851943
Old Nick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обязательность полей
:-)))))))))))))))))))))))))))))))
...
Рейтинг: 0 / 0
30.12.2004, 17:09
    #32851950
tru55
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обязательность полей
Old NickА ведь служащий может быть не к одному отделу приписан. Допустим я в отделе ИТ и при этом мне не хватает денег и я решил подрабатывать техничкой по вечерам, а потом еще и сторожить по ночам :-)

Понятно, что в этом случае связь будет реализована через третью таблицу. Я говорил про случай, когда связь четко один-к-одному. Или вы полагаете, что в реальных системах такого не бывает
...
Рейтинг: 0 / 0
30.12.2004, 17:11
    #32851956
tru55
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обязательность полей
guest_20040621> Однако простой пример (из любимой Oracle обучалки)

Для "обучалки" такой пример подойдет. Для проектирования - нет. Учите матчасть.

А чем такой пример нереален? И почему вы думаете, что я новичек в БД?
...
Рейтинг: 0 / 0
30.12.2004, 17:13
    #32851964
Old Nick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обязательность полей
Бывает конечно, при упрощении модели.

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

--------------------
Не учи отца и баста!
...
Рейтинг: 0 / 0
30.12.2004, 17:14
    #32851965
Роман Дынник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обязательность полей
на сегодня не введен курс рубля к баксу
хранение null и проверка на null это разные вещи.
Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
30.12.2004, 17:23
    #32851991
Old Nick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обязательность полей
tru55, я не говорю что примеры приведенные Вами нельзя реализовывать. Вполне возможно и допустимо. Просто меня что-то понесло сегодня :-)

--------------------
Не учи отца и баста!
...
Рейтинг: 0 / 0
30.12.2004, 17:29
    #32852004
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обязательность полей
Такое бывает довольно часто. Я поступаю так. Допустим имеется таблица Люди и справочник Города

Люди (Имя char not Null, КодГорода int not Null default 0)

Города (КодГорода Int identity (0,1), Имя Null)

В Городах имею запись (0,Null)

Для людей, у которых неизвестен Город - КодГорода=0
...
Рейтинг: 0 / 0
30.12.2004, 17:33
    #32852016
Old Nick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обязательность полей
А если нужно вывести отчет по людям в городе и при этом пользователь должен подставить город выбрав его из справочника?
Если не выбрать никакой город, то как вести себя? Вывести все записи или те что с 0?
Лучше иметь в справочнике неопределенный город и подставлять его по-умолчанию. Красивее получается.

--------------------
Не учи отца и баста!
...
Рейтинг: 0 / 0
30.12.2004, 17:43
    #32852029
guest_20040621
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обязательность полей
> А чем такой пример нереален?

Почему нереален? Если Вы говорите, что он есть в учебной бд, то он наверняка там есть. Его реальность сомнений не вызывает.

> И почему вы думаете, что я новичек в БД?

Я ничего по этому поводу не думаю. Я просто ответил на Ваш вопрос. "Учите матчасть" относится к тому, что вопрос использования null значений освещается практически в любой литературе по реляционным базам данных, потрудитесь прочесть хоть что-нибудь.
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Обязательность полей / 25 сообщений из 77, страница 1 из 4
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]