Das Schema (auch Datenbankschema oder physisches Schema genannt) legt fest, welche Daten in einer Datenbank in welcher Form gespeichert werden können und welche Beziehungen zwischen den Daten bestehen. Das Schema legt auch die Tabellen und deren Attribute sowie zur Sicherstellung der Konsistenz die Integritätsbedingungen fest. Hierzu gehören insbesondere die Festlegung von Wertebereichen einzelner Attribute und von Fremdschlüsselbeziehungen sowie Existenz- und Eindeutigkeitsbedingungen wie zum Beispiel die Referenzielle Integrität. Dieses Modell wird physisch in der Datenbank angelegt und ist der letzte Schritt des Entwicklungsprozesses einer Datenbank.
Die Entwicklung eines Schemas beginnt mit der fachlichen Modellierung eines semantischen Modells ohne technische Details. Dieses Modell wird dann in den dargestellten Schritten meist vollautomatisiert in das physische Schema der Datenbank überführt. Im schlechtesten Falle muss der SQL-Code angepasst werden. Alle SQL-Befehle der Data Manipulating Language (DML), die durch das DBMS an die Datenbank geschickt werden, werden nun überprüft, ob sie die Integritätsbedingungen des aktuellen Schemas verletzten. Wenn ja, werden die SQL-Befehle abgelehnt!
Beispiel Entity-Relationship-Modell (ERM)
CREATE SCHEMA `friseursalon`
CREATE TABLE `friseursalon`.`salon` (`idsalon` INT NOT NULL AUTO_INCREMENT ,`name` VARCHAR(45) NOT NULL ,PRIMARY KEY (`idsalon`) )
CREATE TABLE `friseursalon`.`mitarbeiter` (`idmitarbeiter` INT NOT NULL AUTO_INCREMENT ,`nachname` VARCHAR(45) NOT NULL ,
`vorname` VARCHAR(45) NOT NULL ,`idsalon` INT NOT NULL ,PRIMARY KEY (`idmitarbeiter`) ,INDEX `fksalon` (`idsalon` ASC) ,
CONSTRAINT `fksalon`FOREIGN KEY (`idsalon` ) REFERENCES `friseursalon`.`salon` (`idsalon` ) ON DELETE NO ACTION ON UPDATE NO ACTION)
CREATE TABLE `friseursalon`.`kunde` (`idkunde` INT NOT NULL AUTO_INCREMENT ,`nachname` VARCHAR(45) NOT NULL ,`vorname` VARCHAR(45) NOT NULL ,PRIMARY KEY (`idkunde`) )
CREATE TABLE `friseursalon`.`termin` (`idtermin` INT NOT NULL AUTO_INCREMENT ,`datum` VARCHAR(45) NULL ,
`rechnungsbetrag` DOUBLE NULL ,`idmitarbeiter` INT NOT NULL ,`idkunde` INT NOT NULL , PRIMARY KEY (`idtermin`) , INDEX `fkmitarbeiter` (`idmitarbeiter` ASC) , INDEX `fkkunde` (`idkunde` ASC) , CONSTRAINT `fkmitarbeiter`FOREIGN KEY (`idmitarbeiter` ) REFERENCES `friseursalon`.`mitarbeiter` (`idmitarbeiter` ) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fkkunde`
FOREIGN KEY (`idkunde` ) REFERENCES `friseursalon`.`kunde` (`idkunde` ) ON DELETE NO ACTION
ON UPDATE NO ACTION)