Schubladenmodell ?

koiku

Neuer Benutzer
Beiträge
2
Hallo,

ich mache gerade ein Praktikum und soll da eine Datenbank modellieren. Seit drei Tagen sitze ich jetzt dran und komm nicht weiter. Ich versuch mal die Aufgabe zu beschreiben.
Die Aufgabe besteht darin das man verschiedene Schubladen hat in denen verschiedene Gegenständen sich befinden. Gesucht werden soll nach den Gegenständen und als Ergebnis soll man die passende Schublade erhalten. Klingt jetzt noch einfach, aber leider sollen nur die Schubladen angezeigt werden die nur die gesuchten Gegenstände oder weniger enthalten.

Noch ein Beispiel zur verdeutlichen, weil ich mir nicht sicher bin ob das so verständlich ist :p

Schublade A enthält: Papier, Lineal, Stift
Schublade B enthält: Papier, Lineal, Anspitzer
Schublade C enthält: Papier, Lineal, Stift, Anspitzer

Gesucht wird: Papier, Lineal, Stift, Anspitzer
Ergebnis: A, C
Gesucht wird: Papier, Lineal, Stift
Ergebnis: A
Gesucht wird: Papier, Lineal, Anspitzer
Ergebnis: B

Mein Problem ist jetzt das ich nicht weiß wie eine optimale Datenbank für das Problem aussehen könnte.

mfg koiku
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.644
Ich denke nicht das es hier Sinn macht, eine Datenbank zu konstruieren die bewusst gegen die Grundsätze für die 3. Normalform verstößt. Man kann sicher ausprobieren, ob es damit "schneller" läuft, wenn hier Geschwindigkeit der Maßstab ist. Dein Problem liegt glaube ich weniger im Aufbau der Datenbank als in der Abfrage auf das gewünschte Ergebniss.

Zum Testen reicht erstmal eine Tabelle für Schubladeninhalte.

Code:
CREATE TABLE inhalt(    schublade CHAR(1),inhalt VARCHAR(20) );
 
INSERT INTO inhalt VALUES('A','Papier');
INSERT INTO inhalt VALUES('A','Lineal');
INSERT INTO inhalt VALUES('A','Stift');
INSERT INTO inhalt VALUES('B','Papier');
INSERT INTO inhalt VALUES('B','Lineal');
INSERT INTO inhalt VALUES('B','Anspitzer');
INSERT INTO inhalt VALUES('C','Papier');
INSERT INTO inhalt VALUES('C','Lineal');
INSERT INTO inhalt VALUES('C','Stift');
INSERT INTO inhalt VALUES('C','Anspitzer');

Suchen würde ich dann nach Schubladen, in denen andere Gegenstände als die gewünschten sind und die aus dem Ergebniss deine Suche nach gewünschten Gegenständen oder einfach aller Schubladen ausschließen (Ob das effektiv ist bei großen Datenmengen sei jetzt mal dahin gestellt).

Code:
SELECT    *
FROM    inhalt
WHERE (    inhalt = 'Papier'
OR        inhalt = 'Lineal'
OR        inhalt = 'Stift' )
AND        schublade NOT IN (    SELECT    DISTINCT schublade
                            FROM    inhalt
                            WHERE    inhalt != 'Papier'
                            AND        inhalt != 'Lineal'
                            AND        inhalt != 'Stift' )

PS: Ich verstehe die Aufgabe so das bei deinem Beispiel
Gesucht wird: Papier, Lineal, Stift, Anspitzer
Ergebnis: A, C
auch B richtig wäre, weil es auch gesuchte Gegenstände (nur eben nicht alle) enthält.
 

koiku

Neuer Benutzer
Beiträge
2
Ja genau du hast es richtig verstanden, hatte B oben vergessen.

Und DANKESEHR :) so hatte ich die Tabelle auch am Anfang modelliert, nur die Abfrage war falsch, hatte ohne DISTINCT gearbeitet und da kamen dann auch falsche Werte raus.

mfg koiku
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.644
DISTINCT sollte aber keinen Unterschied machen, ich weiss nichtmal ob es schneller ist.

Bei der Datenbank ist die Inhalte Tabelle natürlich eigentlich eine Zwischentabelle mit IDs die auf den Inhalt und auf die jeweilge Schublade zeigen. Das macht aber erst Sinn, wenn es komplexer wird.

Kann auch sein das es noch eleganter geht.
 
Oben