Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Подскажите насчет NULLов в базе / 25 сообщений из 53, страница 1 из 3
28.07.2005, 19:37
    #33190362
Kite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите насчет NULLов в базе
Где-то встречала выражение, что хорошо спроектированная БД не должна содержать большого количества NULL значений. Верно ли это утверждение и если верно, то где найти обоснование, что почитать?
И может поделитесь рассуждениями и наблюдениями из опыта, насколько мешают NULL значения при эксплуатации БД.
Спасибо заранее...
...
Рейтинг: 0 / 0
28.07.2005, 19:42
    #33190368
XM
XM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите насчет NULLов в базе
Kite wrote:
> Где-то встречала выражение, что хорошо спроектированная БД не должна
> содержать большого количества NULL значений. Верно ли это утверждение и
> если верно, то где найти обоснование, что почитать?
http://www.dbdebunk.com/page/page/1706744.htm
Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
29.07.2005, 10:20
    #33190858
Estets
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите насчет NULLов в базе
KiteГде-то встречала выражение, что хорошо спроектированная БД не должна содержать большого количества NULL значений.
На мой взгляд, все определяется здравым смыслом. А здравый смысл подсказывает что в реальной системе очень большое количество полей может быть необязательно к заполнению. Простейший пример - справочник партнеров который содержит кроме наменования инн, оконх, окпо, егрн значения которых в большинстве случаев неизвестно.

По крайней мере про старые версии Sybase и MS SQL говорили что сервер более оптимально располагает на страницах NOT NULL данные, что приводит к небольшому ускорению дисковых операций. Но по моему не стоит специально обращать внимание на это.
...
Рейтинг: 0 / 0
29.07.2005, 10:33
    #33190902
LSV
LSV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите насчет NULLов в базе
Простейший пример - справочник партнеров который содержит кроме наменования инн, оконх, окпо, егрн значения которых в большинстве случаев неизвестно.Это, увы не пример удачной системы. А если появятся ещё 5 реквизитов (например, введут к-л новые требования) ? Будете поля добавлять ?

Впрочем, некоторое кол-во нулов это вполне нормальная ситуация. Главное, чтоб в запросах проверок на НУЛЛ было поменьше, т.к. в этом случае сервера работают неоптимально.
...
Рейтинг: 0 / 0
29.07.2005, 10:57
    #33190994
Estets
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите насчет NULLов в базе
[quot LSVЭто, увы не пример удачной системы. А если появятся ещё 5 реквизитов (например, введут к-л новые требования) ? Будете поля добавлять?
[/quot]
Угу, иначе кто мне деньги платить будет за поддержку ;)
А по поводу хранения реквизитов в отдельной таблице или в основной, достаточно много рассуждений на этом форуме. Скажу сразу у нас в системе реализованы оба подхода. Все что входит в "анкету" лица сидит в основной таблице, все доп. данные в динамических классификаторах к анкете. Как обычно всегда требуется баланс между удобством и производительностью.
...
Рейтинг: 0 / 0
29.07.2005, 11:16
    #33191096
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите насчет NULLов в базе
Дейт с Давином с самого начала были против null'ов. И основной упор делали во-первых на то что в современных СУБД под null понимается 2 разных понятия - собственно null и unk (unknown)... во-вторых на сложности с формулированием предиката для отношения содержащего null

С первым я полностью согласен, со вторым где-то на 30% ;)

Правда в реальных системах null или какая-либо константа его заменяющая - это меньшее из зол
...
Рейтинг: 0 / 0
29.07.2005, 11:29
    #33191153
aechka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите насчет NULLов в базе
LSV[quot ]Простейший пример - справочник партнеров который содержит кроме наменования инн, оконх, окпо, егрн значения которых в большинстве случаев неизвестно.Это, увы не пример удачной системы. А если появятся ещё 5 реквизитов (например, введут к-л новые требования) ? Будете поля добавлять ?

А как по-другому?
...
Рейтинг: 0 / 0
29.07.2005, 12:22
    #33191367
Urri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите насчет NULLов в базе
KiteГде-то встречала выражение, что хорошо спроектированная БД не должна содержать большого количества NULL значений. Верно ли это утверждение и если верно, то где найти обоснование, что почитать?
И может поделитесь рассуждениями и наблюдениями из опыта, насколько мешают NULL значения при эксплуатации БД.
Спасибо заранее...Я бы сказал немного по-другому: верно, что хорошо нормализованная БД не должна содержать большого количества NULL значений. Но хорошо спроектированная и хорошо нормализованная БД - далеко не всегда тождественные понятия.
...
Рейтинг: 0 / 0
29.07.2005, 13:22
    #33191567
Kite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите насчет NULLов в базе
Спасибо всем за высказанные мнения.
А как ведут себя индексы, построенные по полям, содержащим множество значений NULL?
...
Рейтинг: 0 / 0
29.07.2005, 14:58
    #33191876
Роман Дынник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите насчет NULLов в базе
Полностью избавленная от null-ов БД - полностью декомпозированная - для
каждого атрибута своя таблица )))))


Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
01.08.2005, 12:53
    #33194157
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите насчет NULLов в базе
Kite

К сожалению, поведение индексов разнится в зависимости от СУБД
...
Рейтинг: 0 / 0
01.08.2005, 17:21
    #33194907
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите насчет NULLов в базе
Kite. Не обращайте внимания. сколько Вам нужно NULL, столько и делайте.
В кадровсой программе возможны NULL
Дата смерти
Дата Увольнения
Дата выхода на пенсию
Имеющиеся правительственные награды
Телефон
И дофига других.

Типа размера обуви, которая нужна только тем, кто имеет право на на выдачу обуви как спецодежды.
...
Рейтинг: 0 / 0
02.08.2005, 18:19
    #33197621
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите насчет NULLов в базе
KiteА как ведут себя индексы, построенные по полям, содержащим множество значений NULL?
Значение NULL в подавляющем большинстве случаев низкоселективно, а следовательно использование b-индекса для выбора записей по условию field is null будет неэффективным.

В принципе я вижу три варианта:

обрабатывать null по общей схеме, как и любое другое значение

исключать null записи из индекса

хранить null в некотором особом списке

Третий из них - не знаю, работает ли где-то, и несколько странен. Он был бы удобен, но непонятно как обобщить это решение для индекса по нескольким полям.

Вторым подходом пользуется Oracle; вроде упоминали, что такая настройка есть в Access, может и еще где-то. Таким образом уменьшаются потери на хранение ненужных данных в индексе, но индекс становится менее применим (не может быть использован в некоторых запросах, например select count).

Первый - вроде наиболее прост в понимании :)
...
Рейтинг: 0 / 0
02.08.2005, 19:02
    #33197711
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите насчет NULLов в базе
Значение NULL в подавляющем большинстве случаев низкоселективно,

как раз правота этого утверждения сильно зависит от того как эту БД проектировали... можно сделать и высокоселективным ;)
...
Рейтинг: 0 / 0
02.08.2005, 19:57
    #33197790
LSV
LSV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите насчет NULLов в базе
исключать null записи из индекса
Так работают многие промышленные СУБД. Точно знаю про MSSQL и Oracle.
Поэтому выражение:
WHERE MyField is null
низкопроизводительно.
...
Рейтинг: 0 / 0
03.08.2005, 16:20
    #33199741
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите насчет NULLов в базе
funikovyuriЗначение NULL в подавляющем большинстве случаев низкоселективно,

как раз правота этого утверждения сильно зависит от того как эту БД проектировали... можно сделать и высокоселективным ;)
Читаем: "... в подавляющем большинстве".

Да, если задаться целью, можно спроектировать базу, в которой это утверждение не выполняется. Согласен, даже сам могу такое сделать :)

Собственно я даже заранее согласен с тем, что это статистическое утверждение, причем по моей личной статистике. И если кто-нибудь расскажет, на каких задачах он получает резко другие показатели, я с большим интересом его послушаю. Что касается баз, с которыми я имею дело прямо сейчас, то...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SQL> select
   2     round (max (ratio),  2 ) "max",
   3     round (min (ratio),  2 ) "min",
   4     round (avg (ratio),  2 ) "avg",
   5     round (stddev (ratio),  2 ) "stddev"
   6   from
   7     (select t.owner, t.table_name, t.num_rows, i.num_rows,
   8      i.num_rows / t.num_rows *  100  ratio
   9      from dba_indexes i, dba_tables t
  10      where i.index_type <> 'CLUSTER'
  11      and t.owner = i.owner and t.table_name = i.table_name
  12      and t.num_rows > greatest (i.num_rows,  1000 ));

       max        min        avg     stddev
---------- ---------- ---------- ----------
        100            0        33 , 52        42 , 59 
...
Рейтинг: 0 / 0
03.08.2005, 16:43
    #33199815
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите насчет NULLов в базе
LSVПоэтому выражение: WHERE MyField is null
Не только и не столько поэтому. В следующем примере consistent gets - это логические чтения.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
SQL> create table sn as
   2   select rownum i, case when mod (rownum,  5 ) =  0  then null else rownum end j
   3   from dba_objects, dba_objects
   4   where rownum <=  1000000 ;

Table created.

SQL> create index sn_i on sn (coalesce (j, - 1 ));

Index created.

SQL> create bitmap index sn_bi on sn (j);

Index created.

SQL> select /*+ FULL(sn) */ * from sn where j is null;

 200000  rows selected.

Elapsed:  00 : 00 : 07 . 79 

Execution Plan
----------------------------------------------------------                      
    0       SELECT STATEMENT Optimizer=ALL_ROWS (Cost= 584  Card= 207040  Bytes= 5383040 )
    1      0    TABLE ACCESS (FULL) OF 'SN' (TABLE) (Cost= 584  Card= 207040  Bytes= 5383040 )

Statistics
----------------------------------------------------------                      
       15356   consistent gets                                                    

SQL> select /*+ INDEX(sn sn_bi) */ * from sn where j is null;

 200000  rows selected.

Elapsed:  00 : 00 : 07 . 73 

Execution Plan
----------------------------------------------------------                      
    0       SELECT STATEMENT Optimizer=ALL_ROWS (Cost= 1426  Card= 207040  Bytes= 5383040 )
    1      0    TABLE ACCESS (BY INDEX ROWID) OF 'SN' (TABLE) (Cost= 1426  Card= 207040  Bytes= 5383040 )
    2      1      BITMAP CONVERSION (TO ROWIDS)
    3      2        BITMAP INDEX (SINGLE VALUE) OF 'SN_BI' (INDEX (BITMAP))

Statistics
----------------------------------------------------------                      
       15285   consistent gets                                                    

SQL> select /*+ INDEX(sn sn_i) */ * from sn where coalesce (j, - 1 ) = - 1 ;

 200000  rows selected.

Elapsed:  00 : 00 : 08 . 15 

Execution Plan
----------------------------------------------------------                      
    0       SELECT STATEMENT Optimizer=ALL_ROWS (Cost= 4  Card= 207040  Bytes= 5383040 )
    1      0    TABLE ACCESS (BY INDEX ROWID) OF 'SN' (TABLE) (Cost= 4  Card= 207040  Bytes= 5383040 )
    2      1      INDEX (RANGE SCAN) OF 'SN_I' (INDEX) (Cost= 3  Card= 4143 )

Statistics
----------------------------------------------------------                      
       28967   consistent gets                                                    
...
Рейтинг: 0 / 0
03.08.2005, 19:13
    #33200330
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите насчет NULLов в базе
У меня вот так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 select
      round (max (ratio),  2 ) "max",
      round (min (ratio),  2 ) "min",
      round (avg (ratio),  2 ) "avg",
      round (stddev (ratio),  2 ) "stddev"
    from
      (select t.owner, t.table_name, t.num_rows, i.num_rows,
       i.num_rows / t.num_rows  ratio
       from dba_indexes i, dba_tables t
      where i.index_type <> 'CLUSTER'
      and t.owner = i.owner and t.table_name = i.table_name
      and t.num_rows> 0  and (t.num_rows> 100  or i.num_rows> 100 )) --> greatest (i.num_rows, 1000));
maxminavgstddev61.0100.972.21

Но за примером высокой селективности далеко ходить также не надо. Например, взять так часто используемое отношение наследования и одно из возможных его представлений в РМД в виде одной таблицы на всю иерархию. Таблица должна содержать объединение всех атрибутов всех сущностей связанных наследованием... Далее достаточно чтобы какой-либо класс желательно выше по иерархии имел наибольшее количество объектов-записей...
...
Рейтинг: 0 / 0
04.08.2005, 14:02
    #33201686
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите насчет NULLов в базе
funikovyuriУ меня вот так
Хм. А приведенные Вами цифры - все в процентах? (спрашиваю, поскольку у Вас из селекта выпало умножение на сто, а сами цифры... пожалуй что неожиданные в другую сторону, прежде всего дико низкое среднее значение).

funikovyuriНо за примером высокой селективности далеко ходить также не надо.
Вопрос в частоте таких примеров. Как видите, у меня поиск тоже нашел табличку, где есть null-ы, но их количество ничтожно. Вопрос - как часто такое вcтречается и как часто в таких таблицах нужно искать по is null. Когда такое происходит - меня не особо напрягает создать соответствующий "более хитрый" индекс. А un mass все же null прискорбно неселективен :)
...
Рейтинг: 0 / 0
04.08.2005, 17:23
    #33202357
Slider_spb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите насчет NULLов в базе
Есть понятие внешнего ключа (FK). Если NULL не будет, какое значение должно содержать поле внешнего ключа в записи, не имеющее связи с подчиненной сущностью?
...
Рейтинг: 0 / 0
04.08.2005, 17:38
    #33202407
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите насчет NULLов в базе
Slider_spb
Боюсь, я не понял связи Вашего вопроса с темой и предыдущим обсуждением. Не расшифруете, что Вы имели в виду?
...
Рейтинг: 0 / 0
04.08.2005, 18:30
    #33202548
27 понуро бредущих кроликов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите насчет NULLов в базе
Slider_spbЕсть понятие внешнего ключа (FK). Если NULL не будет, какое значение должно содержать поле внешнего ключа в записи, не имеющее связи с подчиненной сущностью?

FK подразумевает связь с первичным ключем, скажем, справочной таблицы.
А NULL в PK - эт , мягко говоря, странно...
Если вы имеете ввиду NULL в поле FK - то смысл FK , который ссылается на несуществующие записи?

целочная ссылочность, однако...
...
Рейтинг: 0 / 0
04.08.2005, 18:43
    #33202568
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите насчет NULLов в базе
27 понуро бредущих кроликов Если вы имеете ввиду NULL в поле FK - то смысл FK , который ссылается на несуществующие записи?

целочная ссылочность, однако...
одно другому не противоречит. ссылочная целостность в смысле отсутствия в фк значений, не заданных в ПК (кроме случаев неопределенных родительских записей) - т.е. это частный случай ссылочной целостности. Частный случай - дерево с корнями, чьи родители неопределены. (сослаться на несуществующего родителя нельзя, но можно назваться корнем)
...
Рейтинг: 0 / 0
04.08.2005, 18:47
    #33202573
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите насчет NULLов в базе
softwarer

угу, с вашим выводом согласен

ЗЫ мои цифры, конечно же, не в процентах и avg у меня около 1 т.е. 97% так что они только подтверждают ваш вывод
...
Рейтинг: 0 / 0
05.08.2005, 09:47
    #33203172
27 понуро бредущих кроликов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите насчет NULLов в базе
4321 27 понуро бредущих кроликов Если вы имеете ввиду NULL в поле FK - то смысл FK , который ссылается на несуществующие записи?

целочная ссылочность, однако...
одно другому не противоречит. ссылочная целостность в смысле отсутствия в фк значений, не заданных в ПК (кроме случаев неопределенных родительских записей) - т.е. это частный случай ссылочной целостности. Частный случай - дерево с корнями, чьи родители неопределены. (сослаться на несуществующего родителя нельзя, но можно назваться корнем)

IMHO, FK существует отчасти именно для того, чтобы не допускать неопределенных родительских записей...
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Подскажите насчет NULLов в базе / 25 сообщений из 53, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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