Witam,

W temacie baz danych jestem początkującym. Zamieszczam ten post, aby upewnić się, że stworzona przeze mnie baza danych będzie spełniała moje wymagania. Przy projektowaniu posłużyłem się narzędziem MySQL WorkBench.

Zależy mi na tym, aby był szybki select po polach pesel, nazwisko(tabela klienci) oraz dokument(wizyty), w tym celu utworzyłem indeksy w tych kolumnach. Jak widać na obrazku, pole KID jest w relacji 1:n z polem WKID, stad powstal klucz obcy w tabeli Wizyty - w tym wypadku spodziewam się, że pobranie wszystkich danych z tabeli Wizyty wraz z powiazanymi danymi z tabeli Klienci przebiegnie szybko i sprawnie. Mam jednak obawy co do wykonania polecenia dającego taki sam rezultat, ale działającego na tabeli klienci (np select po peselu ma zwrocic wszystkie odnotowane wizyty klienta). Czy wskazane jest zatem stworzenie klucza obcego z tabeli Klienci, czy wystarczy ten w wizytach? I jakie polecenie wykona takie pobranie najoptymalniej?

Druga rzecz dotyczy tabeli Pracownicy. Są w niej hasła - jak mogę tą tabelę zabezpieczyć? Czy mogę ustawić jakieś dodatkowe haslo dla konkretnej tabeli? Jak to się robi przy poważnych projektach?

Poniżej zamieszczam diagram EER oraz wygenerowany przez WorkBencha kod. Proszę o wskazanie ewentualnych złych praktyk, jeżeli ktoś takie zauważy. Pozdrawiam

[URL=http://imageshack.us/photo/my-images/339/rejm.jpg/][IMG]http://img339.imageshack.us/img339/7341/rejm.jpg[/IMG][/URL]

Uploaded with [URL=http://imageshack.us]ImageShack.us[/URL]

 SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL';

CREATE SCHEMA IF NOT EXISTS `db` DEFAULT CHARACTER SET utf8 COLLATE utf8_polish_ci ;
USE `db`;

-- -----------------------------------------------------
-- Table `db`.`Zakazy`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `db`.`Zakazy` (
  `ZID` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `ZKID` INT UNSIGNED NOT NULL ,
  `dig` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
  PRIMARY KEY (`ZID`) ,
  INDEX `index1` (`ZKID` ASC) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_polish_ci;


-- -----------------------------------------------------
-- Table `db`.`Klienci`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `db`.`Klienci` (
  `KID` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `pesel` BIGINT UNSIGNED NOT NULL ,
  `dimur` VARCHAR(45) NOT NULL ,
  `nazwisko` VARCHAR(45) NOT NULL ,
  `imie` VARCHAR(45) NOT NULL ,
  `adres` VARCHAR(45) NOT NULL ,
  `oby` VARCHAR(45) NOT NULL ,
  `email` VARCHAR(45) NOT NULL ,
  `tel` VARCHAR(45) NOT NULL ,
  PRIMARY KEY (`KID`) ,
  INDEX `fk_Klienci_Zakazy` (`KID` ASC) ,
  INDEX `index2` (`pesel` ASC) ,
  INDEX `index3` (`nazwisko` ASC) ,
  CONSTRAINT `fk_Klienci_Zakazy`
    FOREIGN KEY (`KID` )
    REFERENCES `db`.`Zakazy` (`ZKID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_polish_ci;


-- -----------------------------------------------------
-- Table `db`.`Salony`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `db`.`Salony` (
  `SID` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `adres` VARCHAR(100) NOT NULL ,
  PRIMARY KEY (`SID`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_polish_ci;


-- -----------------------------------------------------
-- Table `db`.`Pracownicy`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `db`.`Pracownicy` (
  `PID` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `nazwisko` VARCHAR(60) NOT NULL ,
  `imie` VARCHAR(30) NOT NULL ,
  `login` VARCHAR(100) NOT NULL ,
  `haslo` VARCHAR(45) NOT NULL ,
  `digpass` TIMESTAMP NOT NULL ,
  PRIMARY KEY (`PID`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_polish_ci;


-- -----------------------------------------------------
-- Table `db`.`Wizyty`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `db`.`Wizyty` (
  `WID` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `WKID` INT UNSIGNED NOT NULL ,
  `digwej` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
  `digwyj` TIMESTAMP NOT NULL ,
  `dokument` VARCHAR(60) NOT NULL ,
  `WPID` INT UNSIGNED NOT NULL ,
  `WSID` INT UNSIGNED NOT NULL ,
  PRIMARY KEY (`WID`) ,
  INDEX `fk_Wizyty_Klienci` (`WKID` ASC) ,
  INDEX `fk_Wizyty_Salony` (`WSID` ASC) ,
  INDEX `fk_Wizyty_Pracownicy` (`WPID` ASC) ,
  INDEX `index4` (`dokument` ASC) ,
  CONSTRAINT `fk_Wizyty_Klienci`
    FOREIGN KEY (`WKID` )
    REFERENCES `db`.`Klienci` (`KID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_Wizyty_Salony`
    FOREIGN KEY (`WSID` )
    REFERENCES `db`.`Salony` (`SID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_Wizyty_Pracownicy`
    FOREIGN KEY (`WPID` )
    REFERENCES `db`.`Pracownicy` (`PID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_polish_ci;


-- -----------------------------------------------------
-- Table `db`.`Uwagi`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `db`.`Uwagi` (
  `UID` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `UKID` INT UNSIGNED NOT NULL ,
  `uwagi` TEXT NOT NULL ,
  `dig` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
  PRIMARY KEY (`UID`) ,
  INDEX `fk_Uwagi_Klienci` (`UKID` ASC) ,
  CONSTRAINT `fk_Uwagi_Klienci`
    FOREIGN KEY (`UKID` )
    REFERENCES `db`.`Klienci` (`KID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_polish_ci;



SET [email protected]_SQL_MODE;
SET [email protected]_FOREIGN_KEY_CHECKS;
SET [email protected]_UNIQUE_CHECKS;

Nie wyswietlilo obrazka, a niestety nie moge zedytowac postu dlatego zamieszczam obrazek tutaj jeszcze raz
http://img339.imageshack.us/img339/7341/rejm.jpg