Tabellen sinnvoll verbinden

Uri88

Neuer Benutzer
Beiträge
4
Hallo,


ich bin Student und habe daher noch nicht viel Erfahrung mit Datenbankmodellierung. Die 3 Tabellen bereiten mir ziemliches Kopfzerbrechen und ich habe keine Ahnung wie ich diese sinnvoll verbinden kann.
Ein Gebäude hat mehrere Ausgaben
und Mehrere Ausgaben sind von einem Typen

Wenn das meine Datenbank steht soll diese von der Funktionalität so sein, dass ich für je einen Gebäuden und Jahr eine Tabelle mit den Spalten
Ausgabenbezeichnung und Kosten projezieren kann.



62f4ffd45a.jpg


cb49aa2032.jpg



7cb6664925.jpg


Habt Ihr eine Idee wie ich das machen soll?
Gruß
Uri
 
Werbung:
Hier nochmal der code

Code:
CREATE TABLE ImmobilienDB.Ausgabentyp(
    ID int NOT NULL PRIMARY KEY,
    Bezeichnung varchar(255)
);


--
CREATE TABLE ImmobilienDB.Ausgaben_TV_Anschluesse(
    ID int NOT NULL PRIMARY KEY,
    Gebaeude int NOT NULL,
    Jahr int NOT NULL,
    Ausgabe int NOT NULL,
    Kosten double
);

CREATE TABLE ImmobilienDB.Ausgabentyp_TV_Anschluesse(
    Ausgabentyp int,
    Ausgabe int,
    FOREIGN KEY(Ausgabentyp) REFERENCES ImmobilienDB.Ausgabentyp(ID),
    FOREIGN KEY(Ausgabe) REFERENCES ImmobilienDB.Ausgaben_TV_Anschluesse(ID)
);


create table ImmobilienDB.Gebaeude(
    ID int NOT NULL PRIMARY KEY,
    gesamte_Wohnflaeche double NOT NULL,
    Wohnflaeche_ausser_EG double NOT NULL,
    Baujahr int,
    TV_Anschluesse int
);
 
Nicht ganz. Ich weiß nicht wie ich das auf DDL-Ebene mache. Da wo ich 1:1 Kardinalitäten habe, kann ich den Primary Key als Foreign Key nehmen.
Dann sind beide Seiten eindeutig und ich kann joinen. Hier habe Allerdings für jedes Gebäude mehrere Ausgaben nämlich pro Jahr und von mehrere Typen. Der Foreign Key für Ausgabentypen-Ausgaben müsste Ausgabentyp in Ausgaben sein und für Gebäude-Ausgaben Gebäude-ID in Ausgaben sein.

Allerdings sind beide in Ausgaben nicht einzigartig und ich habe keine Ahnung wie ich das mache.
 
wo ist jetzt Dein Problem?

Code:
test=# create table gebaeude (id int primary key, name text);
CREATE TABLE
test=*# create table ausgaben(gebaeude_id int references gebaeude, ausgabe text, wert int);
CREATE TABLE
test=*# insert into gebaeude values (1, 'haus1');
INSERT 0 1
test=*# insert into gebaeude values (2, 'haus2');
INSERT 0 1
test=*# insert into ausgaben values (1, 'heizung', 10);
INSERT 0 1
test=*# insert into ausgaben values (1, 'muell', 20);
INSERT 0 1
test=*# insert into ausgaben values (1, 'wasser', 15);
INSERT 0 1
test=*# insert into ausgaben values (2, 'wasser', 15);
INSERT 0 1
test=*# select g.name, a.wert from gebaeude g left join ausgaben a on g.id = a.gebaeude_id;
 name  | wert
-------+------
 haus1 |  10
 haus1 |  20
 haus1 |  15
 haus2 |  15
(4 Zeilen)

test=*#
 
Nicht ganz. Ich weiß nicht wie ich das auf DDL-Ebene mache. Da wo ich 1:1 Kardinalitäten habe, kann ich den Primary Key als Foreign Key nehmen.
Dann sind beide Seiten eindeutig und ich kann joinen. Hier habe Allerdings für jedes Gebäude mehrere Ausgaben nämlich pro Jahr und von mehrere Typen.

Du kannst auch Foreign Keys definieren, wo in den Detailtabellen eben dieser FK mehrfach auftaucht. Das ist kein Problem.
 
Wie genau geht es? Wenn der Foreign Key bei mir nicht auf Primary Key referenziert bekomme ich den folgenden Fehler:

Code:
ERROR 1005 (HY000): Can't create table 'ImmobilienDB.Ausgabentyp_TV_Anschluesse' (errno: 150)

Code:
-- CREATE TABLE Ausgabentypen
CREATE TABLE ImmobilienDB.Ausgabentyp(
    ID int NOT NULL PRIMARY KEY,
    Bezeichnung varchar(255)
);


--CREATE TABLE Ausgaben_TV_Anschluesse
CREATE TABLE ImmobilienDB.Ausgaben_TV_Anschluesse(
    ID int NOT NULL PRIMARY KEY,
    Gebaeude int NOT NULL,
    Jahr int NOT NULL,
    Ausgabe int NOT NULL,
    Kosten double
);

CREATE TABLE ImmobilienDB.Ausgabentyp_TV_Anschluesse(
    Ausgabentyp int,
    Ausgabe int,
    FOREIGN KEY(Ausgabentyp) REFERENCES ImmobilienDB.Ausgabentyp(ID),
    FOREIGN KEY(Ausgabe) REFERENCES ImmobilienDB.Ausgaben_TV_Anschluesse(Ausgabe)
);
 
Werbung:
Zurück
Oben