Händler-Datenbank (SQL-Beispiel): Unterschied zwischen den Versionen

aus GlossarWiki, der Glossar-Datenbank der Fachhochschule Augsburg
 
(40 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
{{Qualität
|correctness        = 4
|extent              = 5
|numberOfReferences  = 5
|qualityOfReferences = 5
|conformance        = 5
}}
Das Händler-liefert-Ware-Beispiel ist das klassische Beispiel, um viele Konzepte von [[Datenbanksystem]]en und [[SQL]] zu demonstieren.
Das Händler-liefert-Ware-Beispiel ist das klassische Beispiel, um viele Konzepte von [[Datenbanksystem]]en und [[SQL]] zu demonstieren.
Daher wird dieses Beispiel auch in der Vorlesung [[Kowarschick, W.: Multimedia-Datenbanksysteme|Multimedia-Datenbanksysteme]] verwendet.
Daher wird dieses Beispiel auch in der Vorlesung [[Kowarschick, W.: Multimedia-Datenbanksysteme|Multimedia-Datenbanksysteme]] verwendet.


=Datenmodell/[[ER-Diagramm]] (in [[UML]]-Notation)=
==Datenmodell/[[ER-Diagramm]]==


[[Medium:Haendler_Modell.jpg]]
[[Datei:Haendler1_UML.png|thumb|none|600px|frame|Datenmodell in [[UML]]-Notation]]


Eine Händler, der durch die Händlernummer <code>hnr</code> eindeutig identifiziert werden kann und weitere Attribute, wie Name, Adresse etc hat,
Ein Händler liefert bestimmte Waren.
liefert bestimmte Waren. Die zugehörigen [[Entity|Entities]] ([[Objekt]]e) werden durch den [[Entity-Typ]] <code>haendler</code> definiert.
Er kann durch die Händler-ID <code>h_id</code> eindeutig identifiziert werden und besitzt weitere Attribute, wie Name, Ortschaft etc.
Die zugehörigen [[Entity|Entities]] ([[Objekt]]e) werden durch den [[Entity-Typ]] (die [[Klasse (OOP)|Klasse]]) <code>haendler</code> definiert.


Welche Waren es gibt, ist durch einen weiteren Entity-Typ festgelegt: <code>ware</code>. Eine Ware ist durch die Warennummer <code>wnr</code>
Welche Waren es gibt, ist durch einen weiteren Entity-Typ festgelegt: <code>ware</code>. Eine Ware ist durch die Waren-ID <code>w_id</code>
eindeutig festgelgt. Weitere Attribute, wie Typ (Gemüse, Fleisch, Wurst etc.) und genaue Bezeichnung (Kohlrabi, Rinderlende, Crevelat etc.),
eindeutig festgelgt. Weitere Attribute, wie Typ (Gemüse, Fleisch, Wurst etc.) und genaue Bezeichnung (Kohlrabi, Rinderlende, Cervelat etc.),
beschreiben die jeweilige Ware näher.
beschreiben die jeweilige Ware näher.


Zeile 16: Zeile 24:
legt fest, welcher Händler welche Ware zu welchen Konditionen liefert. Ein Lieferant liefert eine Ware normalerweise zu einem bestimmten  
legt fest, welcher Händler welche Ware zu welchen Konditionen liefert. Ein Lieferant liefert eine Ware normalerweise zu einem bestimmten  
Preis. Zusätzlich kann eine gewisse Lieferzeit (in Tagen) angegeben werden. Es ist auch erlaubt, dass ein Händler ein und dieselbe
Preis. Zusätzlich kann eine gewisse Lieferzeit (in Tagen) angegeben werden. Es ist auch erlaubt, dass ein Händler ein und dieselbe
Ware zu mit unterschiedlichen Preisen unterschiedlich schnell liefert.
Ware zu mit unterschiedlichen Preisen unterschiedlich schnell liefert. Um dies zu ermöglichen, muss das Attribut <code>l_preis</code>
zum orginären Primärschlüssel <code>(h_id, w_id)</code> der Beziehung <code>liefert</code> hinzugefügt werden.


=Datenbankschema=
[[Datei:Haendler1_ER.png|thumb|none|600px|frame|Datenmodell in [[ER-Diagramm|ER]]-Notation]]


[[Medium:Haendler_Schema.png]]
==Datenbankschema==


Dieses Schema wurde nach dem in [[Kowarschick (2009)]] beschriebenen Verfahren aus dem obigen ER-Diargramm erzeugt.
Aus dem obigen ER-Diargramm wird nach dem in [[Kowarschick (MMDB-Skript)]] beschriebenen Verfahren ein Datenbankschema erstellt.
Ein Stern (<code>*</code>) bedeutet dabei <code>NULLABLE</code>.


=Datenbankschema (SQL)=
<source lang="sql">haendler: h_id: INTEGER, h_name: VARCHAR(50), h_ortschaft*: VARCHAR(30)   
          {PK: s_id}
          {UNIQUE: h_name, h_ortschaft}
 
ware:    w_id: INTEGER, w_typ: VARCHAR(30), w_bezeichnung: VARCHAR(30)
          {PK: w_id}
          {UNIQUE: w_typ, w_bezeichung} 
 
liefert:  h_id: INTEGER, w_id: INTEGER, l_preis: NUMERIC(8,2), l_lieferzeit*: SMALINT
          {PK: s_id, w_id, l_preis} 
          {FK: h_id -> haendler: h_id}
          {FK: w_id -> ware: w_id}
          {l_lieferzeit > 0}
</source>
 
==Datenbankschema (SQL)==
 
Aus dem obigen Datenbankschema leitet sich folgende SQL-[[DDL]]-Befehle ab (Syntax getestet mit [[SQLite]] und [[PostgreSQL]]):


<source lang="sql">
<source lang="sql">
DROP TABLE IF EXISTS liefert  CASCADE;
/* Alte Tabellen (in der richtigen Reihenfolge) löschen: */
DROP TABLE IF EXISTS ware    CASCADE;
DROP TABLE IF EXISTS haendler CASCADE;


DROP TABLE IF EXISTS dummy    CASCADE;
DROP TABLE IF EXISTS liefert;
DROP TABLE IF EXISTS ware;
DROP TABLE IF EXISTS haendler;


/* Tabellen erstellen */


CREATE TABLE haendler
CREATE TABLE haendler
(hnr      INTEGER    NOT NULL,
  (h_id        INTEGER    NOT NULL,
name     VARCHAR(20) NOT NULL,
  h_name     VARCHAR(30) NOT NULL,
adresse  VARCHAR(20),
  h_ortschaft VARCHAR(50),


CONSTRAINT pk_haendler
  CONSTRAINT pk_haendler
  PRIMARY KEY (hnr),
    PRIMARY KEY (h_id),


CONSTRAINT unique_name_address
  CONSTRAINT unique_haendler_name_ortschaft
  UNIQUE (name, adresse)
    UNIQUE (h_name, h_ortschaft)
);
  );


CREATE TABLE ware
CREATE TABLE ware
(wnr         INTEGER    NOT NULL,
  (w_id         INTEGER    NOT NULL,
typ          VARCHAR(20) NOT NULL DEFAULT 'Sonstiges',
  w_typ        VARCHAR(30) NOT NULL DEFAULT 'Sonstiges',
bezeichnung  VARCHAR(20) NOT NULL,
  w_bezeichnung VARCHAR(50) NOT NULL,


CONSTRAINT pk_ware
  CONSTRAINT pk_ware
  PRIMARY KEY (wnr),
    PRIMARY KEY (w_id),


CONSTRAINT unique_typ_bezeichnung
  CONSTRAINT unique_haendler_typ_bezeichnung
  UNIQUE (typ, bezeichnung)
    UNIQUE (w_typ, w_bezeichnung)
);
  );
                  
                  
CREATE TABLE liefert
CREATE TABLE liefert
(hnr         INTEGER      NOT NULL,
  (h_id         INTEGER      NOT NULL,
wnr         INTEGER      NOT NULL,
  w_id         INTEGER      NOT NULL,
preis      NUMERIC(6,2)  NOT NULL,
  l_preis      NUMERIC(8,2)  NOT NULL,
lieferzeit  SMALLINT     CHECK (lieferzeit >= 0), /* Tage */
  l_lieferzeit SMALLINT,     /* Tage */
 
CONSTRAINT pk_liefert
  PRIMARY KEY (hnr,wnr,preis),
 
CONSTRAINT fk_liefert_haendler
  FOREIGN KEY (hnr) REFERENCES haendler (hnr),


CONSTRAINT fk_liefert_ware
  CONSTRAINT pk_liefert
  FOREIGN KEY (wnr) REFERENCES ware (wnr)
    PRIMARY KEY (h_id, w_id, l_preis),
);


/***********************************************************************
  CONSTRAINT fk_liefert_haendler
* Dummy-Tabelle. Diese Tabelle kann für Abfragen eingesetzt
    FOREIGN KEY (h_id) REFERENCES haendler (h_id),
* werden, für deren Beantwortung eigentlich gar keine Tabelle
* benötigt wird. Laut SQL-Standard muss immer eine Tabelle
* in der FROM-Klausel einer SELECT-Anweisung angegeben werden.
*
* In PostgreSQL ist es auch möglich, Select-Anweisungen ohne
* From-Klausel anzugeben. Dies ist allerdings nicht standard-konform.
***********************************************************************/


CREATE TABLE dummy
  CONSTRAINT fk_liefert_ware
(
    FOREIGN KEY (w_id) REFERENCES ware (w_id),
id INTEGER NOT NULL,
CONSTRAINT p_dummy
  PRIMARY KEY (id)
);


  CONSTRAINT check_liefert_lieferzeit
    CHECK (l_lieferzeit > 0)
  );
</source>
</source>


=Beispiels-Daten=
==Beispielsdaten==


<source lang="sql">
<source lang="sql">
INSERT INTO haendler(hnr, name, adresse)
INSERT INTO haendler(h_id, h_name, h_ortschaft)
VALUES  
VALUES  
(1, 'Maier',  'Königsbrunn'),
  (1, 'Maier',  'Königsbrunn'),
(2, 'Müller',  'Königsbrunn'),
  (2, 'Müller',  'Königsbrunn'),
(3, 'Maier',  'Augsburg'),
  (3, 'Maier',  'Augsburg'),
(4, 'Huber',  NULL),
  (4, 'Huber',  NULL),
(5, 'Schmidt', 'Hamburg');
  (5, 'Schmidt', 'Hamburg')
;


INSERT INTO ware(wnr, typ, bezeichnung)
INSERT INTO ware(w_id, w_typ, w_bezeichnung)
VALUES
VALUES
(1, 'CPU',      'Pentium IV 3,8'),
  (1, 'CPU',      'Pentium IV 3,8'),
(2, 'CPU',      'Celeron 2,6'),
  (2, 'CPU',      'Celeron 2,6'),
(3, 'CPU',      'Athlon XP 3000+'),
  (3, 'CPU',      'Athlon XP 3000+'),
(4, 'Sonstiges', 'Eieruhr');
  (4, 'RAM',      'SDRAM 1GB'),
  (5, 'Sonstiges', 'Eieruhr')
;


INSERT INTO liefert(hnr, wnr, preis, lieferzeit)
INSERT INTO liefert(h_id, w_id, l_preis, l_lieferzeit)
VALUES
VALUES  
(1, 1, 200.00, 1),
  (1, 1, 200.00, 1),
(1, 2, 100.00, NULL),
  (1, 1, 194.00, 6),
(1, 3, 150.00, 7),
  (1, 2, 100.00, NULL),
(2, 3, 150.00, 4),
  (1, 3, 150.00, 7),
(1, 4, 10.00, 1),
  (1, 4, 10.00, 1),
(2, 1, 160.00, 1),
  (1, 5,   5.00, 1),
(2, 2, 180.00, NULL),
  (2, 1, 160.00, NULL),
(3, 1, 160.00, 4),
  (2, 1, 190.00, 1),
(3, 2, 190.00, 1),
  (2, 2, 180.00, NULL),
(4, 1, 150.00, 3),
  (2, 3, 170.00, 4),
(4, 3, 180.00, 5),
  (3, 1, 195.00, 2),
(4, 3, 199.99, 1);
  (3, 2, 190.00, 1),
  (4, 1, 150.00, 3),
  (4, 3, 180.00, 5),
  (4, 3, 199.99, 1)
;
</source>


/* Die Dummy-Tabelle enthält stets genau ein Tupel. */
==SQL-Beispiele==
* [[Händler-Datenbank (SQL-Beispiel)/Identität|Identität]]
* [[Händler-Datenbank (SQL-Beispiel)/Projektion|Projektion]]
* [[Händler-Datenbank (SQL-Beispiel)/Selektion|Selektion]]
* [[Händler-Datenbank (SQL-Beispiel)/Join|Join]]
* [[Händler-Datenbank (SQL-Beispiel)/Unteranfragen|Unteranfragen]]


INSERT INTO dummy(id)
==Quellen==
VALUES
(1);
</source>
 
=Quellen=


#{{Quelle|Kowarschick, W. (MMDB-Skript): Skriptum zur Vorlesung Multimedia-Datenbanksysteme}}
#{{Quelle|Kowarschick, W.: Multimedia-Datenbanksysteme}}
#{{Quelle|Kowarschick, W.: Multimedia-Datenbanksysteme}}
#{{Quelle|Kowarschick, W. (2009): Skriptum zur Vorlesung Multimedia-Datenbanksysteme}}
=Siehe auch=


*{{Vgl|Händler2-Datenbank (SQL-Beispiel, PostgreSQL)}} (komplexere Version dieser Datenbank)
==Siehe auch==
* [[Händler-Datenbank (SQL-Beispiel)/Identität]]
* [[Händler-Datenbank (SQL-Beispiel)/Projektion]]
* [[Händler-Datenbank (SQL-Beispiel)/Selektion]]
*{{Vgl|Händler2-Datenbank (SQL-Beispiel)}} (komplexere Version dieser Datenbank)


[[Kategorie:PostgreSQL-Beispiel]]
[[Kategorie:PostgreSQL-Beispiel]]
[[Kategorie:SQL-Beispiel]]
[[Kategorie:Praktikum:MMDB]]

Aktuelle Version vom 10. Oktober 2019, 16:23 Uhr

Dieser Artikel erfüllt die GlossarWiki-Qualitätsanforderungen:

Korrektheit: 4
(großteils überprüft)
Umfang: 5
(wesentliche Fakten vorhanden)
Quellenangaben: 5
(vollständig vorhanden)
Quellenarten: 5
(ausgezeichnet)
Konformität: 5
(ausgezeichnet)

Das Händler-liefert-Ware-Beispiel ist das klassische Beispiel, um viele Konzepte von Datenbanksystemen und SQL zu demonstieren. Daher wird dieses Beispiel auch in der Vorlesung Multimedia-Datenbanksysteme verwendet.

Datenmodell/ER-Diagramm

Datenmodell in UML-Notation

Ein Händler liefert bestimmte Waren. Er kann durch die Händler-ID h_id eindeutig identifiziert werden und besitzt weitere Attribute, wie Name, Ortschaft etc. Die zugehörigen Entities (Objekte) werden durch den Entity-Typ (die Klasse) haendler definiert.

Welche Waren es gibt, ist durch einen weiteren Entity-Typ festgelegt: ware. Eine Ware ist durch die Waren-ID w_id eindeutig festgelgt. Weitere Attribute, wie Typ (Gemüse, Fleisch, Wurst etc.) und genaue Bezeichnung (Kohlrabi, Rinderlende, Cervelat etc.), beschreiben die jeweilige Ware näher.

Zwischen den Entity-Typen haendler und ware besteht eine Beziehung: liefert. Diese legt fest, welcher Händler welche Ware zu welchen Konditionen liefert. Ein Lieferant liefert eine Ware normalerweise zu einem bestimmten Preis. Zusätzlich kann eine gewisse Lieferzeit (in Tagen) angegeben werden. Es ist auch erlaubt, dass ein Händler ein und dieselbe Ware zu mit unterschiedlichen Preisen unterschiedlich schnell liefert. Um dies zu ermöglichen, muss das Attribut l_preis zum orginären Primärschlüssel (h_id, w_id) der Beziehung liefert hinzugefügt werden.

Datenmodell in ER-Notation

Datenbankschema

Aus dem obigen ER-Diargramm wird nach dem in Kowarschick (MMDB-Skript) beschriebenen Verfahren ein Datenbankschema erstellt. Ein Stern (*) bedeutet dabei NULLABLE.

haendler: h_id: INTEGER, h_name: VARCHAR(50), h_ortschaft*: VARCHAR(30)     
          {PK: s_id} 
          {UNIQUE: h_name, h_ortschaft}

ware:     w_id: INTEGER, w_typ: VARCHAR(30), w_bezeichnung: VARCHAR(30)
          {PK: w_id}
          {UNIQUE: w_typ, w_bezeichung}  

liefert:  h_id: INTEGER, w_id: INTEGER, l_preis: NUMERIC(8,2), l_lieferzeit*: SMALINT 
          {PK: s_id, w_id, l_preis}  
          {FK: h_id -> haendler: h_id}
          {FK: w_id -> ware: w_id}
          {l_lieferzeit > 0}

Datenbankschema (SQL)

Aus dem obigen Datenbankschema leitet sich folgende SQL-DDL-Befehle ab (Syntax getestet mit SQLite und PostgreSQL):

/* Alte Tabellen (in der richtigen Reihenfolge) löschen: */

DROP TABLE IF EXISTS liefert;
DROP TABLE IF EXISTS ware;
DROP TABLE IF EXISTS haendler;

/* Tabellen erstellen */

CREATE TABLE haendler
  (h_id        INTEGER     NOT NULL,
   h_name      VARCHAR(30) NOT NULL,
   h_ortschaft VARCHAR(50),

   CONSTRAINT pk_haendler
     PRIMARY KEY (h_id),

   CONSTRAINT unique_haendler_name_ortschaft
     UNIQUE (h_name, h_ortschaft)
  );

CREATE TABLE ware
  (w_id          INTEGER     NOT NULL,
   w_typ         VARCHAR(30) NOT NULL DEFAULT 'Sonstiges',
   w_bezeichnung VARCHAR(50) NOT NULL,

   CONSTRAINT pk_ware
     PRIMARY KEY (w_id),

   CONSTRAINT unique_haendler_typ_bezeichnung
     UNIQUE (w_typ, w_bezeichnung)
  );
                
CREATE TABLE liefert
  (h_id         INTEGER       NOT NULL,
   w_id         INTEGER       NOT NULL,
   l_preis      NUMERIC(8,2)  NOT NULL,
   l_lieferzeit SMALLINT,     /* Tage */

   CONSTRAINT pk_liefert
     PRIMARY KEY (h_id, w_id, l_preis),

   CONSTRAINT fk_liefert_haendler
     FOREIGN KEY (h_id) REFERENCES haendler (h_id),

   CONSTRAINT fk_liefert_ware
     FOREIGN KEY (w_id) REFERENCES ware (w_id),

   CONSTRAINT check_liefert_lieferzeit
     CHECK (l_lieferzeit > 0)
  );

Beispielsdaten

INSERT INTO haendler(h_id, h_name, h_ortschaft)
VALUES 
  (1, 'Maier',   'Königsbrunn'),
  (2, 'Müller',  'Königsbrunn'),
  (3, 'Maier',   'Augsburg'),
  (4, 'Huber',   NULL),
  (5, 'Schmidt', 'Hamburg')
;

INSERT INTO ware(w_id, w_typ, w_bezeichnung)
VALUES
  (1, 'CPU',       'Pentium IV 3,8'),
  (2, 'CPU',       'Celeron 2,6'),
  (3, 'CPU',       'Athlon XP 3000+'),
  (4, 'RAM',       'SDRAM 1GB'),
  (5, 'Sonstiges', 'Eieruhr')
;

INSERT INTO liefert(h_id, w_id, l_preis, l_lieferzeit)
VALUES 
  (1, 1, 200.00, 1),
  (1, 1, 194.00, 6),
  (1, 2, 100.00, NULL),
  (1, 3, 150.00, 7),
  (1, 4,  10.00, 1),
  (1, 5,   5.00, 1),
  (2, 1, 160.00, NULL),
  (2, 1, 190.00, 1),
  (2, 2, 180.00, NULL),
  (2, 3, 170.00, 4),
  (3, 1, 195.00, 2),
  (3, 2, 190.00, 1),
  (4, 1, 150.00, 3),
  (4, 3, 180.00, 5),
  (4, 3, 199.99, 1)
;

SQL-Beispiele

Quellen

  1. Kowarschick (MMDB-Skript): Wolfgang Kowarschick; Vorlesung Multimedia-Datenbanksysteme – Sommersemester 2018; Hochschule: Hochschule Augsburg; Adresse: Augsburg; Web-Link; 2018; Quellengüte: 4 (Skript)
  2. Kowarschick (MMDB): Wolfgang Kowarschick; Vorlesung „Multimedia-Datenbanksysteme“; Hochschule: Hochschule Augsburg; Adresse: Augsburg; Web-Link; 2016; Quellengüte: 3 (Vorlesung)

Siehe auch