klein ontwerp, graag commentaar
* of hier informatie mist
* ieder ander commentaar behalve op het data-type van de kolommen
Ik heb dit grafisch ontworpen en de SQL code laten genereren.
answers.answer kan een nederlands of frans antwoord bevatten
answers.direction moet als boolean functioneren of de vraag als frans->nederlands of nederlands->frans is gesteld
het is niet nodig om het later uit te breiden naar andere talen
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
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
CREATE TABLE IF NOT EXISTS `mydb`.`dictionaries` (
`id` INT NOT NULL ,
`name` TEXT NULL ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `mydb`.`phrases` (
`id` INT NOT NULL ,
`dictionaryId` INT NULL ,
`french` TEXT NULL ,
`dutch` TEXT NULL ,
PRIMARY KEY (`id`) ,
INDEX `fk_phrases_dictionaries_idx` (`dictionaryId` ASC) ,
CONSTRAINT `fk_phrases_dictionaries`
FOREIGN KEY (`dictionaryId` )
REFERENCES `mydb`.`dictionaries` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `mydb`.`practiseSessions` (
`id` INT NOT NULL ,
`dictionaryId` INT NULL ,
`started` DATETIME NULL ,
PRIMARY KEY (`id`) ,
INDEX `fk_practiseSessions_dictionaries1_idx` (`dictionaryId` ASC) ,
CONSTRAINT `fk_practiseSessions_dictionaries1`
FOREIGN KEY (`dictionaryId` )
REFERENCES `mydb`.`dictionaries` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `mydb`.`answers` (
`id` INT NOT NULL AUTO_INCREMENT ,
`phraseId` INT NOT NULL ,
`direction` INT NOT NULL ,
`incorrect` INT NOT NULL ,
`answer` TEXT NOT NULL ,
`caseInsensitive` INT NULL ,
`ignorePunctuation` INT NULL ,
`practiseSessionId` INT NULL ,
PRIMARY KEY (`id`) ,
INDEX `fk_answers_phrases1_idx` (`phraseId` ASC) ,
INDEX `fk_answers_practiseSessions1_idx` (`practiseSessionId` ASC) ,
CONSTRAINT `fk_answers_phrases1`
FOREIGN KEY (`phraseId` )
REFERENCES `mydb`.`phrases` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_answers_practiseSessions1`
FOREIGN KEY (`practiseSessionId` )
REFERENCES `mydb`.`practiseSessions` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
`id` INT NOT NULL ,
`name` TEXT NULL ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `mydb`.`phrases` (
`id` INT NOT NULL ,
`dictionaryId` INT NULL ,
`french` TEXT NULL ,
`dutch` TEXT NULL ,
PRIMARY KEY (`id`) ,
INDEX `fk_phrases_dictionaries_idx` (`dictionaryId` ASC) ,
CONSTRAINT `fk_phrases_dictionaries`
FOREIGN KEY (`dictionaryId` )
REFERENCES `mydb`.`dictionaries` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `mydb`.`practiseSessions` (
`id` INT NOT NULL ,
`dictionaryId` INT NULL ,
`started` DATETIME NULL ,
PRIMARY KEY (`id`) ,
INDEX `fk_practiseSessions_dictionaries1_idx` (`dictionaryId` ASC) ,
CONSTRAINT `fk_practiseSessions_dictionaries1`
FOREIGN KEY (`dictionaryId` )
REFERENCES `mydb`.`dictionaries` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `mydb`.`answers` (
`id` INT NOT NULL AUTO_INCREMENT ,
`phraseId` INT NOT NULL ,
`direction` INT NOT NULL ,
`incorrect` INT NOT NULL ,
`answer` TEXT NOT NULL ,
`caseInsensitive` INT NULL ,
`ignorePunctuation` INT NULL ,
`practiseSessionId` INT NULL ,
PRIMARY KEY (`id`) ,
INDEX `fk_answers_phrases1_idx` (`phraseId` ASC) ,
INDEX `fk_answers_practiseSessions1_idx` (`practiseSessionId` ASC) ,
CONSTRAINT `fk_answers_phrases1`
FOREIGN KEY (`phraseId` )
REFERENCES `mydb`.`phrases` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_answers_practiseSessions1`
FOREIGN KEY (`practiseSessionId` )
REFERENCES `mydb`.`practiseSessions` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Originele uitvoer: http://pastebin.com/VT7asMBY
Gewijzigd op 24/10/2012 15:19:48 door Flip --
Je geeft aan dat het altijd tot die twee talen beperkt zal blijven, dus waarom dat dan in een tabel zetten?
Je hebt in iedere tabel een id kolom, op zich niet fout, maar ik persoonlijk vind het onhandig want doen moet je straks in de query's alsnog gaan aliassen.
Ik neem aan dat er ook mensen zijn die de oefeningen gaan uitvoeren, dus ik mis nog een paar tabellen?
Je tabellen staan nu in de derde normaalvorm, je zou nog een trapje hoger kunnen door de incorrect kolom weg te halen (je kunt het antwoordt vergelijken met de phrases tabel)
Even een tipje - geen commentaar dus ;-) - over het datatype van de 'booleans', je kunt hier beter een tinyint(1) voor nemen, scheelt weer 10 bytes.
Gewijzigd op 28/10/2012 11:48:25 door Ger van Steenderen
Mag ik vragen waarmee je dit ontworpen hebt Flip?
edit; en bij een user hoort?
Gewijzigd op 28/10/2012 11:55:07 door Jaron T
Frank Nietbelangrijk op 28/10/2012 11:32:53:
Daar ben ik ook wel benieuwd naar.Mag ik vragen waarmee je dit ontworpen hebt Flip?
@Ger: ik zie vrijwel altijd in iedere tabel een 'id' staan. Jouw argument dat je moet gaan aliassen heb ik ook eerder gehoord. Toen zei iemand dat je eigenlijk nooit 'id' als veldnaam moet gebruiken, maar altijd een prefix moet gebruiken, bijvoorbeeld customer_id. Toch zie ik in de praktijd eigenlijk altijd dat 'id' wordt gebruikt. Is dat dan niet goed?
Maar van moeten is dus geen sprake.
PS
Hoe lang is jouw praktijd geleden? ;-)
de tool is gewoon Microsoft Visio voor de mensen die het niet weten.
Ger van Steenderen op 28/10/2012 11:25:55:
Op een paar kleine dingen na zit het (voor zover ik kan beoordelen) goed in elkaar.
Bedankt Ger in het bijzonder voor het nakijken.
Ger van Steenderen op 28/10/2012 11:25:55:
Je geeft aan dat het altijd tot die twee talen beperkt zal blijven, dus waarom dat dan in een tabel zetten?
De applicatie is voor het oefenen van woordenlijsten. In plaats van phrase1 en phrase2, of linkerwoord en rechterwoord. Heb ik er voor gekozen om ze dutch en french te noemen. Omdat de eene taal niet percé aan een bepaalde kant hoeft te staan en ook niet de "1ste" is. De kolommen french en dutch bevat dus de belangrijkste data:
dutch: het kasteel
french: le château
Ger van Steenderen op 28/10/2012 11:25:55:
Je hebt in iedere tabel een id kolom, op zich niet fout, maar ik persoonlijk vind het onhandig want doen moet je straks in de query's alsnog gaan aliassen.
Ik begrijp je hier niet. Misschien kan je wat meer uitleggen of een voorbeeld query maken? (ook met de verdere uitleg in vervolg post zie ik niet goed in waar nu verwarring zou kunnen optreden)
Ger van Steenderen op 28/10/2012 11:25:55:
Ik neem aan dat er ook mensen zijn die de oefeningen gaan uitvoeren, dus ik mis nog een paar tabellen?
Op dit moment is het maar voor 1 gebruiker, er mist dus inderdaad nog een user tabel. Maar verder zijn er nog tabellen die zouden missen??
Ger van Steenderen op 28/10/2012 11:25:55:
Je tabellen staan nu in de derde normaalvorm, je zou nog een trapje hoger kunnen door de incorrect kolom weg te halen (je kunt het antwoordt vergelijken met de phrases tabel)
Ik wist dat ik het antwoord kan vergelijken met de originele data. Er zijn drie redenen waarom ik gekozen heb voor deze kolom.
Ten eerste wordt je query iets complexer omdat je aan de kolom direction moet aflezen of het antwoord frans of nederlands was, en dus met welke van de twee kolommen je moet vergelijken.
Ten tweede het zou misschien wat sneller zijn ook al wordt er meer geheugen gebruikt. Maar ik dit niet getest.
Ten derde, en dit is de belangrijkste reden en ook gelijk de aanleiding. Is dat incorrect meer waardes kan hebben dan 0 of 1. 0 = goed, 1 = een beetje fout, 2 = iets meer fout, 3 = nog meer fout. De functie die dit bepaald is niet zo heel simpel en dus moet dit weer iedere keer berekend worden.
Ger van Steenderen op 28/10/2012 11:25:55:
Even een tipje - geen commentaar dus ;-) - over het datatype van de 'booleans', je kunt hier beter een tinyint(1) voor nemen, scheelt weer 10 bytes.
Ja ik weet het, toch bedankt. Probleem is dat ik met doctrine werk nu (ben pas beginner hierin) en doctrine heeft niet ondersteuning voor alle datatypes van mysql out-of-the-box. Omdat dit project vooral als leerproject is bedoeld is dit geen harde eis van mij dat de datatypes zo goed mogelijk aansluiten, misschien nog eens achteraf.
Frank Nietbelangrijk op 28/10/2012 11:32:53:
Mag ik vragen waarmee je dit ontworpen hebt Flip?
MySQL Workbench: http://www.mysql.com/downloads/workbench/
Jaron T op 28/10/2012 11:44:01:
ik neem aan dat zo'n oefensessie ook een eindtijd heeft?
edit; en bij een user hoort?
edit; en bij een user hoort?
Bedankt voor de tip, ik neem hem mee.
Jaron T op 28/10/2012 13:07:12:
de tool is gewoon Microsoft Visio voor de mensen die het niet weten.
Kan visio dan SQL code genereren??
Gewijzigd op 28/10/2012 14:26:23 door Flip --
Ger van Steenderen op 28/10/2012 13:03:25:
Hehe, lol... typfoutje, maar wel een mooi woord toch :DPS
Hoe lang is jouw praktijd geleden? ;-)
Hoe lang is jouw praktijd geleden? ;-)
Flip -- op 28/10/2012 14:24:07:
MySQL Workbench: http://www.mysql.com/downloads/workbench/
Thanks!Frank Nietbelangrijk op 28/10/2012 11:32:53:
Mag ik vragen waarmee je dit ontworpen hebt Flip?
MySQL Workbench: http://www.mysql.com/downloads/workbench/
Jaron T op 28/10/2012 13:07:12:
Hehe, blijkbaar toch niet :)de tool is gewoon Microsoft Visio voor de mensen die het niet weten.
Flip -- op 28/10/2012 14:24:07:
Ik begrijp je hier niet. Misschien kan je wat meer uitleggen of een voorbeeld query maken? (ook met de verdere uitleg in vervolg post zie ik niet goed in waar nu verwarring zou kunnen optreden)
Ger van Steenderen op 28/10/2012 11:25:55:
Je hebt in iedere tabel een id kolom, op zich niet fout, maar ik persoonlijk vind het onhandig want doen moet je straks in de query's alsnog gaan aliassen.
Ik begrijp je hier niet. Misschien kan je wat meer uitleggen of een voorbeeld query maken? (ook met de verdere uitleg in vervolg post zie ik niet goed in waar nu verwarring zou kunnen optreden)
Door mijn manier van querieën heb ik regelmatig queries waarin ik 6+ tabellen bij elkaar join, als je dan van de helft het id nodig hebt krijg je dit
Volgens mij heb je met het aliassen meer te typen dan als je van het begin die kolommen al zo genoemd hebt. Ik hoef kolommen alleen maar te aliassen bij een self join.
Quote:
Op dit moment is het maar voor 1 gebruiker, er mist dus inderdaad nog een user tabel. Maar verder zijn er nog tabellen die zouden missen??
Ger van Steenderen op 28/10/2012 11:25:55:
Ik neem aan dat er ook mensen zijn die de oefeningen gaan uitvoeren, dus ik mis nog een paar tabellen?
Op dit moment is het maar voor 1 gebruiker, er mist dus inderdaad nog een user tabel. Maar verder zijn er nog tabellen die zouden missen??
Nee
Quote:
Ik wist dat ik het antwoord kan vergelijken met de originele data. Er zijn drie redenen waarom ik gekozen heb voor deze kolom.
Ten eerste wordt je query iets complexer omdat je aan de kolom direction moet aflezen of het antwoord frans of nederlands was, en dus met welke van de twee kolommen je moet vergelijken.
Ten tweede het zou misschien wat sneller zijn ook al wordt er meer geheugen gebruikt. Maar ik dit niet getest.
Ten derde, en dit is de belangrijkste reden en ook gelijk de aanleiding. Is dat incorrect meer waardes kan hebben dan 0 of 1. 0 = goed, 1 = een beetje fout, 2 = iets meer fout, 3 = nog meer fout. De functie die dit bepaald is niet zo heel simpel en dus moet dit weer iedere keer berekend worden.
Ger van Steenderen op 28/10/2012 11:25:55:
Je tabellen staan nu in de derde normaalvorm, je zou nog een trapje hoger kunnen door de incorrect kolom weg te halen (je kunt het antwoordt vergelijken met de phrases tabel)
Ik wist dat ik het antwoord kan vergelijken met de originele data. Er zijn drie redenen waarom ik gekozen heb voor deze kolom.
Ten eerste wordt je query iets complexer omdat je aan de kolom direction moet aflezen of het antwoord frans of nederlands was, en dus met welke van de twee kolommen je moet vergelijken.
Ten tweede het zou misschien wat sneller zijn ook al wordt er meer geheugen gebruikt. Maar ik dit niet getest.
Ten derde, en dit is de belangrijkste reden en ook gelijk de aanleiding. Is dat incorrect meer waardes kan hebben dan 0 of 1. 0 = goed, 1 = een beetje fout, 2 = iets meer fout, 3 = nog meer fout. De functie die dit bepaald is niet zo heel simpel en dus moet dit weer iedere keer berekend worden.
De derde normaalvorm is in deze toepassing voldoende, dingen niet moeilijker maken dan nodig is.
Quote:
MySQL Workbench: http://www.mysql.com/downloads/workbench/
Mooie tool, ik gebruik hem ook(samen met dbtools manager)
Gewijzigd op 28/10/2012 16:05:37 door Ger van Steenderen
Gelezen & begrepen, bedankt voor je input :)
Gebruik je MySQL Workbench eigenlijk in plaats van PHPMyAdmin? Of zijn dit 2 totaal verschillende tools?
@Ozzie
MySQL Workbench is software en PhpMyAdmin is een webapp.
Als je met een hostprovider werkt heb je de kans dat je geen remote access tot je je database hebt, in dat geval ben je gebonden aan PMA, zodra je vanaf je client bij de database kunt, adviseer ik om een client tool te gebruiken.
Ik zelf gebruik Workbench en Dbtools door en naast elkaar, omdat ze allebei voor- en nadelen hebben.
Gewijzigd op 28/10/2012 20:22:11 door Ger van Steenderen
En kun je met MySQL Workbench hetzelfde als met PHPMyAdmin?
Met workbench kan je ERD's maken dat kan met PMA niet, voor de rest heb je dezelfde mogelijkheden. Alleen werken pc applicaties over het algemeen sneller en gemakkelijker.
Ah oké, thanks!
Ik ben ook fan van MySQL Workbench, ik werk echt nooit met PhpMyAdmin. Ik vind PhpMyAdmin de meest gebruikers-onvriendelijke tool ooit. Puur broddelwerk. Ik snap niet dat mensen daar tabellen mee aanmaken en hele tabellen zitten te vullen. Ik gebruik naast MySQL Workbench ook msysql command line (op de laptop) om databewerkingen/aanpassen/laden op de remote database uit te voeren. Zoals Ger zegt, wat grants en je kan mooi een client/server verbinding opbouwen.
En bij shared hosts is dat ook de enige manier waarop het kan volgens mij. Mocht ik tzt besluiten om voor mezelf te beginnen en eventueel een eigen vps server te nemen, dan is de mogelijkheid om MySQL Workbench te gebruiken er waarschijnlijk wel. Alleen geen idee hoe ik dan moet connecten. Is dat gewoon een kwestie van de host en de gebruikersnaam en wachtwoord invoeren?
Toevoeging op 28/10/2012 23:51:02:
Is zo'n tekening in de openingspost trouwens alleen bedoeld om de tabellen te maken, of kun je naderhand (als de tabellen al zijn gemaakt) ook wijzigingen in die tekening maken, die dan worden doorgevoerd in de tabellen?
Ozzie PHP op 28/10/2012 23:49:44:
Inderdaad host en de gebruikersnaam en wachtwoord opvoeren. MySQL Workbench zal je dat vanzelf vragen. Op de remote database moet je jezelf autoriseren met bijvoorbeeld: GRANT ALL PRIVILEGES ON databasenaam.* TO 'ozzie'@'99.99.999.9' IDENTIFIED BY 'wachtwoord'; waarbij 99.99.999.9 jouw ipnummer is. Het ipnummer van je internet-adsl/cable wel te verstaan.Alleen geen idee hoe ik dan moet connecten. Is dat gewoon een kwestie van de host en de gebruikersnaam en wachtwoord invoeren?Toevoeging op 28/10/2012 23:51:02:
Gewijzigd op 29/10/2012 08:20:04 door John D
Ozzie PHP op 28/10/2012 23:49:44:
Is zo'n tekening in de openingspost trouwens alleen bedoeld om de tabellen te maken, of kun je naderhand (als de tabellen al zijn gemaakt) ook wijzigingen in die tekening maken, die dan worden doorgevoerd in de tabellen?
Je kan ook tabellen wijzigen, en schuiven en anders linken. Download maar eens & probeer !
Oké. Wellicht kom ik hier in de toekomst nog een keer op terug. Thanks!