Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
PHP
Object Relational Mapping Layer
PHP & ORM 1
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
Object Relational Mapping Layer
PHP & ORM 2
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
Object Relational Mapping Layer
• Einige Operationen können vom ER-Diagram (or UML-
Diagram) abgeleitet werden:
– Erstellen und Löschen von Objekten
– Modifikationen von Objekten
– Modifikationen der Beziehungen von Objekten
– Suche nach Objekten
PHP & ORM 3
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
Beispiel
• Film
• Mitwirkende Personen
PHP & ORM 4
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
Tabellenstruktur
CREATE TABLE person (
p_id INT (10) AUTO_INCREMENT,
name VARCHAR (40) NOT NULL,
vorname VARCHAR(40) NOT NULL,
geburtsjahr YEAR(4),
PRIMARY KEY(p_id)
) TYPE=InnoDB;
CREATE TABLE film (
f_id INT (10) AUTO_INCREMENT,
titel VARCHAR (100) NOT NULL,
jahr year(4),
regisseur_fk INT (10),
index (regisseur_fk), -- MySQL
FOREIGN KEY (regisseur_fk)
REFERENCES person(p_id)
ON DELETE SET NULL,
PRIMARY KEY(f_id)
) TYPE=InnoDB;
CREATE TABLE hat_rolle (
schauspieler_fk INT(10) NOT NULL,
movie_fk INT(10) not null,
index (movie_fk), -- Besonderheit bei MySQL
index (schauspieler_fk), -- Besonderheit bei MySQL
FOREIGN KEY(film_fk) REFERENCES film(f_id) ON DELETE CASCADE,
FOREIGN KEY(schauspieler_fk) REFERENCES person(p_id)ON DELETE CASCADE
) TYPE=InnoDB;
PHP & ORM 5
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
Klassenstruktur in PHP
class CRUD_movie {
private $id;
private $title;
private $year;
private $regisseur;
private $actors = array();
function __construct(...) {
}
// ...
}
class CRUD_Person {
private $id;
private $surname;
private $prename;
private $birthdate;
private $directed_movies = array();
private $movies = array();
function __construct(...) {
}
// ...
}
PHP & ORM 6
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
Klassenstruktur in PHP, alternativ
class CRUD_movie {
private $id;
private $title;
private $year;
function __construct(...) {
}
// ...
}
class CRUD_Person {
private $id;
private $surname;
private $prename;
private $birthdate;
function __construct(...) {
}
// ...
}
•Daten ohne vorhalten in PHP aus der DB holen und dort speichern
•Keine eigene Verwaltung bei konkurrierenden Zugriffen
(Wir erinnern uns an Transaktionen und z.B. Buchungssysteme!)
PHP & ORM 7
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
CRUD Interface – Notwendige Methoden
Klasse: Person
//static methods:
$p =
CRUD_Person::create($name, ...)
$p = CRUD_Person::get($id)
$p_list = CRUD_Person::query($cond)
// immer interessant:
$p_list = CRUD_person::getAll()
// instance methods:
$p->delete()
// Accessor/Mutatormethoden:
$p->getPrename(), $f->setPrename($n)
$p->getSurname(), $p->setSurname($n)
$p->getBirthday(),
$p->setBirthday($d)
$p->getMovies()
$p->getDirectedMovies()
// Modification of Relationships
$p->addMovie($film)
$p->deleteMovie($film)
$p->addDirectedMovie($movie)
$p->delDirectedMovie($ movie)
PHP & ORM 8
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
CRUD Interface – Notwendige Methoden
Klasse: Movie
//static methods:
$f = CRUD_Movie::create($title, $year)
$f = CRUD_Movie::get($id)
$f_list = CRUD_Movie::query($cond)
// immer interessant:
$f_list = CRUD_Movie::getAll()
// instance methods:
$f->delete()
// Accessor/Mutatormethoden:
f->getTitle(), $f->setTitle($t)
$f->getYear(), $f->setYear($y)
$f->getRegisseur()
$f->getActors()
// Modification of Relationships
$f->addActor($actor)
$f->deleteActor($actor)
$f->setRegisseur($r)
$f->unsetRegisseur()
PHP & ORM 9
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
CRUD interface: Methoden und SQL (Movie)
Methode SQL-Statement Parameter
CRUD_movie::create($title,
$year)
INSERT INTO Film
(title, year, id)
VALUES (?, ?, ?)
$title,
$year,
$id
CRUD_movie::get($id)
SELECT id, title, year,
regisseur_fk
FROM Film
WHERE id = ? $id
CRUD_movie::query($cond)
SELECT id, title, year,
regisseur_fk
FROM Film
WHERE $cond $cond
$f->delete() DELETE FROM Film WHERE id = ? $this->id
$f->setTitle($title)
UPDATE Film SET title = ?
WHERE ID = ?
$title,
$this->id
PHP & ORM 10 von 36
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
CRUD interface: Methoden und SQL (Movie)
Methode SQL-Statement SQL-parameter
$f->addActor($actor)
INSERT INTO plays_role
(actor_fk, film_fk)
VALUES (? , ?)
$actor->getId(),
$this->id
$f->deleteActor($actor)
DELETE FROM plays_role
WHERE actor_fk = ? AND
film_fk = ?
$actor->getId(),
$this->id
$f->getActors()
SELECT prename, surname, id,
birthday FROM Person,
plays_role WHERE
plays_role.film_fk = ? AND
plays_role.actor_fk=Person.id $this->id
$f->
setRegisseur($person)
UPDATE Film SET regisseur_fk
= ? WHERE ID = ?
$person->getId(),
$this->id
$f->getRegisseur()
SELECT surname, prename, id,
birthday FROM Person
WHERE id = ? $this->regisseur_fk
PHP & ORM 11 von 36
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
Beispiel-Implementierung: getActors()
class CRUD_movie {
// weitere Methoden ...
function getActors() {
$db = MDB2_Util::getConnection();
$sql = "SELECT id, prename, surname, birthday
FROM Person, plays_role
WHERE plays_role.actor_fk=Person.id
AND plays_role.film_fk = ?";
$stmt = $db->prepare( $sql );
if (PEAR::isError($stmt))
die("<pre>$sql </pre>:".$stmt->getMessage());
$res = $stmt->execute(array($this->id));
if (PEAR::isError($res))
die("execute: <pre>$sql</pre>:".$res->getMessage());
$list = array();
while($row = $res->fetchRow())
$list[] = new CRUD_Person($row[0],$row[1],$row[2], $row[3]);
return $list;
}
PHP & ORM 12
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
First Level Cache
1 Benutzer in 1 Anwendung (z.B. innerhalb einer Session):
• Werden Änderungen an den Objekten nicht sofort in die Datenbank geschrieben kann es sein, dass mehrere Kopien desselben Objektes im Speicher existieren, die einen unterschiedlichen Status haben
• Ausweg: Cache innerhalb einer Transaktion
• Prinzip: – jedes Objekt, das aus Datenbank gelesen wird, wird in Cache eingetragen
– beim Zugriff auf DB wird geschaut ob sich Objekt nicht bereits in Cache befindet, wenn ja dann wird das Objekt zurückgeliefert (zusätzlich Performancegewinn)
– bei Commit werden die geänderten Objekte des Caches zurückgeschrieben
• Implementierung: – z.B. mit assoziativem Array (Dictionary), wobei der Schlüssel durch Objekt-ID
repräsentiert wird und der Wert durch das Objekt selbst (Referenz auf Objekt)
PHP & ORM 13
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
First Level Cache
Cache
$obj1 $stadt3
$hauptstadt
PHP & ORM 14
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
Second Level Cache
• Bereits angefragte Datensätze verbleiben im Cache und werden bei
späteren Anfragen von dort geladen (für mehrere Benutzer)
• Geeignet für folgende Typen von Daten:
– geringe Änderungsrate
– unkritische Daten (non financial)
– Reference data
• geringe Anzahl von Instanzen
• jede Instanz ist mit vielen Instanzen anderer Klassen verbunden
• seltenes Update
• Bei anwendungslokalen (non shared) Daten kein Problem
PHP & ORM 15
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
Optimistische Synchronisation
• Szenario:
– User 1 liest Datensatz und modifiziert ihn in einer Bildschirmmaske
– User 2 liest anschließend denselben Datensatz und modifiziert ihn
ebenfalls
– User 1 speichert den geänderten Datensatz zurück
– User 2 speichert ebenfalls den von ihm geänderten Datensatz zurück
• Problem:
– Änderungen von User 1 sind verloren gegangen
PHP & ORM 16
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
Lösungsansätze
• Pessimistische Synchronistaion – zu bearbeitender Datensatz wird während der Dauer der Bearbeitung
gesperrt (Sperrattribut, Tabelle zur Sperrenverwaltung)
• Optimistische Synchronisation – man geht von keiner „Kollision“ aus
– tritt Kollision auf, so muss diese von der Anwendung/dem Anwender gelöst werden
– Prinzip: • Datensatz erhält zusätzliches Attribut mit Zeitstempel oder Versionsnummer
• Bei jeder Modifikation wird Zeitstempel neu gesetzt, bzw. Versionsnummer hochgezählt
• Beim Abspeichern wird der aktuelle Wert des Zeitstempels bzw. der Versionsnummer mit verglichen
• Immer auch an die Möglichkeiten der Transaktionen denken!
PHP & ORM 17
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
Beispiel zur optimistischen Synchronisation
create table Person (
id integer primary key,
name varchar(40) not null,
vorname varchar(40) not null,
geburtsdatum date,
version integer not null
);
PHP & ORM 18
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
Beispiel zur optimistischen Synchronisation
function saveOrUpdate() {
$db = MDB2_Util::getConnection();
if (empty($this->id)) {
$this->id = $db->nextId('person_seq');
$sql = "insert into person (id, name, vorname, version)
values (?, ?, ?, ?)";
$values = array($this->id, $this->name, $this->vorname,
$this->version);
} else {
$sql = "update person set name=?, vorname=?, version=version+1
where id=? and version= ?";
$values = array($this->name, $this->vorname, $this->id,
$this->version);
$this->version++;
}
$stmt = $db->prepare( $sql, , null, MDB2_PREPARE_MANIP);
$affected_rows = $db->execute($stmt, $values);
if ($affected_rows != 1) return false;
else return true;
}
API bestimmt ID der person
bei Update
versionsnummer hochzählen
test ob Datensatz
zurückgeschrieben wurde
PHP & ORM 19
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
Beispiel (Andreas Schmidt)
PHP & ORM 20
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
PHP & ORM 21
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
PHP & ORM 22
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
PHP & ORM 23
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
PHP & ORM 24
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
PHP & ORM 25
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
PHP & ORM 26
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
PHP & ORM 27
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
PHP & ORM 28
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
PHP & ORM 29
Rückgabe CRUD_Person oder Person?
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
PHP & ORM 30
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
PHP & ORM 31
27
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
PHP & ORM 32
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
PHP & ORM 33
Nachschauen MDB2_Util.php
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
PHP & ORM 34
Fakultät für Informatik & Wirtschaftsinformatik
DB & IS II – SS 2015
Dr. Christian Senger
PHP & ORM 35