Råd og assistanse til oppsett/design av MySQL database

Diskusjoner som omhandler databaser og SQL postes her.

Råd og assistanse til oppsett/design av MySQL database

Innlegg Zpoon » 15.06.2012 14:53

Heppsann folkens!

Jeg jobber for tiden med mitt nye hjertebarn, www.faktanett.no og trenger i den sammenheng litt assistanse.
De underliggende sidene i nettverket (www.mobilfakta.no og www.kamerafakta.no) presenterer faktainfo/specs på....wait for it....mobiltelefoner og fotokameraer, og denne biten skal nå totalrenoveres.

Per i dag legges bare disse inn som vanlig tekst i artiklene, eks: http://www.kamerafakta.no/canon/faktasi ... -650d.html

Nå skal dette over i database istedet, og jeg sitter her som ikke alt for SQL-kyndig og klør meg i hodet mens jeg funderer på hvordan denne databasen bør designes.

En tabell med felter for all info? Flere tabeller? Jeg er blank.

Om noen har lyst til å assistere meg ville det bli satt stor pris på. (NB, jeg snakker ikke her om at du skal sitte å gjøre jobben, bare komme med råd og tips om beste løsningg)

Jeg har et word-dokument med facksheetet sånn som jeg ser for meg at det skal være om noen vil hjelpe:
http://www.mobilfakta.no/factsheet.docx
Lyst til å skrive om Mobil, Tablets eller Kameraer? Faktanett.no trenger bidragsytere! Kontakt meg for info
Brukerens avatar
Zpoon
Seniormedlem
 
Innlegg: 1910
Registrert: 16.10.2002 15:22
Bosted: Kristiansand, Norway

Re: Råd og assistanse til oppsett/design av MySQL database

Innlegg solo » 15.06.2012 20:38

Hei, helt kjapt ser jeg at jeg ville delt dette opp i 4 tabeller:

manufacturer(id, name)

camera(id, model_name, model_number, camera_type, house, osv...)

camera_houses(id, house)

camera_types(id, type)

Har skrevet litt selv om hvordan du oppretter tabeller i php og mysql: http://w3senteret.com/sql/php_mysql/mys ... _table.php
Brukerens avatar
solo
Medlem
 
Innlegg: 989
Registrert: 15.10.2003 18:25
Bosted: Larvik

Re: Råd og assistanse til oppsett/design av MySQL database

Innlegg Zpoon » 16.06.2012 20:33

Takk for svar :)
Av nyskjerrighet, hva er grunnen til å dele det opp i flere tabeller?
Lyst til å skrive om Mobil, Tablets eller Kameraer? Faktanett.no trenger bidragsytere! Kontakt meg for info
Brukerens avatar
Zpoon
Seniormedlem
 
Innlegg: 1910
Registrert: 16.10.2002 15:22
Bosted: Kristiansand, Norway

Re: Råd og assistanse til oppsett/design av MySQL database

Innlegg solo » 16.06.2012 20:59

Grunnen er at de skal følge fjerde normalform (Boyce-Codd normalform).
Det er slikt relasjonsdatabase er designet :-)

Har skrevet noen sider om dette med normalform og slikt.. Noe er ganske kjedelig for den vanlige mannen i gaten, men faktisk intressant for oss nerder:-)
http://w3senteret.com/sql/normalisering/
Brukerens avatar
solo
Medlem
 
Innlegg: 989
Registrert: 15.10.2003 18:25
Bosted: Larvik

Re: Råd og assistanse til oppsett/design av MySQL database

Innlegg Matsemann » 17.06.2012 13:05

solo skrev:Grunnen er at de skal følge fjerde normalform (Boyce-Codd normalform).

For å kverulere er ikke det det samme. ;)

Og igjen, poenget med å normalisere er kanskje viktigere. Poengene er mange.

Første normalform (1NF) sier at alt en lagrer i databasen skal være atomisk, altså at ikke masse data skal lagres i samme felt. For eksempel ville det i ditt tilfelle være flere måter å lagre "støttede minnekort" på.
norm1.png
norm1.png (19.92 KiB) Vist 4213 ganger

Den øverste er ikke på 1NF siden STOTTEDE_MINNEKORT inneholder masse data, mens den andre splittet i 3 tabeller er på 1NF(++) siden ingen av feltene er fulle med masse data. Første måten begrenser veldig hva du kan gjøre, den andre måten trenger du bare JOINE og støtter alle mulige spørringer uten at de blir "hårete" og stygge.

2NF sier at ingen av kolonnene bare delvis skal være avhengig av nøkkelen til tabellen. Har man bare ett felt som er primary key kan man altså hoppe over dette.
3NF er delvis tilsvarende: Ingen kolonne skal væree avhengig av noe som ikke er nøkkelen.
Med avhengig mener man at om man vet en verdi, kan man vite en annen verdi. F. eks. om du lagrer "ratingen" på kameraprodusenter, så har du Kameraprodsuent->rating, siden om du vet hvilken kameraprodusent det er snakk om, så kan du unikt kunne si hvilken rating den har.
Eks.
norm2.png
norm2.png (5.93 KiB) Vist 4213 ganger

Når du vet PRODUSENT_ID i dette tilfellet, ser du at PRODUSENT_NAVN og PRODUSENT_RATING er lik så lenge PRODUSENT_ID er lik. Her har vi altså at
produsent_id -> {produsent_navn, produsent_rating}.
Å lagre det på denne måten oppfyller ikke 3NF, siden produsent_navn og _rating er gitt ut i fra produsent_id som ikke er primærnøkkel.
Ulempene med dette er mange. La oss si du har 10 000 kameramodeller og ønsker å oppdatere ratingen til Canon fra 4 til 6. Da må du inn i alle radene som inneholder Canon og oppdatere ratingen. Ellers får du inkonsekvente data. Det kan ta ganske lang tid! Eller tenk om du ønsker å legge inn en ny kameraprodusent med navn og rating, men de ikke har noen modeller enda. Det er ikke mulig med denne måten å lagre på.
Samme om du sletter alle modellene til Canon, da sletter du plutselig også all informasjon om Canon du har lagret. Ikke bra. Og se hvor mye ekstra plass du bruker på å lagre navnene og ratingen mange ganger.
norm2.png
norm2.png (9.7 KiB) Vist 4213 ganger

Løsningen er å splitte opp på denne måten. Her ligger hver produsent bare én gang, så å oppdatere ratingen trenger bare å gjøres én plass. Her kan du også lagre produsenter som ikke har en modell i databasen enda. Og hver produsent lagres bare én gang, masse spart plass!

Normaliseringsteori er egentlig bare sunn fornuft. Splitt slik at ting ikke ligger lagret mange ganger (redundans), ikke lagre masse data i samme felt.
Nå så ikke jeg solo hadde skrevet masse om dette på nettsidene sine før jeg var ferdig her. Men han diskuterer mer hva det er, og jeg håper her jeg fikk påpekt litt hvorfor det er viktig.
Master i Datateknikk, NTNU
Brukerens avatar
Matsemann
Moderator
 
Innlegg: 2133
Registrert: 05.02.2005 19:13

Re: Råd og assistanse til oppsett/design av MySQL database

Innlegg Zpoon » 17.06.2012 13:21

Dette ble mye for en stakkars designer med begrenset sql/php-kunnskap ><

Men har jeg da forstått der rett at jeg bør ha to tabeller? En med Produsent (ID, Navn, evt rating) og en med resten av infoen?
Lyst til å skrive om Mobil, Tablets eller Kameraer? Faktanett.no trenger bidragsytere! Kontakt meg for info
Brukerens avatar
Zpoon
Seniormedlem
 
Innlegg: 1910
Registrert: 16.10.2002 15:22
Bosted: Kristiansand, Norway


Gå til SQL og databaser

Hvem er i forumet

Brukere som leser i dette forumet: Ingen registrerte brukere og 2 gjester