12. juli 2006 - 11:44Der er
11 kommentarer og 2 løsninger
NULL - godt eller skidt?
Hey.
Jeg har hørt flere gange at det er skidt at have NULL værdier i en tabel. Kan nogen forklare hvorfor - eller måske endda forklare hvorfor det er fuldstændig lige meget.
Håber der er nogle der gider deltage i diskussionen.
Det er fuldstændig lige meget. (også ikke alligevel ikke)
Problem ligger omkring tekstfelter, som er sat til ''. Så ser det ud til at felter som er lig '' og NULL er ens, men det er de ikke. Du finder f.eks ikke rækker hvor navn=NULL med "where navn=''" og omvent finder du ikke '' med "where navn is NULL". Og som du kan se er betingelsen for at finde NULL anderledes ("navn=''" <> "Navn IS NULL")
Hvis det endelig skal være så sæt alle tekstfelter til at være "NOT NULL" i oprettelsen. Så er du uden om tekst problematikken.
Men tal kan du ikke sætte til '', så her er NULL nødvendigt, hvis man skal kunne nulstille feltet.
NULL er altså nødvendig ved tal, og unødvendig ved tekst.
NULL - ulemple: man skal huske at teste på NULL hvergang man henter/gemmer/opdaterer feltet NULL - fordel: man kan vise at feltet IKKE er udfyldt. ifm. fremmednøgler bliver det også krævet at det nøglen peger på faktisk findes eller er NULL.
Jeg sidder og laver et kartotek der spænder over flere tabeller. Jeg kan bare ikke hitte ud af, om det jeg gør er det rigtige - det rigtige kommer selvfølgelig også an på øjnene der ser. Her er et eksempel på min tvivl:
Der bruges følgende tabeller: [MOVIE] id titel etc. etc.
[ACTOR] id name
[ACTOR_MOVIE] id id_actor id_movie
Her hænger tabellerne sammen - men kunne man ikke bare lave 10 felter i MOVIE der eksempelvis hed actor_ID1, actor_ID2 etc. Så kunne man undgår den ene tabel, men i stedet ville man have en masse NULL felter?
Det smarste ville vel i virkeligheden være at have eet fetl i MOVIE, hvor actor ideer blev opregnet adskildt af komma, altså (1, 6, 40, 3, 7)???
Nej, det er det der der er det rigtige. På den måde begrænser du dig ikke til et vist antal skuespillere, og det er også langt nemmere at vedligeholde - lad os for eksempel sige det viser sig at en skuespiller af en eller anden grund skal fjernes. Med den struktur kan du let fjerne alle referencer til den skuespiller med en DELETE FROM ACTOR_MOVIE where id_actor=id_der_skal_slettes.
Det er dog ikke nødvendigt med en id-kolonne i ACTOR_MOVIE, da de to andre felter tilsammen udgør en primærnøgle - en skuepsiller skal jo ikek kunne listes 2 gange for samme film.
Det du skitserer med dine 3 tabeller er den rigtigste måde at gøre det på - SQL-sproget er lavet til at dette. Prøver du på de 2 andre måder, du beskriver nedenunder, kommer du nok et stykke af vejen, men vil ganske sikkert på en masse frustrationer senere hen.
Og jeg er ikke enig i at '' kan erstatte NULL for streng felter. Der kan sagtens være tilfælde hvor man vil skelne mellem bevidst ingenting og uudfyldt/uoplyst.
Synes godt om
Slettet bruger
15. juli 2006 - 14:33#8
I netop denne situation kunne det være smart med en id-kolonne i ACTOR_MOVIE-tabellen på grund af eventuelle udvidelser, så der også kan søges på rollen, og det dermed kunne være at en skuespiller optræder mere end en gang på samme film.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.