36
Fakultät für Informatik & Wirtschaftsinformatik DB & IS II SS 2015 Dr. Christian Senger PHP Object Relational Mapping Layer PHP & ORM 1

PHP - HS-KARLSRUHEFakultät für Informatik & Wirtschaftsinformatik DB & IS II – SS 2015 Dr. Christian Senger Klassenstruktur in PHP, alternativ class CRUD_movie { · 2015-4-25

Embed Size (px)

Citation preview

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

Fakultät für Informatik & Wirtschaftsinformatik

DB & IS II – SS 2015

Dr. Christian Senger

PHP & ORM 36