![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 200 Pomógł: 1 Dołączył: 4.08.2012 Ostrzeżenie: (10%) ![]() ![]() |
gdzies kiedys wpadlem na taki artykul gdzie pisalo by unikac przechowywania null, gdyz zmniejszaja wydajnosc,powoduja nieczytelnosc i cos tam jeszcze. czy to prawda?
|
|
|
![]()
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.
|
|
|
![]()
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?
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 19.08.2011 Skąd: Poznań Ostrzeżenie: (10%) ![]() ![]() |
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.
|
|
|
![]()
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 |
|
|
![]()
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 |
|
|
![]()
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 |
|
|
![]()
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.
|
|
|
![]()
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". |
|
|
![]()
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. |
|
|
![]()
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.
|
|
|
![]()
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. |
|
|
![]()
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.
|
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 2 707 Pomógł: 290 Dołączył: 16.12.2008 Skąd: Śląsk Ostrzeżenie: (0%) ![]() ![]() |
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 |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 152 Pomógł: 4 Dołączył: 4.10.2012 Ostrzeżenie: (10%) ![]() ![]() |
"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 |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 341 Pomógł: 40 Dołączył: 23.06.2009 Ostrzeżenie: (0%) ![]() ![]() |
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. 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. |
|
|
![]()
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) |
|
|
![]()
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 ? |
|
|
![]()
Post
#19
|
|
Grupa: Zarejestrowani Postów: 2 707 Pomógł: 290 Dołączył: 16.12.2008 Skąd: Śląsk Ostrzeżenie: (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. 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). |
|
|
![]()
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)
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 25.08.2025 - 09:00 |