Nun wäre die Zeile 1,1,1 die Zuordnung “Reifen”->“Autobau” oder die 3,2,3 “Segel”->“Schiffsbau”.
Eine einfache INSERT INTO Produktkategorien VALUES(x,y,z) funktioniert nicht, da ich immer schauen muss, welches Produkt gemeint ist, um auf seine Kategorie zu schließen.
Welchen Ansatz würde man gehen, um dieses Problem zu lösen? (Was als Annahme gilt, ist folgendes: Zu jedem Produkt kenne ich die Bezeichnung der Kategorie!)
Natürlich! Das Interessante ist wahrscheinlich die letzte Tabelle. Produkt_Id und Kategorie_Id sind Fremdschlüssel.
CREATE TABLE produkte
(
id int4 NOT NULL,
name varchar(512),
CONSTRAINT produkte_pkey PRIMARY KEY (id)
)
CREATE TABLE kategorien
(
id int4 NOT NULL,
bezeichnung varchar(128),
CONSTRAINT kategorien_pkey PRIMARY KEY (id)
)
CREATE TABLE produktkategorien
(
id int4 NOT NULL,
kategorie_id int4,
produkt_id int4,
CONSTRAINT produktkategorien_pkey PRIMARY KEY (id),
CONSTRAINT ref12 FOREIGN KEY (produkt_id)
REFERENCES produkte (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT ref13 FOREIGN KEY (kategorie_id)
REFERENCES kategorien (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
um es einfacher zu machen, habe ich Dir hier einigen Code zusammengestellt. Allerdings sind einige Namen geändert worden. Aber da wirst Du schon durchschauen. Mit PGAdmin kannst Du den Code auch testen.
-- DROP TABLE produkt;
-- DROP TABLE kategorie;
-- DROP TABLE type;
-- DROP TABLE markt;
-- ==================================================================
CREATE TABLE type
(
id SERIAL PRIMARY KEY,
bezeichnung VARCHAR(30) NOT NULL
);
CREATE TABLE markt
(
id SERIAL PRIMARY KEY,
bezeichnung VARCHAR(30) NOT NULL
);
CREATE TABLE kategorie
(
id SERIAL PRIMARY KEY,
id_type INTEGER REFERENCES type,
id_markt INTEGER REFERENCES markt,
bezeichnung VARCHAR(30) NOT NULL,
UNIQUE (id_type,id_markt)
);
CREATE TABLE produkt
(
nummer VARCHAR(20) PRIMARY KEY,
bezeichnung VARCHAR(100) NOT NULL,
id_kategorie INTEGER REFERENCES kategorie
);
INSERT INTO type (bezeichnung) VALUES ('reifen');
INSERT INTO type (bezeichnung) VALUES ('bremsschlauch');
INSERT INTO type (bezeichnung) VALUES ('segel');
INSERT INTO type (bezeichnung) VALUES ('schleudersitz');
INSERT INTO markt (bezeichnung) VALUES ('autobau');
INSERT INTO markt (bezeichnung) VALUES ('schiffsbau');
INSERT INTO markt (bezeichnung) VALUES ('flugzeugbau');
INSERT INTO kategorie
(
id_type,
id_markt,
bezeichnung
)
SELECT type.id,
markt.id,
type.bezeichnung || ' - ' || markt.bezeichnung AS bezeichnung
FROM type
CROSS JOIN markt;
INSERT INTO produkt (nummer, bezeichnung, id_kategorie) VALUES (1, 'Segel 2*3', 9);
INSERT INTO produkt (nummer, bezeichnung, id_kategorie) VALUES (2, 'Sitz spezial', 10);
INSERT INTO produkt (nummer, bezeichnung, id_kategorie) VALUES (3, 'Reifen', 2);
-- ==================================================================
SELECT *
FROM type;
-- ==================================================================
SELECT *
FROM markt;
-- ==================================================================
Select *
From Kategorie;
-- ==================================================================
SELECT produkt.nummer AS Produktnummer,
produkt.bezeichnung as Produktbezeichnung,
kategorie.bezeichnung as Kategorie
FROM produkt
INNER JOIN kategorie
ON produkt.id_kategorie = kategorie.id;
Im Endeffekt wird die Erzeugung der Datensätze für die Tabelle “kategorie” etwas komplexer ausfallen. Überlege was Du machen musst, wenn es Änderungen in den Tabellen “type” und “markt” gibt. Die wird es mit Sicherheit geben.