[MySQL] verbetering structuur
Code (php)
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
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;
-- 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)
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
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 ;
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
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
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
Geboortedatum is ook een datum ;)
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.
Er zitten nog meer voordelen aan, maar die kan je zo van de MySQL website halen.
Robert_Deiman schreef op 09.11.2007 15:34:
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.Voor InnoDB heb je MySQL5 nodig
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 -
Gewijzigd op 01/01/1970 01:00:00 door Kevin Tuns
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.
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
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
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
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
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.
zo iets beter?
Gewijzigd op 01/01/1970 01:00:00 door Kevin Tuns
Quote:
Fout, het nummer zegt niks over het aantal karakters, maar over het aantal bits.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.
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
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
Maar velden zoals 'show_email' etc hebben dat niet nodig.
TINYINT of SMALLINT voldoet daarvoor zeker wel.
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.
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?
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.
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.
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.
Maar alle gegevens uit ledenopties en ledeninfo horen gewoon in de ledentabel thuis.