[MySQL] verbetering structuur

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Kevin Tuns

Kevin Tuns

09/11/2007 14:39:00
Quote Anchor link
ORGINEEL:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
--
-- Table structure for table 'leden'
--

CREATE TABLE leden (
  memberid int(5) NOT NULL auto_increment,
  gebruikersnaam varchar(15) NOT NULL default '',
  naam varchar(20) NOT NULL default '',
  wachtwoord varchar(32) NOT NULL default '',
  datum varchar(20) NOT NULL default '',
  ip varchar(15) NOT NULL default '',
  level char(3) NOT NULL default '111',
  ban char(1) NOT NULL default '0',
  sig text NOT NULL,
  avatar varchar(100) NOT NULL default 'images/avatars/phpst.PNG',
  email varchar(40) NOT NULL default '',
  website varchar(80) NOT NULL default 'http://',
  email_verbergen char(1) default '0',
  msn varchar(40) NOT NULL default '',
  icq varchar(40) NOT NULL default '',
  skype varchar(40) NOT NULL default '',
  yahoo varchar(40) NOT NULL default '',
  gebdatum varchar(15) NOT NULL default '',
  woonplaats varchar(30) NOT NULL default '',
  ondertitel varchar(50) NOT NULL default '',
  waarschuwingen char(1) default '0',
  geslacht varchar(7) NOT NULL default '',
  nieuwsbrief char(1) NOT NULL default '0',
  signatures_toon char(1) NOT NULL default '0',
  land char(1) NOT NULL default '0',
  PRIMARY KEY  (memberid),
  UNIQUE KEY gebruikersnaam (gebruikersnaam)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;


NIEUW:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
CREATE TABLE ban (
 banid INT(8) unsigned auto_increment,
 memberid INT(8) unsigned NULL,
 banstatus ENUM('true', 'false') default 'false',
 soort ENUM('volledig', 'dag', 'week', 'maand', 'jaar') NULL,
 bdatum DATETIME NOT NULL,
 edatum DATETIME NULL,
 ip varchar(15) NOT NULL
 reden tinytext NOT NULL,
 PRIMARY KEY (banid)
) ENGINE=InnoDB ;

CREATE TABLE waarschuwingen (
 wid INT(8) unsigned NOT NULL auto_increment,
 memberid INT(8) unsigned NOT NULL,
 datum DATETIME NOT NULL,
 reden tinytext NOT NULL,
 PRIMARY KEY (wid)
) ENGINE=InnoDB ;

 CREATE TABLE levels (
 levelid INT(8) unsigned auto_increment,
 naam varchar(20) NOT NULL,
 afk varchar(10) NOT NULL,
 kleur INT(6) unsigned default 000000,
 PRIMARY KEY (levelid)
) ENGINE=InnoDB ;

CREATE TABLE landen (
 landid INT(8) unsigned auto_increment,
 naam varchar(30) NOT NULL,
 ISO varchar(3) NOT NULL,
 PRIMARY KEY (landid),
 UNIQUE KEY ISO (ISO)
) ENGINE=InnoDB ;

CREATE TABLE leden (
 memberid INT(8) unsigned NOT NULL auto_increment,
 gebruikersnaam varchar(15) NOT NULL,
 wachtwoord varchar(32) NOT NULL,
 landid INT(8) unsigned default 0,
 levelid INT(8) unsigned default 1,
 naam varchar(20) NOT NULL,
 ip varchar(15) NOT NULL,
 datum DATE NOT NULL,
 sig text NOT NULL,
 avatar varchar(100) default 'images/avatars/phpst.PNG',
 email varchar(40) NOT NULL,
 website varchar(80) default 'http://',
 msn varchar(40) NULL,
 icq varchar(40) NULL,
 skype varchar(40) NULL,
 yahoo varchar(40) NULL,
 gebdatum DATE NULL,
 woonplaats varchar(30) NULL,
 ondertitel varchar(50) NULL,
 geslacht ENUM('man', 'vrouw'),
 nieuwsbrief ENUM('aan', 'uit') default 'aan',
 signatures_toon ENUM('aan', 'uit') default 'aan',
 show_email ENUM('aan', 'uit') default 'aan',
 PRIMARY KEY  (memberid),
 UNIQUE KEY gebruikersnaam (gebruikersnaam),
 FOREIGN KEY (levelid) REFERENCES levels(levelid)
 ON DELETE RESTRICT ON UPDATE CASCADE,
 FOREIGN KEY (landid) REFERENCES landen(landid)
 ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB ;


Maar ik zit nu een beetje vast. Hoe moet ik verder gaan en wat doe ik nog niet helemaal goed?
Gewijzigd op 01/01/1970 01:00:00 door Kevin Tuns
 
PHP hulp

PHP hulp

25/04/2024 04:06:59
 
Citroen Anoniem Graag

Citroen Anoniem Graag

09/11/2007 14:43:00
Quote Anchor link
Een datum met het type varchar?? Gebruik data of datetime. Kijk even bij de datum en tijds functies van php, zeer handig.

Van geslacht zou ik een Enum maken.

Kijk verder nog naar indexen, Gebruik niet het type MyIsam MyInob (of hoe dat ook heet). Voeg Foreign keys toe.

Dit waren mijn tips so far
 
Kevin Tuns

Kevin Tuns

09/11/2007 14:58:00
Quote Anchor link
is dit al wat beter?
is die INODB trouwens niet iets waar ik een andere database voor nodig heb?
Gewijzigd op 01/01/1970 01:00:00 door Kevin Tuns
 
Citroen Anoniem Graag

Citroen Anoniem Graag

09/11/2007 15:20:00
Quote Anchor link
Geboortedatum is ook een datum ;)
 
Frank -

Frank -

09/11/2007 15:29:00
Quote Anchor link
Landen kennen geen afkortingen, maar een ISO-code. Gebruik deze dan ook, dan ga je daarmee niet de mist in. Er is een keuze tussen de lijst van 2 karakaters en 3 karakters. Maak hierin een duidelijke keuze, anders kun je weer goed de fout in gaan.

Verder nog even de foreignkey's aanmaken, die ontbreken nu nog in het geheel. Deze zorgen voor de samenhang tussen de tabellen en mogen dus niet ontbreken.
 
Robert Deiman

Robert Deiman

09/11/2007 15:34:00
Quote Anchor link
Voor InnoDB heb je MySQL5 nodig, waar de InnoDB is geactiveerd. 1 van de voordelen van InnoDB ten opzichte van MyISAM is dat je Foreign keys aan kan maken (koppeling tussen tabellen).
Er zitten nog meer voordelen aan, maar die kan je zo van de MySQL website halen.
 
Frank -

Frank -

09/11/2007 15:36:00
Quote Anchor link
Robert_Deiman schreef op 09.11.2007 15:34:
Voor InnoDB heb je MySQL5 nodig
Sinds wanneer is dat het geval? Volgens de handleiding is dat echt niet zo, ben ook versie 4.0 en 4.1 regelmatig innoDB tegengekomen.

Is dus absoluut niet waar!

Edit: Sinds versie 3.23.34a is innoDB beschikbaar, zie de handleiding. En wanneer jouw provider geen innoDB heeft geactiveerd, kun je beter op zoek gaan naar een echte provider. Zonder innoDB kun je helemaal geen relationele database maken.
Gewijzigd op 01/01/1970 01:00:00 door Frank -
 
Kevin Tuns

Kevin Tuns

09/11/2007 21:53:00
Quote Anchor link
heb hem nog iets aangepast, maar heb geen idee of ik de Forein Keys goed toepas en welke ik nog meer toe kan passen.
Gewijzigd op 01/01/1970 01:00:00 door Kevin Tuns
 
Frank -

Frank -

09/11/2007 21:58:00
Quote Anchor link
Nog niet alle foreignkey's zijn aangemaakt, dat zul je dus nog moeten doen.

Vraagje: Waarom kies je de ene keer voor een INT(1), dan weer INT(3) en dan weer INT(5) ? Heb je wel enig idee wat dit doet? Zie de handleiding voor de details en vraag je heel goed af of je wel goed bezig bent.
 
Kevin Tuns

Kevin Tuns

09/11/2007 22:03:00
Quote Anchor link
zou je me misschien toch wat meer op weg willen helpen met die forein Keys.
En ik gebruik de verschillende ints omdat er soms maar 9 kunnen zijn, soms maar 99 en soms wel 999 dus dan moet ik voor de INT(3) gaan.

Ik geloof dat ik bij memberid altijd INT(5) heb
bij landenid altijd INT(3) en bij levelid INT(1)

verbeter me aub als ik het fout heb hoor
 
Thijs X

Thijs X

09/11/2007 22:13:00
Quote Anchor link
kevin schreef op 09.11.2007 22:03:
En ik gebruik de verschillende ints omdat er soms maar 9 kunnen zijn, soms maar 99 en soms wel 999 dus dan moet ik voor de INT(3) gaan.

Ik geloof dat ik bij memberid altijd INT(5) heb
bij landenid altijd INT(3) en bij levelid INT(1)

verbeter me aub als ik het fout heb hoor


Dan kan je in dat geval beter TINYINT(1) en SMALLINT(3) gebruiken,
http://dev.mysql.com/tech-resources/articles/visual-basic-datatypes.html
 
Kevin Tuns

Kevin Tuns

09/11/2007 22:24:00
Quote Anchor link
aangepast:

Ik dacht laat ik het even in de database gaan zetten en wat blijkt nou? Hij gaat niet verder als de tabel leden. Ook als ik ze allemaal apart probeer blijft hij errors geven?
Gewijzigd op 01/01/1970 01:00:00 door Kevin Tuns
 
Willem Jan Z

Willem Jan Z

09/11/2007 23:42:00
Quote Anchor link
Persoonlijk zou ik de ledeninfo nog in een aparte tabel gooien, mocht je later nog extra info willen opslaan gaat dat iets makkelijker. Het is wel iets meer werk, maar (in mijn mening) wel overzichtelijker.
 
Kevin Tuns

Kevin Tuns

10/11/2007 00:28:00
Quote Anchor link
AANGEPAST... vraag me nog steeds af waarom ik errors krijg bij het aanmaken van de tabelen.
zo iets beter?
Gewijzigd op 01/01/1970 01:00:00 door Kevin Tuns
 
Frank -

Frank -

10/11/2007 00:29:00
Quote Anchor link
Quote:
En ik gebruik de verschillende ints omdat er soms maar 9 kunnen zijn, soms maar 99 en soms wel 999 dus dan moet ik voor de INT(3) gaan.
Fout, het nummer zegt niks over het aantal karakters, maar over het aantal bits.

Een INT(1) is inderdaad hetzelfde als een TINYINT en daarmee ga je vrij vlot op je bek wanneer je daar een auto_increment op hebt staan. Deze loopt van -127 tot 128 (signed) of 0 tot 255 (unsigned). 255 x een record aanmaken en dat was het dan. Hoeveel records je inmiddels je hebt verwijderd, doet niet ter zake, maar je kunt geen enkel nieuw record aanmaken. Je systeem kan dus compleet stil komen te liggen.

Het is verkeerde zuinigheid om met auto_increment-velden een kleiner datatype te nemen. Tuurlijk, het neemt minder geheugen in beslag maar dat is niet noemenswaardig. Dat je systeem het risico loopt om onderuit te gaan, dat is wel noemenswaardig. Gebruik voor auto_increment-velden altijd een INT(8) unsigned, dan kun je ruim 4 miljard records aanmaken.

datatypes in MySQL
 
Kevin Tuns

Kevin Tuns

10/11/2007 00:43:00
Quote Anchor link
ik heb even alle code uit de berichten gehaald en in mijn beginpost zal ik steeds het nieuwe gedeelte update zodat het wat overzichtelijker is. ik heb alle ints even omgetoverd naar: INT(8) unsigned
 
Thijs X

Thijs X

10/11/2007 00:56:00
Quote Anchor link
@ Kevin, het is natuurlijk niet slim om alle velden INT(8) van te maken heh, alleen auto increment velden zoals frank hierboven al aangeeft.
Maar velden zoals 'show_email' etc hebben dat niet nodig.
TINYINT of SMALLINT voldoet daarvoor zeker wel.
 
Kevin Tuns

Kevin Tuns

10/11/2007 01:02:00
Quote Anchor link
Thijs schreef op 10.11.2007 00:56:
@ Kevin, het is natuurlijk niet slim om alle velden INT(8) van te maken heh, alleen auto increment velden zoals frank hierboven al aangeeft.
Maar velden zoals 'show_email' etc hebben dat niet nodig.
TINYINT of SMALLINT voldoet daarvoor zeker wel.


Aangepast(zie startpost voor nieuwe code)
heb hem zovergekregen dat hij hem nu wel toestaat. ook alle ints weer aangepast + een aantal ENUMS toegevoegd. Ook wat meer forein keys toegevoegd.

Zou iemand kunnen zien of die een beetje kloppen op het moment?
 
Frank -

Frank -

10/11/2007 08:56:00
Quote Anchor link
NOT NULL default '',

Dat is altijd een leuke bug in je systeem. Je geeft met NOT NULL aan dat het een verplicht veld is. Maar, mocht dit verplichte veld niet zijn ingevuld, neem dan als default waarde een lege string... Wat wil je nu? Eigenlijk slaan ze geen van beiden ergens op, het is blijkbaar geen verplicht veld en een lege string is volkomen waardeloos. In dit geval zou een NULL dus veel beter op zijn plaat zijn.

Je kiest óf NULL óf NOT NULL óf DEFAULT 'jouw waarde'. Nooit een combinatie of een lege string, dat slaat nergens op. Wanneer je een integer een default waarde geeft, zet je deze waarde natuurlijk niet tussen quotes, het is een integer.

De tabellen 'ban', 'ledenopties' en 'ledeninfo' lijken mij niet goed. Deze hebben nu een 1-op-1 relatie met 'leden'. Wanneer dat het geval is, dan is er geen enkele reden om de gegevens in een aparte tabel te zetten. Ik vraag me dan ook af of je wel goed genormaliseerd hebt.
 
Kevin Tuns

Kevin Tuns

10/11/2007 15:43:00
Quote Anchor link
pgFrank schreef op 10.11.2007 08:56:
NOT NULL default '',

Dat is altijd een leuke bug in je systeem. Je geeft met NOT NULL aan dat het een verplicht veld is. Maar, mocht dit verplichte veld niet zijn ingevuld, neem dan als default waarde een lege string... Wat wil je nu? Eigenlijk slaan ze geen van beiden ergens op, het is blijkbaar geen verplicht veld en een lege string is volkomen waardeloos. In dit geval zou een NULL dus veel beter op zijn plaat zijn.

Je kiest óf NULL óf NOT NULL óf DEFAULT 'jouw waarde'. Nooit een combinatie of een lege string, dat slaat nergens op. Wanneer je een integer een default waarde geeft, zet je deze waarde natuurlijk niet tussen quotes, het is een integer.

De tabellen 'ban', 'ledenopties' en 'ledeninfo' lijken mij niet goed. Deze hebben nu een 1-op-1 relatie met 'leden'. Wanneer dat het geval is, dan is er geen enkele reden om de gegevens in een aparte tabel te zetten. Ik vraag me dan ook af of je wel goed genormaliseerd hebt.


Lol, lijkt wel alsof ik aan het slapen was toen ik dit aan het maken was. NOT NULL default '' is natuurlijk onzin. Heb het meteen aangepast en ook het verkeerd zetten van de integer.

Ik snap alleen niet wat ik nou fout doe met de tabel ban? deze bevat namelijk alle informatie over een ban. Welk lid gebanned is, de reden, de tijd/datum ect. ect.

Ledenopties en ledeninfo gebruik ik omdat ik het makkelijker vind en een stuk overzichtelijker vind. Maarja als dit niet slim is zeg het maar en ik kan er weer 1 tabel van maken.
 
Joren de Wit

Joren de Wit

10/11/2007 15:53:00
Quote Anchor link
Met de tabel 'ban' lijkt me niet zoveel verkeerd. Hier heb je namelijk een 1-op-veel relatie als je ook met tijdelijke bans werkt en je een geschiedenis bij wilt houden.

Maar alle gegevens uit ledenopties en ledeninfo horen gewoon in de ledentabel thuis.
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.