SQL Datenbank - Tabelle überflüssig?

Rowana

Lt. Junior Grade
Dabei seit
Okt. 2008
Beiträge
264
Hi,
ich überarbeite gerade eine ältere Datenbank, deren Design wohl nicht optimal ist. Ich erstelle sie in Oracle neu, muss jedoch die Daten übernehmen. Problembereich: ich habe eine Tabelle mit einer Anzahl fixer Lagerplätze und eine Tabelle mit Paketen, die auf den Lagerplätzen zwischengelagert werden. Für diese Zuordnung gibt es eine n:m Zwischentabelle, die nur die Paket-Nr und die Lagerplatz-Nr aufnimmt. Soweit so gut - mir fiel nur auf, dass ein Paket immer auf exakt einem Lagerplatz landet und ein Lagerplatz mit max. einem Paket belegt wird. Vom Design her war das wohl mal dynamischer geplant, tatsächlich wird nur diese 1:1 Beziehung genutzt.

Ich möchte diese Zwischentabelle nun gerne entfernen, weil überflüssig, und beim Paket direkt vermerken, auf welchem Lagerplatz es liegt. Die Nicht-Belegung bereitet mir Probleme. Hier habe ich folgende Alternativen: Ich trage bei einem nicht eingelagerten Paket NULL ein und bei allen anderen die Lagerplatz-Nr. Oder ich erschaffe mir einen Dummy-Lagerplatz und nutze diesen für die nicht eingelagerten Pakete. Dann könnte man auch einen Fremdschlüssel setzen, was bei NULL-Inhalten nicht funktioniert. Bei sämtlichen Auswertungen müsste ich dann nur drauf achten, dass der Dummy-Platz wieder rausgefiltert wird.

Einfache Auswertungen wie "welche Lagerplätze sind noch frei?" funktionieren immer, mit und auch ohne Zwischentabelle. Aber evtl. git es ja Abfragen, die ohne Zwischentabelle nicht mehr umsetzbar sind. Gibt es weitere Alternativen für den Umbau? Verbaue ich mir Möglichkeiten durch das Löschen der Tabelle?
Grüße allerseits
 

capilano

Lt. Junior Grade
Dabei seit
Juli 2009
Beiträge
372
Servus,

sofern wirklich nur die Möglichkeit (und die Anforderungen nicht das beschreiben) besteht ein Lagerplatz mit einem spezifischen Paket zu belegen ist die N:M Tabelle nicht nötig. N:M Tabellen sind, wie es bereits beschreibt, notwendig, wenn ein Lagerplatz mehrere Pakete aufnehmen kann oder ein Paket auf mehreren Lagerplätze liegen können.

Alternativen hast du bereits genannt, möglich ist auch eine Art enum-Tabelle, welche durch einem Fremdschlüssel den Platz einnimmt und alle Varianten (also Lagerplätze) beinhalten.
 

DjNDB

Lt. Commander
Dabei seit
Apr. 2010
Beiträge
1.533
Die extra Tabelle wird wahrscheinlich durch Normalisierung entstanden sein, gerade um die durch NULL Werte entstehende Einfüge Anomalie zu vermeiden.
 

Elcaro

Ensign
Dabei seit
Feb. 2011
Beiträge
216
Die Zwischentabelle vermeidet Inkonsistenzen, den in Deinem Design kannst Du mehrere Pakete einem Lagerplatz zuordnen, was zum gleichen Zeitpunkt wohl keinen Sinn macht.
 

Rowana

Lt. Junior Grade
Ersteller dieses Themas
Dabei seit
Okt. 2008
Beiträge
264
Die Zwischentabelle vermeidet Inkonsistenzen
Aktuell tut sie genau das nicht, weil ich mit der Zwischentabelle einem Lagerplatz n Pakete zuordnen kann und andersrum ein Paket sinnlos auf m Lagerplätze verteilen kann. Aber ich könnte nun in der Paket-Tabelle einen Unique-Key auf das neue Lagerplatz-Feld setzen, das sollte helfen.
 

wahli

Vice Admiral
Dabei seit
Feb. 2010
Beiträge
6.282
Einfache Auswertungen wie "welche Lagerplätze sind noch frei?" funktionieren immer, mit und auch ohne Zwischentabelle.
Das stimmt, aber um eine vollständige Liste der freien Lagerplätze zu erhalten, musst du alle belegten Plätze erfragen und dann von allen vorhandenen abziehen. Diese Abfrage erfordert halt ein wenig Programmierung.
Was ebenfalls sein kann: wenn ein neues Paket abgelegt werden soll und dieses Paket vorab einen Lagerplatz zugewiesen wird, dann brauchst du hierzu immer die Abfrage, was noch frei ist. U. U. verbraucht diese Abfrage etwas mehr Rechenzeit, die gewöhnlich aber immer reichlich vorhanden ist.
 

Rowana

Lt. Junior Grade
Ersteller dieses Themas
Dabei seit
Okt. 2008
Beiträge
264
Das stimmt, aber um eine vollständige Liste der freien Lagerplätze zu erhalten, musst du alle belegten Plätze erfragen und dann von allen vorhandenen abziehen. Diese Abfrage erfordert halt ein wenig Programmierung.
Vielleicht beim Lagerplatz vermerken, ob er belegt ist? Die freien Plätze hätte man dann sehr fix. Anderseits muss man die Info immer aktualisieren, ich glaube die Idee ist doch nicht so gut.

Habe soeben beim Testen festgestellt, dass man NULL-Werte verwenden und trotzdem einen Fremdschlüssel anwenden kann. Das war mir neu. Aber so könnte man die Einfüge-Anomalie (schönes Wort!) mit den Dummies geschickt vermeiden. Ich teste erst mal weiter.
 
Top