h41msh1c0r
Goto Top

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
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
DienstNr | Beschreibung 
1  	 | Dienst1			
2  	 | Dienst2			
3  	 | Dienst3			

Tabelle Laufwerke
DevNr | Name 	
1  	  | C		
2     | D		

Tabelle Dateien
TimestampNr | Dateiname 	
1  	| Config1
2  	| Config2     


Relation: Status der Dienste
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
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
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:
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

Content-Key: 368692

Url: https://administrator.de/contentid/368692

Ausgedruckt am: 19.03.2024 um 02:03 Uhr

Mitglied: sabines
sabines 21.03.2018 um 06:45:35 Uhr
Goto Top
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
Mitglied: ukulele-7
ukulele-7 21.03.2018 um 07:32:26 Uhr
Goto Top
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.
Mitglied: H41mSh1C0R
H41mSh1C0R 21.03.2018 um 09:04:42 Uhr
Goto Top
Guten Morgen,

Ausgabe ist nur 1 Beispiel.

Ich habe unterschiedliche Server mit unterschiedlicher Anzahl an Diensten, LW und bisher 2 Configfiles die betrachtet werden.

1:n nehme ich an, weil die Zahl über die Masse an Servern nicht gleich bleibt

Ziel ist es am Ende über die Konfiguration auszuwählen welche Dienste, LW und Files angezeigt werden.
Deshalb ja auch die Status "NA", "ON", "OFF".

Erfasst werden sollen am Ende trotzdem alle Dienste, LW und Configfiles der Server und die Daten pack ich dann in eine DB, so die Idee.
=)

Zitat von @sabines:
Wenn SQL für Dich nichts ist, kannst Du so was schnell mit Access visualisieren und einfach Beziehungen zu den Tabellen definieren.

Das selbstgesteckte Ziel ist es mit SQL zu bauen, da auf diese Datenbasis mehrere Nutzer zugreifen sollen und irgendwann fängt jeder mal an. =)

Ich mach mich jetzt auf den Weg zur Arbeit, dann gehts weiter. =)

VG
Mitglied: ukulele-7
ukulele-7 21.03.2018 aktualisiert um 12:37:07 Uhr
Goto Top
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:
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
Mitglied: H41mSh1C0R
H41mSh1C0R 21.03.2018 um 13:29:42 Uhr
Goto Top
Autsch ist das ein Schlauch.

TimestampNr in der Tabelle ist ein copy Paste Opfer.

Wofür steht FK? PK Private Key --> F(olge?) Key

Schon einmal ein Dickes Danke, ich bau im SQL Studio mal die Tabellen zusammen und acker mich durch dein Beispiel.

Ein kleiner Nebenkriegsschauplatz rückt gerade nach vorn.

VG
Mitglied: ukulele-7
ukulele-7 21.03.2018 um 14:07:03 Uhr
Goto Top
FK = Foreign Key, also Fremdschlüssel.

So wild ist das eigentlich gar nicht. Man könnte auch alle Status in einer Tabelle vereinen, wäre dann sogar etwas leichter. Dazu müssen aber die Datensätze in diesen Tabellen alle gleich aufgebaut sein.