[normalisatie] ¿titel-loos?
Edit:
Sorry kon geen betere titel verzinnen, excuus.
Dit zijn mijn tabellen:
+users
-id
-name
-pass sha1()...
-punten aantal punten dat user heeft verdient door wedstrijden te voorspellen
-geld aantal geld dat user heeft verdient door wedstrijden te voorspellen
+wedstrijden
-id
-thuis thuisploeg
-uit uitploeg
-datum datum van wedstrijd
-gespeeld gespeeld ja of nee (0/1)
-thuis_pt indien bekend de uitslag
-uit_pt indien bekend de uitslag
+voorspellingen
-id gewoon voor de uniek-heid
-user_id id v/d user
-wedstrijd_id id v/d wedstrijd
-thuis_pt voorspeld aantal punten voor thuis
-uit_pt voorspeld aantal punten voor uit
Nu vroeg ik mij af of de kolom `id` bij +voorspellingen nodig was.
Edit:
Nu graag geen reactie als:
Quote:
:-P Mijn vraag is: Is een `id` kolom met auto_increment nodig bij de tabel voorspellingen?Ik niet.
Groeten,
Boris
Zo'n kolom is altijd handig. Kost niet veel extra moeite (wat? Kost geen moeite!) en je krijgt de mogelijkheid om regels te bewerken of te verwijderen. Want hoe wou je zonder die kolom een regel uit die tabel wijzigen?
De velden zijn immers nog wel uniek. Er is maar 1 "voorspelling" met user 9 en wedstrijd 4 (bijvoorbeeld). De user kan neit vaker zijn gok plaatsen. Elke rij is dus nog steeds uniek.
Jelmer heeft gelijk, als je die "id" kolom niet hebt, krijg je een combinatie van 2 kolommen die aangeven dat iets uniek is. (user_id/wedstrijd_id) Daarop zoeken en wijzigen is lastiger te realiseren, niet veel lastiger overigens, maar in zo'n geval is een extra kolom wel altijd handig.
-geld aantal geld dat user heeft verdient door wedstrijden te voorspellen
Deze zijn niet nodig, dit zijn berekende gegevens op basis van gegevens die reeds in de database staan. En data sla je slechts 1x op, dus niet meerdere keren. Bereken deze waardes wanneer je ze nodig hebt, dan zijn ze altijd correct. Of altijd fout in het geval jouw query niet goed is... ;)
-gespeeld gespeeld ja of nee (0/1)
Dit is alleen interessant wanneer er onverwachts wedstrijden worden geannuleerd en nooit meer worden gespeeld. In alle andere gevallen neem je de speeldatum om te bepalen of de wedstrijd al is gespeeld of niet. Iedere geplande wedstrijd wordt gespeeld, verplaatst (krijg je een andere datum) of geannuleerd. De kans dat een wedstrijd voor eens en voor altijd wordt geannuleerd lijkt mij niet zo groot, dit heeft een enorme invloed op een competitie. Tip: Verwijder dit veld uit het datamodel en verwijder wedstrijden die worden geannuleerd (het record).
Dan de vraag: Het id is niet nodig, maar dan zul je wel een andere veld (of combinatie van velden) als primairy key op moeten geven. Ik zou er voor kiezen om gewoon een id met auto_increment op te nemen. Het kost je nauwelijks extra geheugen en maakt de boel voor jou een stuk eenvoudiger.
Je hebt inderdaad gelijk over de eerste twee punten (punten: aantal punten dat user heeft), die haal je 'gewoon' met een goede query op uit de DB. Dat snap ik nu.
-gespeeld ja of nee (0/1), hier heb ik nog over lopen piekeren. Ik heb inderdaad uiteindelijk het verkeerde gekozen. Het feit of een wedstrijd gespeeld is of niet, hangt af van de datum. Echter, het kan zo zijn dat een wedstrijd is gespeeld, maar nog niet ingevoerd (er staat dat 0 (als int) in de DB). (Of dat de wedstrijd wel begonnen is, maar nog niet af. ) Als je dan naar de datum kijkt, en dus concludeert dat de wedstrijd gespeelt is, kijk je verder en zie je dat de uitslag 0-0 is. Nu heb je het als user fout als je 3-2 hebt voorspeld.
Of maakt dit hele verhaal niet uit, omdat je punten aantal toch weer opnieuw wordt berekent als de admin de uitslag invoert?
(sorry voor de "lap tekst" (of is dit "nog maar niks"...?))
@Robert, volgens mij kan je in SQL bij een vergelijking met NULL geen gewoon =-teken gebruiken maar moet het zijn: IS NOT NULL óf IS NULL.
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
CREATE TABLE wedstrijden (
id int(8) NOT NULL auto_increment,
thuis varchar(255) NOT NULL default '',
uit varchar(255) NOT NULL default '',
datum datetime NOT NULL default '0000-00-00 00:00:00',
gespeeld int(1) NOT NULL default '0',
thuis_pt int(2) default NULL,
uit_pt int(2) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;
id int(8) NOT NULL auto_increment,
thuis varchar(255) NOT NULL default '',
uit varchar(255) NOT NULL default '',
datum datetime NOT NULL default '0000-00-00 00:00:00',
gespeeld int(1) NOT NULL default '0',
thuis_pt int(2) default NULL,
uit_pt int(2) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;
Edit:
Klopt dit?
Gewijzigd op 01/01/1970 01:00:00 door K i p
Oké, bedankt allemaal!