Auf Thema antworten

Guten Tag zusammen,


das ist mein erster Beitrag hier.

Ich arbeite zum ersten mal mit einer etwas komplexeren Datenbank. In der Datenbank haben wir zu den meisten Tabellen entsprechende Views, die bei vorhanden 1:m-Beziehungen für jeden Tabelleneintrag die entsprechenden Fremdschlüssel zu den Werten in den anderen Tabellen auflösen.

Soweit ist das ganze auch recht einfach.


Etwas komplexer wird dies bei n:m-Beziehungen.  Nehmen wir mal folgendes Beispiel an:

[CODE]CREATE TABLE `Backupgruppe` (

  `ID` int(11) NOT NULL PRIMARY KEY,

  `Name` varchar(45) NOT NULL,

  `Beschreibung` varchar(512) NOT NULL,

  `Ablageort` varchar(45) NOT NULL,

  `Offline` tinyint(1) NOT NULL DEFAULT '0',

  `Automatisch` tinyint(1) NOT NULL DEFAULT '1',

  `Backupsystem` varchar(45) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=latin1;


INSERT INTO `Backupgruppe` (`Name`, `Beschreibung`, `Ablageort`, `Offline`, `Automatisch`, `Backupsystem`) VALUES

('Firewall Config', 'Backupgruppe für Firewall Config', 'NMS-Datenbank', 0, 1, 'Network-MM-System'),

('L3-Switch Startup Config', 'Backupgruppe für L3-Switch Startup-Config', 'NMS-Datenbank', 0, 1, 'Network-MM-System'),

('L3-Switch Running Config', 'Backupgruppe für L3-Switch Running-Config', 'NMS-Datenbank', 0, 1, 'Network-MM-System');


CREATE TABLE `Netzwerkgerät` (

  `ID` int(11) NOT NULL PRIMARY KEY,

  `Name` varchar(45) NOT NULL,

  `Beschreibung` varchar(512) NOT NULL,

  `Hersteller` varchar(45) DEFAULT NULL,

  `Typ` varchar(45) DEFAULT NULL,

) ENGINE=InnoDB DEFAULT CHARSET=latin1;


INSERT INTO `Netzwerkgerät` (`Name`,`Beschreibung`, `Hersteller`, `Typ`) VALUES

(`X2812`,`Hersteller 1`,`Ein ganz tolles Gerät`, `Firewall` ),

(`BCD123`,`Hersteller 2`, `Auch ein schönes Gerät`,`L3-Switch`),

(`CC0815`,`Hersteller 1,`Der Gerät`,`L3-Switch`);


CREATE TABLE `Backupgruppe_Netzwerkgerät` (

  `Backupgruppe_ID` int(11) NOT NULL PRIMARY KEY,

  `Netzwerkgerät_ID` int(11) NOT NULL PRIMARY KEY,

) ENGINE=InnoDB DEFAULT CHARSET=latin1;


INSERT INTO `Backupgruppe_Netzwerkgerät` (`Backupgruppe_ID`, `Netzwerkgerät_ID`) VALUES

(1,1),

(2,2),

(2,3),

(3,2),

(3,3);


CREATE VIEW `vBackupgruppe_Netzwerkgerät`  AS

SELECT

    `b`.`ID` AS `Backupgruppe_ID`,

    `b`.`Name` AS `Backupgruppe`,

    `b`.`Beschreibung` AS `Backupgruppe_Beschreibung`,

    `b`.`Ablageort` AS `Ablageort`,

    `b`.`Offline` AS `Offline`,

    `b`.`Automatisch` AS `Automatisch`,

    `b`.`Backupsystem` AS `Backupsystem`,

    `n`.`ID` AS `Netzwerkgerät_ID`,

    `n`.`Name` AS `Netzwerkgerät_Name`,

    `n`.`Beschreibung` AS `Netzwerkgerät_Beschreibung`,

    `n`.`Hersteller`,

    `n`.`Typ`

FROM `Netzwerkgerät` `n`

JOIN `Backupgruppe_Netzwerkgerät` `bn`

JOIN `Backupgruppe` `b`

WHERE `n`.`ID` = `bn`.`Netzwerkgerät_ID`

AND `bn`.`Backupgruppe_ID` = `b`.`ID`;[/CODE]


Ich habe aus den Tabellen für eine bessere Übersichtlichkeit mal einige Spalten entfernt, die für die Frage aber keine Relevanz haben.

Meine Frage zielt auf den View ab, der die Verknüfungstabelle repräsentiert. In der Anwendung soll es möglich sein, dass ich auf der Seite zum Netzwerkgerät alle dazugehörigen Backupgruppen zu sehen bekomme, inklusive ausgewählter Informationen (mehr als nur den Namen). Umgekehrt sollen auf der Seite der jeweiligen Backupgruppen alle entsprechenden Netzwerkgeräte aufgelistet werden.


Nun zu der Frage: Ist es bei einer solchen n:m-Beziehungen sinnvoller die beschrieben Anforderungen mit einem oder mit zwei Views zu realisieren?

Der Vorteil an zwei Views ist, dass die SQL-Statements in der Anwendung einfacher sind und dass ich keine Spalten umbenennen muss. Ggf. könnte ich sogar die Auflistung der Spalten ganz weglassen.

Der Nachteil ist, dass die Anzahl der Views größer und die Liste der Views möglicherweise unübersichtlicher wird. Möglichweise muss ich bei Änderungen in der DB-Struktur zwei Views anpassen.


Wie wird das an anderen Stellen gelöst? Oder gibt es dazu irgendwelche BestPractices? Ich habe eine zeitlang im Internet recherchiert konnte dazu aber nichts finden, daher habe ich die Frage mal hier eingestellt.


Zurück
Oben