Datenbanken Daten normalisieren und Select
Einen schönen Nachmittag in die Runde,
bitte stört euch nicht an der tabellenansicht das schaut hier im editor immer grausam aus. =)
Das Thema Datenbanken steht nun auf dem Speiseplan:
Tabelle Datensatz
Tabelle Dienste
Tabelle Laufwerke
Tabelle Dateien
Relation: Status der Dienste
Relation: Status der Laufwerke
Relation: Status der Dateien
Jeder Datensatz kann mehrere Dienste, Laufwerk und Dateien haben. Also immer 1:n
Wenn ich nun eine Ausgabe als Ziel habe wie folgt:
Wie fang ich nun am Besten mit dem Select an, gerade auch um die letzten 3 Tabellen mit einzubeziehen?
Oder fehlt in der Tabelle "Datensatz" noch irgendetwas um auf die letzten 3 Tabellen zu verweisen?
VG
bitte stört euch nicht an der tabellenansicht das schaut hier im editor immer grausam aus. =)
Das Thema Datenbanken steht nun auf dem Speiseplan:
Tabelle Datensatz
1
2
3
2
3
ServNr*| Auswahl| Servername | IP |Beschreibung
1 | false | Server1 | 172.168.1.1 |HIER STEHT TEXT
2 | true | Server2 | 172.168.1.5 |HIER TEXT
Tabelle Dienste
1
2
3
4
2
3
4
DienstNr | Beschreibung
1 | Dienst1
2 | Dienst2
3 | Dienst3
Tabelle Laufwerke
1
2
3
2
3
DevNr | Name
1 | C
2 | D
Tabelle Dateien
1
2
3
2
3
TimestampNr | Dateiname
1 | Config1
2 | Config2
Relation: Status der Dienste
1
2
3
4
5
6
7
2
3
4
5
6
7
ServNr | DienstNr | Status
1 | 1 | ON
1 | 3 | NA
1 | 4 | OFF
2 | 1 | NA
2 | 2 | ON
2 | 3 | NA
Relation: Status der Laufwerke
1
2
3
4
5
6
7
2
3
4
5
6
7
ServNr | DevNr | Größe
1 | 1 | 200
1 | 2 | NA
1 | 3 | 10
2 | 1 | NA
2 | 2 | NA
2 | 3 | 10
Relation: Status der Dateien
1
2
3
4
5
2
3
4
5
ServNr | Dateien | Zeitstempel
1 | 1 | 20.08.10
1 | 2 | 14.02.10
2 | 1 | 20.08.10
2 | 2 | 14.02.10
Jeder Datensatz kann mehrere Dienste, Laufwerk und Dateien haben. Also immer 1:n
Wenn ich nun eine Ausgabe als Ziel habe wie folgt:
1
2
3
2
3
Nr | Auswahl | Servername | Reboot | IP | Dienst1 | Dienst2 | Dienst3 | Laufwerk 1| Laufwerk 2| Laufwerk 3| Config1 | Config2 | Beschreibung
1 | false | Server1 | 0 | 172.168.1.1| ON | NA | OFF | 200 | NA |10 | 20.08.10 | 14.02.10 | HIER STEHT TEXT
2 | true | Server2 | 0 | 172.168.1.5| NA | ON | NA | NA | NA |10 | 20.08.10 | 14.02.10 | HIER TEXT
Wie fang ich nun am Besten mit dem Select an, gerade auch um die letzten 3 Tabellen mit einzubeziehen?
Oder fehlt in der Tabelle "Datensatz" noch irgendetwas um auf die letzten 3 Tabellen zu verweisen?
VG
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 368692
Url: https://administrator.de/forum/datenbanken-daten-normalisieren-und-select-368692.html
Ausgedruckt am: 26.04.2025 um 01:04 Uhr
6 Kommentare
Neuester Kommentar
Moin,
was ist denn das Ziel dieser Arbeit?
Für den Anfang: Du musst in jeder Tabelle eine eindeutige Verknüpfungsmöglichkeit zu einer anderen Tabelle haben.
Das kann auch übers Eck gemacht werden: Tabelle1 über T2 zu T3, anstatt T1 zu T3.
Wenn SQL für Dich nichts ist, kannst Du so was schnell mit Access visualisieren und einfach Beziehungen zu den Tabellen definieren.
Gruss
was ist denn das Ziel dieser Arbeit?
Für den Anfang: Du musst in jeder Tabelle eine eindeutige Verknüpfungsmöglichkeit zu einer anderen Tabelle haben.
Das kann auch übers Eck gemacht werden: Tabelle1 über T2 zu T3, anstatt T1 zu T3.
Wenn SQL für Dich nichts ist, kannst Du so was schnell mit Access visualisieren und einfach Beziehungen zu den Tabellen definieren.
Gruss
Fremdschlüssel sehen grundsätzlich gut aus.
Du schreibst 1:n-Beziehungen, deine "Auswertung" arbeitet aber offensichtlich mit einem festen Maximum an Diensten, Laufwerken und Config-Dateien. Das kann man machen, ist aber händisch auch mit viel Code verbunden. Können z.B. mehr als drei Dienste vorkommen? Dann wären neue Spalten pro Dienst sehr schwergängig, ich würde dann pro Dienst eine Zeile mit Status ausgeben. Zeig mal wo du hin willst.
Du schreibst 1:n-Beziehungen, deine "Auswertung" arbeitet aber offensichtlich mit einem festen Maximum an Diensten, Laufwerken und Config-Dateien. Das kann man machen, ist aber händisch auch mit viel Code verbunden. Können z.B. mehr als drei Dienste vorkommen? Dann wären neue Spalten pro Dienst sehr schwergängig, ich würde dann pro Dienst eine Zeile mit Status ausgeben. Zeig mal wo du hin willst.
Also zu den drei Status Tabellen: Du hast nur in einer einen Zeitstempel. Die Tabelle macht aber eigentlich nur Sinn wenn du immer einen Wert Datum / Zeit hast, danach wirst du vermutlich immer das neueste auswählen wollen.
Schön wäre auch eine möglichst einheitliche Namensfindung. Warum heißt die ID in Datei "TimestampNr"? Die Tabelle hat nichts mit Zeitstempeln zu tun sondern mit Dateien (Pfad, Ort, etc.). Der FK darauf heißt dann wiederum "Dateien", DatNr wäre z.B. in beiden Fällen konsequent.
Eine Status-Abfrage, die auch ordentlich skaliert, könnte dann so aussehen:
Schön wäre auch eine möglichst einheitliche Namensfindung. Warum heißt die ID in Datei "TimestampNr"? Die Tabelle hat nichts mit Zeitstempeln zu tun sondern mit Dateien (Pfad, Ort, etc.). Der FK darauf heißt dann wiederum "Dateien", DatNr wäre z.B. in beiden Fällen konsequent.
Eine Status-Abfrage, die auch ordentlich skaliert, könnte dann so aussehen:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
WITH t(ServNr,Typ,Name,[Status]) AS (
SELECT ds.ServNr,
'Dienst',
ROW_NUMBER() OVER (PARTITION BY ds.ServerNr,d.Beschreibung ORDER BY ds.Zeitstempel DESC) AS zeile,
d.Beschreibung,
ds.[Status]
FROM Dienste d
LEFT JOIN Status_der_Dienste ds
ON d.DienstNr = ds.DienstNr
UNION ALL
SELECT ls.ServNr,
'Laufwerk',
ROW_NUMBER() OVER (PARTITION BY ls.ServerNr,l.Name ORDER BY ls.Zeitstempel DESC) AS zeile,
l.Name,
ls.Größe
FROM Laufwerke l
LEFT JOIN Status_der_Laufwerke ls
ON l.DevNr = ls.DevNr
UNION ALL
SELECT ds.ServNr,
'Dienst',
ROW_NUMBER() OVER (PARTITION BY ds.ServerNr,d.Dateiname ORDER BY ds.Zeitstempel DESC) AS zeile,
d.Dateiname,
ds.[Status]
FROM Dateien d
LEFT JOIN Status_der_Dateien ds
ON d.TimestampNr = ds.Dateien
)
SELECT Datensatz.*,
t.Typ,
t.Name,
t.[Status]
FROM Datensatz
LEFT JOIN t
ON Datensatz.ServNr = t.ServNr
WHERE t.zeile = 1
ORDER BY Datensatz.ServNr,t.Typ,t.Name