Goedemiddag allemaal.

Ik ben mij aan het inlezen over normalisatie en probeer nu het programma mysql workbench uit.

Op de Nederlandse pagina's krijg je veel verwijzingen naar het database ontwerp van Yapf en soms kom je een artikel op deze website tegen.

Op basis hiervan heb ik even een opzetje gemaakt( welke uiteraard niet af is), hieronder de code zoals ik hem terug krijg van het programma:


-- MySQL Script generated by MySQL Workbench
-- 01/12/15 15:13:48
-- Model: New Model    Version: 1.0
-- MySQL Workbench Forward Engineering

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------

-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `mydb` ;

-- -----------------------------------------------------
-- Table `mydb`.`postcodes`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`postcodes` ;

CREATE TABLE IF NOT EXISTS `mydb`.`postcodes` (
  `postcodeID` INT NOT NULL,
  `postcode` VARCHAR(45) NOT NULL,
  `straatnaam` VARCHAR(45) NOT NULL,
  `plaats` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`postcodeID`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`adressen`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`adressen` ;

CREATE TABLE IF NOT EXISTS `mydb`.`adressen` (
  `adresID` INT NOT NULL,
  `postcodeID` INT NOT NULL,
  PRIMARY KEY (`adresID`),
  CONSTRAINT `postcodeID`
    FOREIGN KEY (`postcodeID`)
    REFERENCES `mydb`.`postcodes` (`postcodeID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`klanten`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`klanten` ;

CREATE TABLE IF NOT EXISTS `mydb`.`klanten` (
  `klantID` INT NOT NULL AUTO_INCREMENT,
  `voornaam` VARCHAR(45) NOT NULL,
  `tussenvoegsel` VARCHAR(45) NOT NULL,
  `achternaam` VARCHAR(45) NOT NULL,
  `adresID` INT NOT NULL,
  `huisnummer` VARCHAR(45) NOT NULL,
  `huisnummer_toevoeging` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`klantID`),
  INDEX `adresID_idx` (`adresID` ASC),
  CONSTRAINT `adresID`
    FOREIGN KEY (`adresID`)
    REFERENCES `mydb`.`adressen` (`adresID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`artikelen`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`artikelen` ;

CREATE TABLE IF NOT EXISTS `mydb`.`artikelen` (
  `artikelID` INT NOT NULL AUTO_INCREMENT,
  `artikelnaam` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`artikelID`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`orders`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`orders` ;

CREATE TABLE IF NOT EXISTS `mydb`.`orders` (
  `orderID` INT NOT NULL AUTO_INCREMENT,
  `artikelID` INT NOT NULL,
  `klantID` INT NOT NULL,
  `aantal` DECIMAL(10,0) NOT NULL,
  `prijs` DECIMAL(5,2) NOT NULL,
  PRIMARY KEY (`orderID`),
  INDEX `klantenID_idx` (`klantID` ASC),
  INDEX `artikelID_idx` (`artikelID` ASC),
  CONSTRAINT `klantenID`
    FOREIGN KEY (`klantID`)
    REFERENCES `mydb`.`klanten` (`klantID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `artikelID`
    FOREIGN KEY (`artikelID`)
    REFERENCES `mydb`.`artikelen` (`artikelID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;


Dit geeft mij de volgende diagram:



Ik weet dat het niet geoptimaliseerd is, maar ik ben niet bekend met de kleurtjes en kraaienpootjes en op YAPF missen er afbeeldingen.

Ik zou denken dat ik goed op weg ben, kan er iemand een blik op werken?

ps: varchar 45 is een standaard waarde in de workbench, het gaat mij om het diagram en de opzet er van.
Ward van der Put op 13/01/2015 09:54:36

phpMyAdmin heeft een vergelijkbare designer.



heb je een linkje?
Niet aan beginnen, Workbench is 10x beter en handiger
>> Als je dan een specifieke orderregel wilt verwijderen of bijwerken moet je dus het order_id en artikelnummer controleren.

Oké, maar als ik ze toch allebei moet gebruiken, wat is dan precies het nut om er een PK van te maken? Is dat om een unieke index te genereren? En als ik je goed begrijp dan gebruik je in plaats van een "nietszeggend" ID, twee andere ID's om alsnog een uniek ID te hebben?

>> Niet aan beginnen, Workbench is 10x beter en handiger

Ik gebruik altijd PHPMyAdmin. Is Workbench gratis? Gebruik jij dat zelf ook? Als ik het goed begrijp is het toch gewoon een Windows desktop applicatie? Kun je dat dan ook op een of andere manier verbinden met je VPS, of werkt dat niet zo?
Het is 1 PRIMARY KEY met 2 CONSTRAINTs.


CREATE TABLE orders (
  order_id  INT UNSIGNED     NOT NULL  AUTO_INCREMENT,
  PRIMARY KEY (order_id)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8  COLLATE=utf8_general_ci;

CREATE TABLE products (
  product_id  INT UNSIGNED   NOT NULL  AUTO_INCREMENT,
  price       DECIMAL(15,4)  NOT NULL,
  PRIMARY KEY (product_id)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8  COLLATE=utf8_general_ci;

CREATE TABLE orderdetails (
  order_id    INT UNSIGNED   NOT NULL,
  product_id  INT UNSIGNED   NOT NULL,
  units       INT UNSIGNED   NOT NULL,
  price       DECIMAL(15,4)  NOT NULL,
  PRIMARY KEY kiekeboe_dit_is_de_primaire_sleutel (order_id,product_id),
  CONSTRAINT FOREIGN KEY (order_id)
    REFERENCES orders (order_id)
    ON DELETE CASCADE  ON UPDATE CASCADE,
  CONSTRAINT FOREIGN KEY (product_id)
    REFERENCES products (product_id)
    ON DELETE RESTRICT  ON UPDATE CASCADE
) ENGINE=InnoDB  DEFAULT CHARSET=utf8  COLLATE=utf8_general_ci;
>> Oké, maar als ik ze toch allebei moet gebruiken, wat is dan precies het nut om er een PK van te maken? Is dat om een unieke index te genereren? En als ik je goed begrijp dan gebruik je in plaats van een "nietszeggend" ID, twee andere ID's om alsnog een uniek ID te hebben?

Je moet de vraag andersom stellen, wat is het nut van een pseudo primaire sleutel?
De definitie van een primaire sleutel is dat ie uniek is, en dat ie niet NULL mag zijn.
Beide kolommen mogen niet NULL zijn want je kan een onbekend artikel niet verkopen, noch kan een onbekende order artikelen bevatten. Daarnaast mag de combinatie artikelnummer/ordernummer niet meer dan één voorkomen in de tabel dus is ie uniek. Kortom de definitie van een primaire sleutel.

>>Ik gebruik altijd PHPMyAdmin. Is Workbench gratis? Gebruik jij dat zelf ook? Als ik het goed begrijp is het toch gewoon een Windows desktop applicatie? Kun je dat dan ook op een of andere manier verbinden met je VPS, of werkt dat niet zo?

Workbench is gratis, en ik gebruik hetzelf ook naast DbAdminstrator.

Je kan met elke host verbinden (en ook meerdere tegelijk) je moet dan op de host een gebruiker met jouw WAN ip adres aanmaken. Als je DirectAdmin hebt is dat vrij simpel.
>> De definitie van een primaire sleutel is dat ie uniek is, en dat ie niet NULL mag zijn.

Ik snap nu inderdaad wat je bedoelt. Ik denk dat ik een beetje in de war zat met een ID in plaats van een PK. Dus hoe spreek je de ID aan als die uit 2 velden bestaat, maar dat was dus een denkfout van mijn kant.

>> Als je DirectAdmin hebt is dat vrij simpel.

Mijn VPS heeft Plesk. Lijkt me leuk als dat lukt. Als ik het goed begrijp, dan start je gewoon Workbench op en hoef je dus niet meer op je server in te loggen en naar PHPMyAdmin te gaan?
Je moet nog wel op je databaseserver inloggen, maar je maakt dan een soort van snelkoppeling aan in het home venster van WB.
Ah oké. Ik kom hier later nog eens op terug. Bedankt.
Elmar vH op 12/01/2015 17:44:26

Wat bedoel je met "kopregel"?
Misschien wat laat en mogelijk heb ik iets gemist maar daar bedoel ik mee de "kop" die boven de orderregels behoort. Daaarin vind je: order/factuurnummer, order/factuuradres, order/factuurdatum en nog meer relevante informatie die bij de orderregels hoort. Slechts als koppeltabel met twee id's is het vrij zinloos.

Reageren