Code:
-- Die Tabelle mit den Kategorien
CREATE TABLE kategorien (
id_kategorie INT NOT NULL,
bez_kategorie VARCHAR2(30) NOT NULL
);
CREATE UNIQUE INDEX pk_kategorie ON kategorie (id_kategorie);
INSERT INTO kategorie (id_kategorie, bez_kategorie)
VALUES (1, 'Film');
INSERT INTO kategorie (id_kategorie, bez_kategorie)
VALUES (2, 'Buch');
-- die Tabelle mit den moeglichen Details zu einer Kategorie
CREATE TABLE kat_details (
id_kat_details INT NOT NULL,
id_kategorie INT NOT NULL,
bez_detail VARCHAR2(32) NOT NULL
);
CREATE UNIQUE INDEX pk_kat_details ON kat_details (id_kat_details);
CREATE UNIQUE INDEX idx_kat_details_1 ON kat_details (id_kategorie, bez_detail);
INSERT INTO kat_details (id_kat_details, id_kategorie, bez_detail)
VALUES (1, 1, 'Schauspieler');
INSERT INTO kat_details (id_kat_details, id_kategorie, bez_detail)
VALUES (2, 1, 'Regisseur');
INSERT INTO kat_details (id_kat_details, id_kategorie, bez_detail)
VALUES (3, 2, 'ISBN13');
INSERT INTO kat_details (id_kat_details, id_kategorie, bez_detail)
VALUES (4, 2, 'Autor');
-- die Tabelle mit den Haupt-Eigenschaften
CREATE TABLE liste (
id_eintrag INT NOT NULL,
id_kategorie INT NOT NULL,
bez_eintrag VARCHAR2(128),
eigenschaft_1 VARCHAR2(64)
);
CREATE UNIQUE INDEX pk_liste ON liste (id_eintrag);
INSERT INTO liste (id_eintrag, id_kategorie, bez_eintrag, eigenschaft_1)
VALUES (1,1,'Ein toller Film', 'Film-GmbH');
INSERT INTO liste (id_eintrag, id_kategorie, bez_eintrag, eigenschaft_1)
VALUES (2,1,'Ein blöder Film', 'Schrott-GmbH');
INSERT INTO liste (id_eintrag, id_kategorie, bez_eintrag, eigenschaft_1)
VALUES (3,2,'Ein tolles Buch', 'Buch-GmbH');
-- die Tabelle, die die Details enthält
CREATE TABLE details (
id_detail INT NOT NULL,
id_eintrag INT NOT NULL,
id_kat_detail INT NOT NULL,
wert_detail VARCHAR2(255)
);
CREATE UNIQUE INDEX pk_details ON details (id_detail);
CREATE INDEX idx_details_1 ON details (id_eintrag, id_kat_detail);
INSERT INTO details (id_detail, id_eintrag, id_kat_detail, wert_detail)
VALUES (1, 1, 1, 'der Star');
INSERT INTO details (id_detail, id_eintrag, id_kat_detail, wert_detail)
VALUES (2, 1, 1, 'noch ein Star');
INSERT INTO details (id_detail, id_eintrag, id_kat_detail, wert_detail)
VALUES (3, 1, 2, 'Allan Smithee');
INSERT INTO details (id_detail, id_eintrag, id_kat_detail, wert_detail)
VALUES (4, 2, 2, 'Allan Smithee');
INSERT INTO details (id_detail, id_eintrag, id_kat_detail, wert_detail)
VALUES (5, 3, 1, '978-1-234-5678-9');
INSERT INTO details (id_detail, id_eintrag, id_kat_detail, wert_detail)
VALUES (5, 3, 2, 'Stefan König');
Der Nachteil bei solchen Lösungen ist, dass in der Detail-Tabelle für die Spalte "wert_detail" ein Datentyp benutzt werden muss, der allen möglichen Detail-Eigenschaften genügt und nicht per DB-Design solche Sachen wie Eindeutigkeit der Eigenschaft, Wertebereiche usw. geprüft werden können. Das muss dann entweder die Anwendung oder eine SQL-Prozedur o. a. erledigen. Man lässt bei solchen Designs also etliche Möglichkeiten brachliegen, die ein vernünftiges DBMS bietet.
Lesezeichen