Galerievorschaubild in SQLite Datenbank hinterlegen

G

gabber

Guest
Hallo zusammen,

ich entwickle aktuell ein kleines Programm für Pilze das auch Bilder anzeigen kann. Die Anzahl der Bilder soll auf 5 Bilder pro Pilz beschränkt werden (wird programmiertechnisch geregelt). Ich weiß das man Bilder als BLOB in einer SQLite Datenbank abspeichern kann (Der Pfad auf das Bild möchte ich in der Datenbank nicht hinterlegen, da die Datenbank ausgetauscht werden soll mit anderen Personen). Jetzt habe ich ich eine 1:N Beziehung zwischen der Tabelle Pilze und Bilder. In meiner GUI habe ich zudem eine Option (die noch nicht programmiert ist) bei der ich auswählen kann, welches von den hinterlegten Bildern als "Galerievorschaubild" gewählt werden soll. Jedes mal wenn ich dann den Datensatz des Pilzes aufrufe soll das ausgewählte Bild angezeigt werden. Hier nochmal ein kleines Beispiel wie ich das möchte:

Pilz 1 -> enthält 3 Bilder (Bild 1 -> ausgewählt als Galerievorschaubild) --> Hier soll beim anklicken immer Bild 1 erscheinen
Pilz 2 -> enthält 5 Bilder (Bild 5 -> ausgewählt als Galerievorschaubild) --> Hier soll beim anklicken immer Bild 5 erscheinen
Pilz 3 -> enthält 2 Bilder (Bild 2 -> ausgewählt als Galerievorschaubild) --> Hier soll beim anklicken immer Bild 2 erscheinen
....

Jetzt meine Frage an die Datenbankexperten, wie kann ich so ein Galerievorschaubild in die Tabelle Bilder einbauen? Hat da jemand eine Idee?

Meine SQLite Bilder Tabelle sieht aktuell so aus:

SQL:
CREATE TABLE "Bilder" (
    "ID"    INTEGER NOT NULL,
    "Bild"    BLOB NOT NULL,
    "PilzID"    INTEGER NOT NULL,
    FOREIGN KEY("PilzID") REFERENCES "Pilze"("ID"),
    PRIMARY KEY("ID")
);
 
Werbung:
Ohhhh man. Doch so simpel hab viel zu kompliziert gedacht. Danke dir für deinen Tipp, das werde ich auch so machen.

Edit: Kann als gelöst markiert werden
 
dann speichere in Deiner Pilze-Tabelle die ID des Bildes.
Ich möchte nochmal auf deinen Tipp zurück kommen. Ich bin mir nicht sicher ob der Aufbau der Datenbank richtig ist. Kannst du dort bitte ein Blick drüber werfen?

Meine Pilztabelle sieht aktuell wie folgt aus:
SQL:
CREATE TABLE "Pilze" (
    "Id"    INTEGER NOT NULL,
    "Name"    TEXT NOT NULL UNIQUE,
    "Gattung"    TEXT NOT NULL,
    "Art"    TEXT NOT NULL,
    "Familie"    TEXT,
    "Ordnung"    TEXT,
    "Bemerkung"    TEXT,
    "Gefaehrdung"    INTEGER,
    "Galleriebild"    INTEGER,
    PRIMARY KEY("Id"),
    FOREIGN KEY("Gefaehrdung") REFERENCES "Gefaehrdungsliste"("Id"),
    FOREIGN KEY("Galleriebild") REFERENCES "Bilder"("Id")
);

Meine Bilder-Tabelle:
SQL:
CREATE TABLE "Bilder" (
    "Id"    INTEGER NOT NULL,
    "Bild"    BLOB NOT NULL,
    "Pilz_id"    INTEGER NOT NULL,
    PRIMARY KEY("Id"),
    FOREIGN KEY("Pilz_id") REFERENCES "Pilze"("Id")
);

Meine Gefaehrdungsliste:
SQL:
CREATE TABLE "Gefaehrdungsliste" (
    "Id"    INTEGER NOT NULL,
    "Zuordnung"    TEXT NOT NULL UNIQUE,
    PRIMARY KEY("Id")
);

Kann man das so umsetzen? Gerade in Bezug auf die Forgein Keys? Da ja die Pilztabelle auf die Bilder Tabelle referenziert und umgekehrt. Bin leider nicht sonderlich fit in SQL. Wäre super wenn du ein Blick drüber wirfst.

Vielen Dank

Grüße
gabber
 
Warum willst Du von Bild wieder auf die Pilze referieren?
Jetzt bin ich doch ein bisschen verwirrt. Ein Pilz kann ja mehrere Bilder enthalten also muss ich die Bilder-Tabelle ja auch so bauen das die Pilz_id hinterlegt ist damit ich weiß welches Bild zu welchem Pilz gehört. Und das Geleriebild sollte ich ja in die Pilz-Tabelle machen, da ja ein Pilz maximal ein oder kein Galleriebild haben kann. Mit diesen Foreign-Keys bin ich mir halt nicht sicher. Kannst du mir bitte zeigen wie das SQL-Statement jetzt richtig ist? Muss der Teil jetzt eigentlich weg oder nicht? FOREIGN KEY("Galleriebild") REFERENCES "Bilder"("Id")
 
In dem Falle brauchst Du eine weitere Tabelle. Ganz primitiv so:

Code:
postgres=# create table pilze (id int primary key);
CREATE TABLE
postgres=# create table bilder (id int primary key);
CREATE TABLE
postgres=# create table pilze_bilder(pilz int references pilze, bild int references bilder, primary key(pilz, bild)); 
CREATE TABLE
postgres=#
 
Okay danke für die Antwort. Ich hab noch ne Frage um das ganze auch sicher zu Verstehen und nicht einfach nur den Code zu kopieren. Ein Pilz kann mehrere Bilder haben: Ist ja eine 1:N - Beziehung. Und ein Pilz kann genau ein oder kein Galleriebild haben. Was ist das dann für eine Beziehung auch 1:N? Wie kommst du dann jetzt auf die Idee dass das ganze eine N:M Beziehung ist und über eine zwischen Tabelle gelöst werden muss? Ich verstehe noch nicht ganz deine Denkweise mit der Zwischentabelle. Wenn es wirklich eine N:M Beziehung ist, ist es klar dann benötige ich Sie. Aber Wenn ich nur 1:N Beziehungen habe benötige ich die Tabelle doch eigentlich nicht? Kannst du mir das noch erklären wie du auf die Idee kommst mit der Zwischentabelle?

Wenn ich jetztz deinem Denkansatz folge dann würde meine Tabellen jetzt so aussehen:

SQL:
CREATE TABLE "Bilder" (
    "Id"    INTEGER NOT NULL,
    "Bild"    BLOB NOT NULL,
    PRIMARY KEY("Id")
);

SQL:
CREATE TABLE "Pilze" (
    "Id"    INTEGER NOT NULL,
    "Name"    TEXT NOT NULL UNIQUE,
    "Gattung"    TEXT NOT NULL,
    "Art"    TEXT NOT NULL,
    "Familie"    TEXT,
    "Ordnung"    TEXT,
    "Bemerkung"    TEXT,
    "Gefaehrdung"    INTEGER,
    "Galleriebild"    INTEGER,
    PRIMARY KEY("Id"),
    FOREIGN KEY("Gefaehrdung") REFERENCES "Gefaehrdungsliste"("Id"),
    FOREIGN KEY("Galleriebild") REFERENCES "Bilder"("Id")
);

SQL:
CREATE TABLE "Pilzbilder" (
    "Pilz_id"    INTEGER NOT NULL,
    "Bild_id"    INTEGER NOT NULL,
    PRIMARY KEY("Pilz_id","Bild_id"),
    FOREIGN KEY("Pilz_id") REFERENCES "Pilze"("Id"),
    FOREIGN KEY("Bild_id") REFERENCES "Bilder"("Id")
);

Danke für deine Hilfe!
 
Werbung:
Zurück
Oben