Frage zum SQLite-Datenbankdesign mit mehreren Tabellen

  • 6 Antworten
  • Letztes Antwortdatum
S

Schnicke

Neues Mitglied
0
Hallo zusammen,

mal ein Beispiel zu meiner Frage:
Ich habe eine Datenbanktabelle "Filme" mit den Spalten ID, Name, Produktionsjahr, Regisseur. Jetzt brauche ich einen Auszug davon, ich nenne diesen Auszug mal "Meine Filme", der einige Reihen von "Filme" enthält.

Ich bin jetzt nicht sicher, ob ich entweder für "Meine Filme" eine Extra-Tabelle anlegen und die entsprechenden Filme darin dauerhaft speichern, oder die entsprechenden Filme bei Bedarf per SQLite-Befehl aus "Filme" abrufen soll.
Ersteres ist ja aus Design-Sicht eigentlich nicht schön, da ich zwei Tabellen mit identischen Spalten habe und Speicherplatz "unnötig" belege. Andererseits ist es doch ziemlich aufwändig, die Daten jedes Mal, wenn ich sie brauche, mittels einer Menge von Zugriffen auf die Datenbank abzurufen.

Was ist der bessere Weg?

Danke fürs Lesen, ich freue mich über jede Hilfe :)

Gruß,
Schnicke
 
Hallo Schnicke.

Ich würde den zweiten weg gehen.

Mach dir nicht eine zweite Tabelle in der du die ID's der Filme speicherst die als eigene Filme gekennzeichnet sind. Aus dieser kannst du dann die abfrage generieren um die Liste der Eigenen Filme anzuzeigen.

Gruß
derjens
 
  • Danke
Reaktionen: Schnicke
Alles klar, danke dir :smile:
 
Kommt etwas auf deine zusätzlichen/späteren Anforderungen an. Solange es dir nur darum geht, einen Film mit "besitze ich" zu markieren, dann finde ich den Weg mit einer einzelnen Tabelle besser. Ich würde dann einfach eine zusätzliche Spalte machen, nennen wir sie mal besitze_ich. Bei allen Filmen, die dir gehören, steht besitze_ich auf 1, bei allen anderen auf 0. Wenn du jetzt alle deine eigenen Filme auslesen willst, geht das ganz leicht mit

Code:
SELECT * FROM filme WHERE besitze_ich = 1

Dieser Ansatz ist aber nicht sehr flexibel, wenn du noch zusätzliche Infos bei deinen eigenen Filmen speichern willst. Sagen wir mal, du willst dir in der Datenbank merken, wo du den Film gekauft hast oder an wen du den Film gerade ausgeliehen hast. Du könntest natürlich für all diese Fälle wieder in der Filme-Tabelle eine neue Spalte machen, jedoch musst du dann alle diese Werte immer auch für alle Filme, die du gar nicht besitzt, mitspeichern.

In diesem Fall ist der Ansatz mit einer zweiten Tabelle viel geeigneter. Aber statt die ganzen Film-Infos aus der anderen Tabelle zu kopieren, macht man das normalerweise mittels eines Fremdschlüssels. In der neuen Tabelle kannst du dir dann beliebige zusätzliche Spalten erzeugen, die nur für deine eigenen Filme gelten.

Das Layout der neuen Tabelle könnte dann zum Beispiel so aussehen:

filmID | wo_gekauft | ausgeliehen_an

Aus der existierenden Film-Tabelle brauchst du nur die ID, diese "verknüpft" dann beide Tabellen. Um danach alle Infos über deine besitzten Filme aus der Datenbank zu laden, machst du dann einfach einen (INNER) JOIN, zum Beispiel so:

Code:
SELECT * FROM filme JOIN meineFilme ON filme.id = meineFilme.filmID
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: Schnicke
Hallo Zoopa,

vielen Dank für Deine ausführliche Antwort!

Das Konzept mit dem Fremdschlüssel würde bedeuten, dass ich jedes mal, wenn ich auf die "Meine Filme"-Tabelle zugreifen möchte, diese erst zu diesem Zeitpunkt erzeugt wird, richtig?
Falls ja, geht da meine App nicht in die Knie, wenn ich z.B. 20.000 Filme in der "Filme"-Tabelle habe, und die jedes mal durchsucht werden, oder unterschätze ich SQLite da?

Gruß,
Schnicke
 
Du musst die Abfrage nur umdrehen
Code:
SELECT filme.* FROM meineFilme JOIN filme ON meineFilme.filmID = filme.id

wenn filme.id der AUTOINC PRIMARY KEY ist geht garnichts in die Knie
 
Was meinst du mit "wird jedes mal neu erstellt"? Das Resultat des JOINs wird jedes mal neu erzeugt, aber die zwei eigentlichen Tabellen bleiben immer gleich.

Als Beispiel:

Tabelle Filme:

ID | Name | Dauer_h
-------------------
01 | Argo | 1:01:00
02 | Jaws | 2:12:34
03 | Heat | 1:44:44
04 | Cars | 1:27:03
05 | Thor | 1:33:33

Tabelle MeineFilme:

fID| gekauft_am
---------------
01 | 12.12.2014
02 | 01.07.1999
05 | 10.10.2005

Wenn du jetzt alle deine eigenen Filme auslesen willst, machst du einen JOIN:

Code:
SELECT Name, Dauer_h, gekauft_am 
FROM Filme 
JOIN MeineFilme 
ON Filme.ID = MeineFilme.fID

Dabei wird ein Resultat erzeugt, das wie folgt aussieht:


Name | Dauer_h | gekauft_am
---------------------------
Argo | 1:01:00 | 12.12.2014
Jaws | 2:12:34 | 01.07.1999
Thor | 1:33:33 | 10.10.2005

Das Resultat muss natürlich jedes mal erzeugt werden, wenn du die Abfrage machst. Aber solange du keine neuen Filme hinzufügst, reicht es ja eigentlich, wenn du die Abfrage nur einmal machst (z.B. beim Start der App). Danach kannst du das Resultat ja in deinem Code wiederverwenden (als Array oder List oder was auch immer).

Ich weiss nicht, wie schnell SQLite ist. Aber soviel ich weiss, ist lesen einiges schneller als in die Datenbank zu schreiben. Deshalb denke ich nicht, dass du da ein Problem haben würdest, selbst wenn du die Abfrage immer wieder neu ausführst. Ist ja nicht so, als würdest du es 100x pro Sekunde machen :winki:
 
Zurück
Oben Unten