Evelines Konzept
Ich bin nicht ganz zufrieden mit der Lösung, aber vielleicht gibt es ja noch weitere Verbesserungsvorschläge.
Martin
/******************************************
LookUptabelle lt_Verlag
LookUp-Tabelle für Verlage
Ein Datensatz= ein Verlag
******************************************/
CREATE TABLE lt_verlag
( id_verlag int NOT NULL AUTO_INCREMENT
, verlagname CHAR(30)
, verlagort CHAR(30)
, bemerkung CHAR (1000)
, PRIMARY KEY(id_verlag)
) ENGINE=XXXX;
--------------------------------------------------------------------------
/******************************************
LookUptabelle lt_Autor
LookUp-Tabelle für (Buch)-Autoren
Ein Datensatz= ein Autor
Gibt es vielleicht schon?
******************************************/
CREATE TABLE lt_autor
( id_autor int NOT NULL AUTO_INCREMENT
, autorname CHAR(60)
, bemerkung CHAR (1000)
, PRIMARY KEY(id_autor)
) ENGINE=XXXX;
-----------------------------------------------------------------------------
/******************************************
LookUptabelle lt_besitzer
LookUp-Tabelle für Besitzer der Literatur
Entspricht dem Forumsmitglied, bzw. das
Forum selbst.
Ein Datensatz= ein Besitzer
Gibt es vielleicht schon?
******************************************/
CREATE TABLE lt_besitzer
( id_besitzer int NOT NULL AUTO_INCREMENT
, besitzername CHAR(30)
, bemerkung CHAR (1000)
, PRIMARY KEY(id_besitzer)
) ENGINE=XXXX;
---------------------------------------------------------------------------------
/******************************************
Datentabelle dt_literatur
nimmt Daten zu Literaturwerken (Bücher, Zeitschriften PDF's)
auf, die sich entweder bei einem Forumsmitglied oder
auf der Forumsfestplatte befinden und ausgeliehen
werden können.
Jedes Literaturstück hat nur einen Besitzer, einen
Verlag und einen Autor (gemeinsame Autorenschaft hat eigene ID)
******************************************/
CREATE TABLE dt_literatur
( id_literatur int NOT NULL AUTO_INCREMENT
, id_verlag int
, id_autor int
, id_besitzer int
, titel CHAR(100)
, kategorie CHAR(12)
, ausgabejahr CHAR(4)
, isbn_nr CHAR(20)
, stichworte CHAR (800)
, bemerkung CHAR (1000)
, PRIMARY KEY dtliteratur_pk (id_literatur)
) ENGINE=XXXX;
-- Index und Constraints (Index auf jedes Feld, das vermutlich oft als Filter verwendet wird
alter table dt_literatur add index dtliteratur_ix_idverlag (id_verlag);
alter table dt_literatur add constraint dtliteratur_fk_idverlag FOREIGN KEY (id_verlag) references lt_verlag (id_verlag);
alter table dt_literatur add index dtliteratur_ix_idautor (id_autor);
alter table dt_literatur add constraint dtliteratur_fk_idautor FOREIGN KEY (id_autor) references lt_autor (id_autor);
alter table dt_literatur add index dtliteratur_fk_idbesitzer (id_besitzer);
alter table dt_literatur add constraint dtliteratur_fk_idbesitzer FOREIGN KEY (id_besitzer) references lt_besitzer (id_besitzer);
alter table dt_literatur add index dtliteratur_ix_kategorie (kategorie);
alter table dt_literatur add constraint dtliteratur_ck_kategorie CHECK (kategorie in ('BUCH','ZEITUNG','PDF'));
alter table dt_literatur add index dtliteratur_ix_stichworte (stichworte);
alter table dt_literatur add index dtliteratur_ix_isbnnr (isbn_nr);
alter table dt_literatur add index dtliteratur_ix_titel (titel);
--
/*************************************************************************************
View literatur_v
View, die die Daten aus der tabelle Literatur und seiner LookUps zusammenführt.
Auf diese View werden die Abfragen gemacht, wenn nach spezieller Literatur gesucht wird.
Z.B. auf Stichworte oder Titel, oder Autorname oder Besitzername o.ä.
OuterJoins = (+)
Ich weiß nicht, wie man die in MySQL schreibt. Heißt das die Seite, auf der das
Plus-Zeichen steht, auch NULL sein kann. Also auch Datensätze, in der kein verlag, besitzer
oder Autor eingetragen ist.
Die Anzahl der View muss mit der Anzahl der Tabelle dt_literatur übereinstimmen
select cout(*) from dt_literatur;
select count(*) from literatur_v;
*************************************************************************************/
CREATE OR REPLACE VIEW literatur_v
AS
select l.id_literatur
, l.id_verlag
, l.id_autor
, l.id_besitzer
, l.titel
, l.kategorie
, l.ausgabejahr
, l.isbn_nr
, l.stichworte
, l.bemerkung
-- Verlag
, v.verlagname
, v.verlagort
-- Autor
, a.autorname
-- Besitzer
, b.besitzername
from dt_literatur as l, lt_verlag as v, lt_autor as a, lt_besitzer as b
where l.id_verlag = v.id_verlag (+)
and l.id_autor = a.id_autor (+)
and l.besitzer = b.id_besitzer (+)
;
/**************************************************************************
Verknüpfungstabelle vt_literatur_art
Verknüpft die Literaturtabelle mit der Artentabelle
**************************************************************************/
CREATE TABLE vt_literatur_art
( id_literatur int NOT NULL
, id_art int NOT NULL
, INDEX (id_literatur)
, FOREIGN KEY(id_literatur) REFERENCES dt_literatur (id_literatur)
, INDEX (id_art)
, FOREIGN KEY(id_art) REFERENCES <name arttabelle> (id_art)
) ENGINE=INNODB;
--
/*************************************************************************************
View, die die Daten der zusammengeführten Tabellen bereithält.
Auf diese View werden die Abfragen gemacht, wenn Literatur zu Arten gesucht werden.
Die Anzahl Datensätze in der View muss mit der Anzahl der Tabelle vt_literatur_art übereinstimmen
select cout(*) from vt_literatur_art;
select count(*) from literatur_art_v;
*************************************************************************************/
CREATE OR REPLACE VIEW literatur_art_v
AS
select l.id_literatur
, l.id_verlag
, l.id_autor
, l.id_besitzer
, l.titel
, l.kategorie
, l.ausgabejahr
, l.isbn_nr
, l.stichworte
, l.bemerkung
, l.verlagname
, l.verlagort
, l.autorname
, l.besitzername
-- Art
, a.id_art
, a.artname
-- und was man sonst noch von Art braucht
from vt_literatur_art as la, literatur_v as l, <name arttabelle> as a
where la.id_literatur = l.id_literatur
and la.id_art = a.id_art
;