Beste PHP'ers

Scroll naar beneden voor het nieuwe probleem met dezelfde databaseopbouw


Ik ben mijn site wat aan het uitbreiden en om te beginnen moet ik een goed database model hebben. Ik kom zelf op het volgende uit maar misschien kijk ik wel helemaal verkeerd en vergeet ik bepaalde dingen. Zouden jullie kunnen kijken of ik zo goed zit qua database opbouw of dat jullie suggesties hebben.
Het is voor een website van 1 club. De wedstrijden zullen dus altijd door in ieder geval die club gespeeld worden.

Wedstrijden
plaats (thuis/uit)
tegenstander_id
doelpunten --> is het sneller om ze mee te geven hier of om ze te tellen vanuit de tabel met goals
doelpuntentegenstander --> zie bovenstaande
kaarten --> net als bij de goals
kaartentegenstander
soort_id
seizoen_id
datum/tijd
scheidsrechter_id
stadion_id
toeschouwersaantal

Soort wedstrijd
id
naam

Seizoen
id
jaar

scheidsrechters
id
naam
nationaliteit

Stadion
id
naam
plaats
capaciteit
foto

Goals
id
speler_id
minuut

Kaarten
id
speler_id
minuut
kleur

Spelers
id
naam
rugnr
foto
geboortedatum
geboorteplaats
nationaliteit

Clubs
id
naam
logo


Dit is waar ik op uit kwam. Met name in de tabel wedstrijden zit ik nog met wat dingetjes. Ik wil namelijk niet registreren wie een kaart heeft gekregen bij de tegenstander omdat dit niet relevant is voor mijn site. Hetzelfde met de goals van de tegenstander.

Mijn vraag is dus (voor zover nog niet duidelijk) of jullie ook tips/opmerkingen hebben voor de databaseopbouw.

Alvast bedankt voor het kijken.
remco schreef op 06.03.2009 14:35
Beste PHP'ers
Wedstrijden
plaats (thuis/uit)
tegenstander_id
doelpunten --> is het sneller om ze mee te geven hier of om ze te tellen vanuit de tabel met goals <--direct vanuit de andere tabel doen
doelpuntentegenstander --> zie bovenstaande
kaarten --> net als bij de goals
kaartentegenstander
soort_id
seizoen_id
datum/tijd
scheidsrechter_id
stadion_id
toeschouwersaantal

Soort wedstrijd
id
naam

Seizoen
id
jaar

scheidsrechters
id
naam
nationaliteit

Stadion
id
naam
plaats
capaciteit
foto

Goals
id
speler_id
minuut
wedstrijd_id

Kaarten
id
speler_id
minuut
kleur

Spelers
id
naam
rugnr
foto
geboortedatum
geboorteplaats
nationaliteit
club

Clubs
id
naam
logo

Ik zou ook gewoon de spelers van de tegenpartij bijhouden, of desnoods een aparte speler genaamd tegenstander maken, maar dat is niet echt geweldig
doorgestreept=niet doen
onderstreept=toevoegen
Enkele dingen die nog niet kloppen:

- Kolommen uit wedstrijden tabel waar jij nu over twijfelt mag je er gewoon uithalen. Dat zijn berekende aantallen en die volgen uit de gegevens uit andere tabellen.

- In de goals en kaarten tabellen mis ik een koppeling naar de wedstrijden tabel. Een FK naar het wedstrijd_id is hier wel nodig om te bepalen in welke wedstrijd de goals gevallen of kaarten gegeven zijn.

- In de spelers tabel mis ik de koppeling naar de clubs tabel. Een FK naar het club_id is nodig om vast te leggen van welke club een speler is. Eventueel zou je dit ook via een koppeltabel (inclusief begin en einddatum van contract) kunnen doen om zo een historie van een bepaalde speler bij te houden.

Let er verder op dat je voor alle kolommen de juiste datatypen gebruikt. Wellicht dat je dat al doet, maar ik zie het maar wat vaak fout gaan.
En wie speelt nu tegen wie? Er is alleen een tegenstander, wie de andere partij is, is een groot raadsel.

id_thuisploeg
id_uitploeg

Zo weet je direct wie tegen wie speelt en wie er thuis speelt en wie er uit speelt. De plaats lijkt mij aan een stadion gebonden, een stadion ligt niet in plaats X en de wedstrijd wordt in plaats Y gespeeld. Foutje?
@pgFrank

Wie tegen wie speelt is wel duidelijk. Ik houd namelijk alleen de wedstrijden van Heerenveen bij. Aangezien ik door het aangeven van (plaats(thuis/uit)) weet wie er thuis of uit speelt is het wel duidelijk wie tegen wie speelt.
Zo weet je direct wie tegen wie speelt en wie er thuis speelt en wie er uit speelt. De plaats lijkt mij aan een stadion gebonden, een stadion ligt niet in plaats X en de wedstrijd wordt in plaats Y gespeeld. Foutje?

Als ik het goed begrijp bedoel je de bovenste plaats? Daar geef ik alleen aan of het thuis of uit is omdat 1 club altijd hetzelfde is.
Een uit of thuiswedstrijd kan in bijv de bekerfinale in een neutraal stadion worden gespeeld dus uit of thuis bepaalt nog niet direct de plaats van de wedstrijd.

@Blance & TJVB
Ik zie nu ook dat ik bij de goals de rij met wedstrijd_id ben vergeten wat ik overigens ook ben vergeten bij kaarten (zie ik nu)
In mijn model hoeft volgens mij geen club bij de spelers omdat de spelers in mijn tabel maar van 1 club kunnen zijn (ik houd namelijk alleen de spelers van 1 club bij)
Ik denk dat ik, ondanks dat het niet erg netjes is, misschien dan toch een record moet maken met spelernaam tegenstander omdat het niet te doen is om alle spelers van alle tegenstanders toe te voegen.
Als ik een dus een speler genaamd tegenstander toevoeg kan ik inderdaad de 4 rijen laten vervallen.

Verder nog dingen of klopt het verder zo wel ongeveer
Wie tegen wie speelt is wel duidelijk. Ik houd namelijk alleen de wedstrijden van Heerenveen bij.
Tot het moment dat je dit verandert... En dat moment zal niet lang op zich laten wachten, meestal gebeurt zoiets al voordat je helemaal klaar bent met je systeem. Een vriend, broer, zus of iemand anders vraagt of je de wedstrijden van club X wilt bijhouden en je bent de klos. Dit is nu nog heel erg simpel in te bouwen, dat is het straks niet meer. Doe jezelf een plezier en voer dat ene extra veldje even in. Meer is het niet.

En wanneer je gaat normaliseren, ga dan goed en volledig normaliseren en gooi niet halverwege het bijltje erbij neer omdat je denkt dat het toch nooit meer verandert. Daar zou je nog flinke spijt van kunnen krijgen.
Oké dan maak ik het dus toch nog weer iets anders.
Wedstrijden
thuisclub_id
uitclub_id
soort_id
seizoen_id
datum/tijd
scheidsrechter_id
stadion_id
toeschouwersaantal

Soort wedstrijd
id
naam

Seizoen
id
jaar

scheidsrechters
id
naam
nationaliteit

Stadion
id
naam
plaats
capaciteit
foto

Goals
id
speler_id
minuut
wedstrijd_id

Kaarten
id
speler_id
minuut
kleur

Spelers
id
naam
rugnr
foto
geboortedatum
geboorteplaats
nationaliteit
club

Clubs
id
naam
logo

Klopt het zo al beter? Als ik 1 keer de juiste tabellen heb ga ik kijken naar de eigenschappen van de kolommen (INT, BIGINT etc...)
Kaarten mist nog het id van de speler. Verder kom je nu nog in de problemen als je meerdere teams van 1 club in je competitie hebt. Ik weet niet of het voorkomt, maar eigenlijk hoor je nog een tabel met teams en de bijbehorende koppelingen op te nemen.
Het zal niet voorkomen dat meerdere teams van 1 club in de competitie zitten. Alles is bedoeld voor maar een club en eigenlijk ook direct 1 team. Het enige wat voor zou kunnen komen is een beker ontmoeting tussen Heerenveen en jong Heerenveen maar dat zijn al 2 verschillende club namen. De kans dat dit overigens gebeurt is heel heel heel erg klein.
Maar dan kom je weer terug bij het punt dat Frank al eerder maakte, die kans bestaat wél ook al is die nog zo klein. Nu is het een kleine moeite om die aanpassing te maken, terwijl het later veel meer moeite kost of het zelfs onmogelijk wordt.

Als je er 100% zeker van bent dat het nooit gebeurt (stel dat je een applicatie voor bijvoorbeeld de eredivisie zou maken), dan kun je je zo'n opzet veroorloven. Maar in alle andere gevallen zul je er toch zeker rekening mee houden dat je je applicatie anders wilt gebruiken dan dat je nu voor ogen hebt...
Zo ik heb de bovenstaande database opbouw gebruikt en de tabellen aangemaakt met de datatypes. Zouden jullie willen controleren of de FOREIGN KEYS en datatypen zo correct zijn?


-- --------------------------------------------------------

--
-- Tabel structuur voor tabel 'clubs'
--

CREATE TABLE clubs (
  id int(9) unsigned NOT NULL auto_increment,
  naam varchar(40) NOT NULL,
  logo varchar(50) NOT NULL,
  PRIMARY KEY  (id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Tabel structuur voor tabel 'goals'
--

CREATE TABLE goals (
  id int(9) unsigned NOT NULL auto_increment,
  speler_id int(9) unsigned NOT NULL,
  wedstr_id int(9) unsigned NOT NULL,
  minuut int(3) unsigned NOT NULL,
  PRIMARY KEY  (id),
  KEY speler (speler_id),
  KEY wedstrijd (wedstr_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Tabel structuur voor tabel 'kaarten'
--

CREATE TABLE kaarten (
  id int(9) unsigned NOT NULL auto_increment,
  speler_id int(9) unsigned NOT NULL,
  wedstr_id int(9) unsigned NOT NULL,
  kleur_id int(1) unsigned NOT NULL,
  minuut int(3) unsigned NOT NULL,
  PRIMARY KEY  (id),
  KEY speler (speler_id),
  KEY wedstrijd (wedstr_id),
  KEY kleur (kleur_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Tabel structuur voor tabel 'nationaliteit'
--

CREATE TABLE nationaliteit (
  id int(4) unsigned NOT NULL auto_increment,
  nationaliteit varchar(40) NOT NULL,
  PRIMARY KEY  (id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Tabel structuur voor tabel 'scheidsrechters'
--

CREATE TABLE scheidsrechters (
  id int(4) unsigned NOT NULL auto_increment,
  naam varchar(60) NOT NULL,
  nationaliteit_id int(4) unsigned NOT NULL,
  PRIMARY KEY  (id),
  KEY nationaliteit (nationaliteit_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Tabel structuur voor tabel 'seizoen'
--

CREATE TABLE seizoen (
  id int(4) unsigned NOT NULL auto_increment,
  jaar char(9) NOT NULL,
  PRIMARY KEY  (id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Tabel structuur voor tabel 'selectie'
--

CREATE TABLE selectie (
  id int(9) unsigned NOT NULL auto_increment,
  seizoen_id int(4) unsigned NOT NULL,
  speler_id int(9) unsigned NOT NULL,
  PRIMARY KEY  (id),
  KEY seizoen (seizoen_id),
  KEY speler (speler_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Tabel structuur voor tabel 'soort_kaart'
--

CREATE TABLE soort_kaart (
  id int(1) unsigned NOT NULL auto_increment,
  kleur varchar(10) NOT NULL,
  PRIMARY KEY  (id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Tabel structuur voor tabel 'soort_wedstr'
--

CREATE TABLE soort_wedstr (
  id int(2) unsigned NOT NULL auto_increment,
  naam varchar(30) NOT NULL,
  PRIMARY KEY  (id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Tabel structuur voor tabel 'spelers'
--

CREATE TABLE spelers (
  id int(9) unsigned NOT NULL auto_increment,
  naam varchar(60) NOT NULL,
  rugnummer int(2) unsigned NOT NULL,
  foto varchar(60) NOT NULL,
  geb_datum date NOT NULL,
  geb_plaats varchar(50) NOT NULL,
  nationaliteit_id int(4) unsigned NOT NULL,
  PRIMARY KEY  (id),
  KEY nationaliteit (nationaliteit_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Tabel structuur voor tabel 'stadion'
--

CREATE TABLE stadion (
  id int(4) unsigned NOT NULL auto_increment,
  naam varchar(40) NOT NULL,
  plaats varchar(40) NOT NULL,
  capaciteit int(5) unsigned NOT NULL,
  foto varchar(50) NOT NULL,
  PRIMARY KEY  (id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Tabel structuur voor tabel 'wedstrijden'
--

CREATE TABLE wedstrijden (
  id int(9) unsigned NOT NULL auto_increment,
  thuis_id int(4) unsigned NOT NULL,
  uit_id int(4) unsigned NOT NULL,
  datum datetime NOT NULL,
  seizoen_id int(4) unsigned NOT NULL,
  soort_id int(2) unsigned NOT NULL,
  scheids_id int(4) unsigned NOT NULL,
  stadion_id int(4) unsigned NOT NULL,
  toeschouwers int(5) unsigned NOT NULL,
  PRIMARY KEY  (id),
  KEY thuis (thuis_id),
  KEY uit (uit_id),
  KEY seizoen (seizoen_id),
  KEY soort (soort_id),
  KEY scheidsrechter (scheids_id),
  KEY stadion (stadion_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

--
-- Beperkingen voor gedumpte tabellen
--

--
-- Beperkingen voor tabel `goals`
--
ALTER TABLE `goals`
  ADD CONSTRAINT goals_ibfk_2 FOREIGN KEY (wedstr_id) REFERENCES wedstrijden (id) ON UPDATE CASCADE,
  ADD CONSTRAINT goals_ibfk_1 FOREIGN KEY (speler_id) REFERENCES spelers (id) ON UPDATE CASCADE;

--
-- Beperkingen voor tabel `kaarten`
--
ALTER TABLE `kaarten`
  ADD CONSTRAINT kaarten_ibfk_3 FOREIGN KEY (kleur_id) REFERENCES soort_kaart (id) ON UPDATE CASCADE,
  ADD CONSTRAINT kaarten_ibfk_1 FOREIGN KEY (speler_id) REFERENCES spelers (id) ON UPDATE CASCADE,
  ADD CONSTRAINT kaarten_ibfk_2 FOREIGN KEY (wedstr_id) REFERENCES wedstrijden (id) ON UPDATE CASCADE;

--
-- Beperkingen voor tabel `scheidsrechters`
--
ALTER TABLE `scheidsrechters`
  ADD CONSTRAINT scheidsrechters_ibfk_1 FOREIGN KEY (nationaliteit_id) REFERENCES nationaliteit (id) ON UPDATE CASCADE;

--
-- Beperkingen voor tabel `selectie`
--
ALTER TABLE `selectie`
  ADD CONSTRAINT selectie_ibfk_2 FOREIGN KEY (speler_id) REFERENCES spelers (id) ON UPDATE CASCADE,
  ADD CONSTRAINT selectie_ibfk_1 FOREIGN KEY (seizoen_id) REFERENCES seizoen (id) ON UPDATE CASCADE;

--
-- Beperkingen voor tabel `spelers`
--
ALTER TABLE `spelers`
  ADD CONSTRAINT spelers_ibfk_1 FOREIGN KEY (nationaliteit_id) REFERENCES nationaliteit (id) ON UPDATE CASCADE;

--
-- Beperkingen voor tabel `wedstrijden`
--
ALTER TABLE `wedstrijden`
  ADD CONSTRAINT wedstrijden_ibfk_6 FOREIGN KEY (stadion_id) REFERENCES stadion (id) ON UPDATE CASCADE,
  ADD CONSTRAINT wedstrijden_ibfk_1 FOREIGN KEY (thuis_id) REFERENCES clubs (id) ON UPDATE CASCADE,
  ADD CONSTRAINT wedstrijden_ibfk_2 FOREIGN KEY (uit_id) REFERENCES clubs (id) ON UPDATE CASCADE,
  ADD CONSTRAINT wedstrijden_ibfk_3 FOREIGN KEY (seizoen_id) REFERENCES seizoen (id) ON UPDATE CASCADE,
  ADD CONSTRAINT wedstrijden_ibfk_4 FOREIGN KEY (soort_id) REFERENCES soort_wedstr (id) ON UPDATE CASCADE,
  ADD CONSTRAINT wedstrijden_ibfk_5 FOREIGN KEY (scheids_id) REFERENCES scheidsrechters (id) ON UPDATE CASCADE;

Reageren