Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> czy to prawda ze nalezy unikac przechowywania pol NULL?
michat34
post
Post #1





Grupa: Zarejestrowani
Postów: 200
Pomógł: 1
Dołączył: 4.08.2012

Ostrzeżenie: (10%)
X----


gdzies kiedys wpadlem na taki artykul gdzie pisalo by unikac przechowywania null, gdyz zmniejszaja wydajnosc,powoduja nieczytelnosc i cos tam jeszcze. czy to prawda?
Go to the top of the page
+Quote Post
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Nie, to nie prawda.
Go to the top of the page
+Quote Post
irmidjusz
post
Post #3





Grupa: Zarejestrowani
Postów: 279
Pomógł: 60
Dołączył: 25.02.2012

Ostrzeżenie: (0%)
-----


A w podręcznikach od MySQLa tak piszą, że lepiej nie używać nulli jeśli nie są potrzebne - bo nulle wymagają nie tylko dodatkowych operacji, ale i dodatkowego miejsca na przechowywanie tej specjalnej wartości. I gdzie tu prawda?
Go to the top of the page
+Quote Post
starko
post
Post #4





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 19.08.2011
Skąd: Poznań

Ostrzeżenie: (10%)
X----


Martwicie się o wydajność jakbyście pisali potężne bazy danych. Null jest po to by go używać - unikamy dzięki temu pustych pól, które mogą spowodować zamieszanie w zapytaniach.
Go to the top of the page
+Quote Post
nospor
post
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Na pole z NULLem baza mysql potrzebuje dodatkowego jednego bajta.
Jeśli macie pole, na które macie założoną relację i pole to może być puste, to musicie to pole dać z NULLem, gdyż inaczej nie przejdzie Wam ta relacja.
Gdy macie macie zaś pole, na które nie macie założonej relacji, a pole to jest polem liczbowym i może przyjmować liczby większe od 0 lub nic, to wówczas możecie dać je jako NOT NULL a zamiast NULL wstawiać 0. Zaoszczędzicie jeden bajt. Ja tak właśnie robię. I nie chodzi tu już o ten jeden bajt. Wydaje mi się to lepszym rozwiązaniem niż dawać NULL zamiast 0. Ale ja to robię bo wiem co robię. Gdy potrzebuję relacji, to jak najbardziej używam NULL.

Także wszystko zależy jak leży i należy używać to ze świadomością co się robi.

ps: NOT NULL też bodajże jest szybsze w indeksowaniu
ps2: i też często widziałem zalecenia by unikać NULL jeśli jest to możliwe
Go to the top of the page
+Quote Post
Crozin
post
Post #6





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Jeżeli jakieś pole może przyjąć "logiczne nic", powinno to być zrealizowane przez NULL, nie przez zero, pusty ciąg czy datę 0000-00-00 00:00:00. Ewentualne różnice w szybkości działania bazy czy jej rozmiaru na dysku będą marginalne i na pewno nie będą przyczyną problemów z wydajnością.

Dobry, czytelny, jasny projekt niemal zawsze jest lepszy niż 0.02% wzrost wydajności.

PS. Domyślam się, że większość artykułów odnoszących się do unikania NULL jest napisanych na podstawie źle zaprojektowanych baz danych, gdzie 15 z 20 kolumn w wierszu ma wartość NULL.

Ten post edytował Crozin 11.11.2012, 15:32:08
Go to the top of the page
+Quote Post
nospor
post
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Też kiedyś wychodziłem z założenia, że jak coś ma być nic znaczy że ma być NULL. Jednak przestawiłem się na 0 gdy NULL nie jest wymagany i nie uważam, że czytelność/przejrzystość projektu na tym cierpi.

ps: arty były pisane raczej przez fachowych ludzi i nie dotyczyły tabel z X kolumn takich czy owakich. Dotyczyły ogólnych wskazówek dotyczyczących wydajnego korzystania z mysql
Go to the top of the page
+Quote Post
Damonsson
post
Post #8





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


To jest trochę bez sensu, bo jak się jednak patrzy na bazę danych, to jest różnica czy nie wiem na przykład: użytkownik należy do grupy o nazwie '0', czy nie należy do żadnej i wtedy co też ma mieć '0'? Wg mnie to nie jest mądrze napisane, aby unikać NULL.
Go to the top of the page
+Quote Post
irmidjusz
post
Post #9





Grupa: Zarejestrowani
Postów: 279
Pomógł: 60
Dołączył: 25.02.2012

Ostrzeżenie: (0%)
-----


Ale przecież to zależy od konkretnej sytuacji, od konkretnego projektu bazy danych! W jednej bazie użytkownik może należeć do grupy o nr 0, 1, ... albo nie należeć do żadnej, co będzie oznaczane wartością NULL. W innym projekcie może w ogóle nie istnieć grupa nr 0 i wówczas 0 może z powodzeniem oznaczać brak grupy!

Inny przykład: jak zapiszesz liczbę dzieci użytkownika? Czy jeśli nie ma on dzieci, użyjesz 0 czy NULL? (IMG:style_emoticons/default/smile.gif) Przecież 0 wystarczy, NULL tu nie jest potrzebne. Ale jeśli potrzebujesz wiedzieć, czy wiadomo, ile użytkownik posiada dzieci, to NULL może okazać się w sam raz, by taką informację zapisać: NULL to nie wiadomo ile ma dzieci, 0 - brak dzieci gdy wiadomo, że ich nie ma.

Wszystko zależy od potrzeb, od projektu. W wielu przypadkach NULL nie jest potrzebne, bo nie niesie żadnej realnej informacji i z powodzeniem może być zastąpione przez domyślną wartość typu 0, szczególnie wtedy, gdy nie potrzebujesz rozróżniać braku wartości od wartości oznaczającej "nic".
Go to the top of the page
+Quote Post
Damonsson
post
Post #10





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


No przecież właśnie to samo napisałem wyżej ^^

Nie można narzucać haseł "Nie stosuj NULLa, to zło i kropka". Bo to nie jest prawda, na co przykładem jest to co napisałem w moim poście.
Go to the top of the page
+Quote Post
Szymciosek
post
Post #11





Grupa: Zarejestrowani
Postów: 1 168
Pomógł: 126
Dołączył: 5.02.2010
Skąd: Świdnica

Ostrzeżenie: (0%)
-----


Wg. mnie jeśli potrzebujesz, to korzystasz, po coś jest stworzone.
Go to the top of the page
+Quote Post
alegorn
post
Post #12





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

Ostrzeżenie: (0%)
-----


korzystanie z wartości null powoduje wymuszone korzystanie z logiki trójwartościowej - co jest upierdliwe.
nie da się konstruować zapytań na obecność lub nieobecność danej wartości - dla prawidłowego wyniku - trzeba uwzględniać także wartości null.

z logicznego punktu widzenia wartość null, powinna być wykorzystywana jedynie w przypadku braku danej właściwości - a nie jej zerowej wartości (zero jest wartością)


przykład pierwszy, od czapy z lekka jaki mi przychodzi to tabela pojazdy, i tabela cechy pojazdu.
wpisując helikopter i samochód do tabeli pojazdy w jej cechach będziemy mieli:

pojazd_id | nazwa
1 | helikopter
2 | autobus

pojazd_id | koła | drzwi | śmigło
1 | 3 | 4 | 2
2 | 6 | 3 | null

podsumowując, wartość null, powinno się używać w przypadku, gdy opisywany obiekt nie posiada, i nie powinien posiadać danej właściwości, w każdym innym przypadku, powinno się dawać wartość domyślną.

a jak już programiści to wykorzystują - to już aż żal opisywać...
z drugiej strony, ilu programistów dobrze rozumie teorie baz danych... (IMG:style_emoticons/default/wink.gif)

j.
Go to the top of the page
+Quote Post
Damonsson
post
Post #13





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Tu akurat podałeś przykład w którym należy uniknąć NULLa i podać 0.
Go to the top of the page
+Quote Post
markonix
post
Post #14





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


Cytat(irmidjusz @ 11.11.2012, 21:04:28 ) *
Inny przykład: jak zapiszesz liczbę dzieci użytkownika? Czy jeśli nie ma on dzieci, użyjesz 0 czy NULL? (IMG:style_emoticons/default/smile.gif) Przecież 0 wystarczy, NULL tu nie jest potrzebne. Ale jeśli potrzebujesz wiedzieć, czy wiadomo, ile użytkownik posiada dzieci, to NULL może okazać się w sam raz, by taką informację zapisać: NULL to nie wiadomo ile ma dzieci, 0 - brak dzieci gdy wiadomo, że ich nie ma.


Jak dla mnie 0 to konkretna wartość - brak dzieci, a wartość NULL to brak informacji.
Przykładowo przy rejestracji tworzy się wiersz z daną osobą i kilka kolumn nieobowiązkowych - w tym liczba dzieci.

Teraz pomyślcie jak wyglądałoby by wyciąganie sumy, średniej dzieci. Jak sprawdzisz kto nie uzupełnił tej wartości (profilu)?
Ja ostatnio zacząłem doceniać korzyści NULL (IMG:style_emoticons/default/smile.gif)

Ten post edytował markonix 12.11.2012, 12:57:38
Go to the top of the page
+Quote Post
Zielonkawy18
post
Post #15





Grupa: Zarejestrowani
Postów: 152
Pomógł: 4
Dołączył: 4.10.2012

Ostrzeżenie: (10%)
X----


"Tu akurat podałeś przykład w którym należy uniknąć NULLa i podać 0. "

Dyskusja bardzo ciekawe. Według tego co napisał autor postu o helikopterach "null używamy wtedy kiedy dana własność nigdy nie jest spełniona dla danego obiektu" Więc samochód nie ma 0 śmigieł bo 0 jest wartością, ale nie ma ich wcale czyli nie posiada wartości ( nawet 0 ) tylko NULL. Tak to rozumiem i ma to nawet sens, ale nigdy nie tworzyłem dużych baz danych, max 20-30 tabel. Przy takiej złożoności nie można mówić o problemach wydajnościowych. Przy rozglełych bazach i skomplikowanych zapytaniach może mieć znaczenie czy używamy DISTINCT czy NOT EXIST, ale optymalizacja SQL to inna sprawa.

Pozdrawiam.

EDIT:

Chociaż ja zawsze tworząc tabelę jeżeli jakaś wartość nie jest wymagana to poprostu piszę DEFAULT NULL. (IMG:style_emoticons/default/smile.gif) Może i źle, ale dowiem się z tego tematu co dalej :].

Można poczytać: http://www.bennadel.com/blog/85-Why-NULL-V...ss-Required.htm
Hasło: Null in database, how use.

Ten post edytował Zielonkawy18 12.11.2012, 13:17:47
Go to the top of the page
+Quote Post
alegorn
post
Post #16





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

Ostrzeżenie: (0%)
-----


Cytat(Damonsson @ 12.11.2012, 11:53:40 ) *
Tu akurat podałeś przykład w którym należy uniknąć NULLa i podać 0.

no wręcz odwrotnie (chyba ze chcesz policzyć to śmigło od wentylatora..) tutaj nasz obiekt - czyli autobus nie ma takiej właściwości, i mieć nie może.

Cytat(markonix @ 12.11.2012, 12:56:20 ) *
Jak dla mnie 0 to konkretna wartość - brak dzieci, a wartość NULL to brak informacji.
Przykładowo przy rejestracji tworzy się wiersz z daną osobą i kilka kolumn nieobowiązkowych - w tym liczba dzieci.

Teraz pomyślcie jak wyglądałoby by wyciąganie sumy, średniej dzieci. Jak sprawdzisz kto nie uzupełnił tej wartości (profilu)?
Ja ostatnio zacząłem doceniać korzyści NULL (IMG:style_emoticons/default/smile.gif)


tak, jest to dobry przykład trójwarstwowej logiki.
mając 4 wpisy (ilość dzieci) programista używa nulla jako wartość domyślną zamiast 0.
user logując się - raz wpisze 0, a drugi raz zostawi pole puste (no bo skoro nie ma dzieci, to dlaczego by nie....)


w tabeli więc ląduje nam:
4
2
0
null


jaka jest średnia ilość dzieci ?
sprawdzam:: SELECT AVG(test) FROM `test`

1,5 czy 2 (IMG:style_emoticons/default/questionmark.gif) ?

mysql powie że 2 - co de facto jest guzik prawda, w przypadku jeśli programista zamiast '0' będzie pakował null wtedy,
wartością powinno być 1,5 ale puki nikt z księgowości nie zwróci uwagi na ten błąd - będziesz generować błędy aż miło...
taki, i temu podobne kwiatki - nieświadomie programiści generują notorycznie.


j.
Go to the top of the page
+Quote Post
everth
post
Post #17





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

Ostrzeżenie: (0%)
-----


Bo problem NULLa to w ogóle problem z teorią relacyjnych baz danych. W pierwszej odsłonie chyba w ogóle go nie było bo z założenia baza miała być zawsze w spójnym stanie a NULL (brak danych) ten piękny obraz zaburzał. Swego czasu świetnie opisał ten problem C. Date w "Wstępie do relacyjnych baz danych" (książka dość leciwa ale teoria chyba za bardzo się nie zmieniła). Co do wydajności to też nie byłbym taki pewien - Date wzmiankował że proste algorytmy optymalizujące SQLe działają znakomicie w relacyjnych bazach gdzie obowiązuje dwuwartościowa logika (czytaj nie ma NULLa) a są kompletnie nieprzewidywalne w wypadku logiki trójwartościowej. Tak samo jak wewnętrzne złączenia teoretycznie są mniej obciążające dla bazy niż wszelkiego typu złączenia zewnętrzne.

W praktyce - na zajęciach ze statystyki uczyli mnie że nie zostawia się w danych pustym miejsc tylko definiujemy sobie jakąś wartość dla danego typu i traktujemy ją jak brak danych. Ja tak robię też w bazach, w sumie nie wiem czy dobrze (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
d3ut3r
post
Post #18





Grupa: Zarejestrowani
Postów: 709
Pomógł: 176
Dołączył: 24.10.2010

Ostrzeżenie: (0%)
-----


W sumie to nigdy się nad tym nie zastanawiałem, z założenia wychodzę że jak czegoś nie ma i chcemy mieć o tym informacje to jest to NULL a nie 0 lub pusty string, Z punktu widzenia skryptu często NULL można zastąpić przez 0 i nic się nie stanie, jednak jeżeli mamy tak jak wyżej podano profil użytkownika to chcemy wiedzieć czy użytkownik nie ma dzieci czy też nie podał tej informacji tutaj już różnica jest spora.

Inny przykład, liczba komentarzy do artykułu tutaj bez różnicy możemy użyć NULL lub 0 bo wychodzi nam ta sama informacja brak komentarzy do podanego artykułu.

Cytat
W praktyce - na zajęciach ze statystyki uczyli mnie że nie zostawia się w danych pustym miejsc tylko definiujemy sobie jakąś wartość dla danego typu i traktujemy ją jak brak danych. Ja tak robię też w bazach, w sumie nie wiem czy dobrze


Tylko wówczas co za różnica ? NULL przecież z punktu widzenia bazy nie jest pusty zajmuje 1 bajt. Poza tym nie zawsze jest to możliwe, co jeżeli masz pole int i każda wartość jest poprawna czyli nie masz miejsca na 1 wartość oznaczoną jako brak danych ?
Go to the top of the page
+Quote Post
markonix
post
Post #19





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


Cytat(alegorn @ 12.11.2012, 15:44:39 ) *
no wręcz odwrotnie (chyba ze chcesz policzyć to śmigło od wentylatora..) tutaj nasz obiekt - czyli autobus nie ma takiej właściwości, i mieć nie może.



tak, jest to dobry przykład trójwarstwowej logiki.
mając 4 wpisy (ilość dzieci) programista używa nulla jako wartość domyślną zamiast 0.
user logując się - raz wpisze 0, a drugi raz zostawi pole puste (no bo skoro nie ma dzieci, to dlaczego by nie....)


w tabeli więc ląduje nam:
4
2
0
null


jaka jest średnia ilość dzieci ?
sprawdzam:: SELECT AVG(test) FROM `test`

1,5 czy 2 (IMG:style_emoticons/default/questionmark.gif) ?

mysql powie że 2 - co de facto jest guzik prawda, w przypadku jeśli programista zamiast '0' będzie pakował null wtedy,
wartością powinno być 1,5 ale puki nikt z księgowości nie zwróci uwagi na ten błąd - będziesz generować błędy aż miło...
taki, i temu podobne kwiatki - nieświadomie programiści generują notorycznie.


j.


Jeżeli ktoś nie wpisze wartości to będzie rzutować na INT i da zero, nie NULL.
No jak dla mnie średnia dzieci to prawidłowo 2 - liczy tylko na pełnych danych.
A mając NULLe zawsze można dodać opcje - "Brak wartości uznaj jako zero" (nie wiem czy da radę na poziomie samej bazy, ale nawet jak nie to zawsze to zrobisz później).
Go to the top of the page
+Quote Post
nospor
post
Post #20





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Nie można narzucać haseł "Nie stosuj NULLa, to zło i kropka". Bo to nie jest prawda, na co przykładem jest to co napisałem w moim poście.
Nikt nie napisał żeby unikać NULLa bo to zło i kropka. Napisano by unikać NULLa gdy naprawdę nie ma potrzeby go stosować. To drobna różnica. (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 25.08.2025 - 09:00