Löschen in Relationalen Datenbanken

StefanKDS

Neuer Benutzer
Beiträge
3
Hallo an alle,
ich habe im groben folgende Situation:

1653304843363.png

Dazu mal ( wahrscheinlich eine blöde ) eine Frage.
Wir haben versch. Projekte. Jedem Projekt ist ein Standort zugeordnet.
Jeder Standort kann auch mehrere Projekte haben, aber ein Projekt kann nur einen Standort haben.

Jetzt lösche ich ein Projekt.
Der dazugehörige Standort soll nun nur mitgelöscht werden, wenn es kein weiteres Projekt mit diesem Standort gibt.
Wie kann ich das vernünftig in SQL bewerkstelligen ?

Das gleiche Problem habe ich beim hinzufügen von Projekten.
Hier muss gerpüft werden, ob dieser Standort schon so exestiert. Wenn nicht, dann muss er neu angelegt werden.
Wie kann ich das vernünftig in SQL bewerkstelligen ?

Danke und Gruß
Stefan
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.532
Das löschen könnte ein TRIGGER übernehmen, wenn ein Projekt gelöscht wird löscht es aus den Standorten den Ort, wenn es keine weitere Referenzierung gibt. Bein Einfügen halt prüfen un dentsprechend reagieren. Man könnte, je nach Datenbank, mit CTE und RETURNING sich das Leben etwas vereinfachen, und/oder schreibt sich eine stored Proc.
 

ukulele

Datenbank-Guru
Beiträge
4.647
Das ist vom DBMS und vom Frontend abhängig, beides kennen wir nicht.

Du kannst mit einem Frontend i.d.R. mehrere SQL Befehle absetzen. So muss es ja bei der Anlage eines neuen Projekts eine Auswahlmöglichkeit für die Verknüpfung eines Standortes geben und ein Eingabefeld für einen neuen Standort, wenn dieser nicht existiert. Wird also der Standort mit neu angelegt musst du mind. in 2 Tabellen schreiben, das kannst du nicht so ohne weiteres mit einem Insert. Und dann auch in der richtigen Reihenfolge, erst den Standort, dann die Standort-iD abfragen, dann das Projekt mit Standort-ID in einem weiteren Insert.

Beim Löschen gibt es Hilfsmittel wie DELETE ON CASCADE, ist aber DBMS abhängig. Ansonsten verhält es sich nicht anders, mehrere DELETE-Anweisungen müssen an die DB gegeben werden.
 

ukulele

Datenbank-Guru
Beiträge
4.647
Ja wie gesagt alles stark abhängig vom DBMS und Frontend. Die "Aufgabe" ist ja nicht neu, die Lösungen sind vielfältig.
 

StefanKDS

Neuer Benutzer
Beiträge
3
Ich habe einen MS SQL Server und Programmiere das ganze über das entity framework in C#
Allerdings kann ich auch normale SQL Befehle senden
 

StefanKDS

Neuer Benutzer
Beiträge
3
Im Moment rpüfe ich das alles auch auf Programmseite manuell. Die Datenbank ist aber noch wesentlich komplexer. Ihr seht hier nur einen sehr kleinen Teil. Entsprechend hoch sind natürlich die Möglichkeiten die ich prüfen muss beim löschen.
Ich dachte nur das es da vielleicht einen einfacheren weg in SQL gibt, weil dieses Thema ja nicht neu ist und wahrscheinlich viele Beschäftigt
 

ukulele

Datenbank-Guru
Beiträge
4.647
Mir fehlen leider die Erfahrungswerte, Ideen hätte ich aber ein paar:
- insert mit stored procedure
- insert auf view mit instead of trigger
- delete on cascade in Verbindung mit foreign key constraints
(der FK würde verhindern das ein Standort, der noch von einem anderen Projekt genutzt wird, gelöscht wird)
- mit output kann man das wohl auch machen:

Wichtig finde ich es ein Konzept dahinter zu haben. Das ist ja Business-Logik die bei kommerzieller Software fast immer in der Anwendung statt findet (Software Entwickler können einfach auch nicht gut Datenbanken). Grundsätzlich finde ich es gut, alles was die Datenintegriät betrifft, auch in die DB zu legen. Aber man sollte das möglichst einheitlich machen.
 
Werbung:

dabadepdu

Datenbank-Guru
Beiträge
953
Also was das Löschen und Prüfen abhängiger Daten angeht:
Die erste "Hürde" sind FK Constraints. Sind die überhaupt da? Oder musst Du auskundschaften, ob ein Löschen möglich wäre? (Projekt löschen und dann auf trendende Chat Flüche schauen) FK Constraints würden Dir die Prüfung abnehmen und einfach einen Fehler werfen, wenn ein Standort gelöscht wird, wo noch weitere Projekte dran hängen.
Delete Cascade Constraints würde ich immer vermeiden, weil sie genau das Gegenteil von "normalen" FK Constraints bewirken können. Versehentlich werden Dinge gelöscht, die nicht gelöscht werden sollten.
Sowohl für das Löschen als auch das Einfügen würde ich SP oder die kleine Schwester anonyme Blöcke verwenden. Da hinein kann man beliebige Logik packen.

Überhaupt Löschen:
Warum? Idr hat man eine Aufbewahrungspflicht von Geschäftsdaten. Ein einzelner Standortdatensatz würde wohl nicht darunter fallen, aber wo ist der Nutzen der Löschaktion, wenn das nächste Projekt den gleichen Standort wieder anlegt. Falls Du mal in die Verlegenheit kommst, so viele Standorte zu haben, dass sich das Löschen lohnen würde, Hut ab!
Solange ein gekauftes/verfügbares Platzbudget reicht, würde ich nicht löschen.

Gemäß DSGVO muss man wohl nach entsprechenden Fristen oder Zweckverlust fremde Daten löschen. Aber nicht nur die, auch eigene Daten sind evtl. wertvoll. Der Wert muss nicht immer erkennbar sein am Tag der Löschung

Ordnung:
Falls es darum geht, würde ich Daten eher ausblenden.
 
Oben