Filmdatenbank

akne123

Benutzer
Beiträge
8
Hallo zusammen,

bin gerade dabei eine Filmdatenbank zu erstellen. In der Tabelle Title habe ich Filme eingespeichert. Nach Füllen der Tabelle mit Filmen gab es noch keine Probleme. Die Suchfunktion war sehr performant. Dann habe ich Serien wie folgt in der selben Tabelle eingespeichert.

Bspw.

Title-ID Title Ref-Title-ID
1 Walking Dead 0
2 Walking Dead Staffel 1 1
3 Walking Dead Episode 1 2
4 Walking Dead Episode 2 2
5 Walking Dead Staffel 2 1
6 Walking Dead Episode 1 5
7 Walking Dead Episode 2 5
8 Toy Story 0
9 Monster AG 0

Nach Einspeichern der Serien hatte ich 40.000 Einträge, obwohl mit Ref-Title-ID=0 (Filme/Serien auf oberster Ebene, nach denen gesucht werden kann) nur ca. 2.500 waren. D.h. Staffeln und Episoden sind gewaltig viel. Dadurch ist die Performance beim Suchen schlecht.

Denkt ihr ich sollte eine Tabelle mit Filmen und eine mit Serien machen? Oder gar zwei getrennte Datenbanken? Bei letzterem müsste ich dann per Ajax parallel suchen lassen. Ajax verwende ich momentan gar nicht.

Habt ihr Ideen?
 
Werbung:
Denkt ihr ich sollte eine Tabelle mit Filmen und eine mit Serien machen? Oder gar zwei getrennte Datenbanken? Bei letzterem müsste ich dann per Ajax parallel suchen lassen. Ajax verwende ich momentan gar nicht.

Google bitte nach 'Normalisierung' in Zusammenhang mit SQL-Datenbanken. Google bitte auch nach 'Explain' in Zusammenhang mit Datenbanken. Verschrecke nicht darüber, daß 'Explain' und 'MySQL' im Zusammenhang Bullshit sind. Wundere Dich nicht über so seltsamme Begriffe wie 'Index' oder 'Primary Key' oder gar 'Foreign Key'. Sei mutig und hole Dir Bücher in der Bibliothek Deines geringsten Mißtrauens und erfreue Dich über Deinen Wissenszuwachs! Have Fun!
 
Hi mir sind alle Begriffe bestens bekannt und meine DB ist meiner Meinung nach normalisiert, habe nur keine Lust sie ausführlich zu beschreiben. Die einzige Frage ist, ob es Sinn macht Filme und Serien in einer Tabelle zu speichern oder ob man Serien ausgliedern sollte aus Performancegründen.
 
Dazu muss ich sagen... Wenn die Fragestellung an sich nicht schon lachhaft ist, kommt von @akretschmer meistens was hilfreiches :)

1. Welcher NF soll deine Tabelle deiner Meinung nach denn zugehören? Der ersten? Nein...
2. Du zeigst uns deine Referenz-Tabelle... Aber wo ist dein eigentlicher Datenstamm? Oder willst du sämtliche Informationen in diese Tabelle pumpen ?
 
Zwei Tabellen für gleiche Atribute machen eigentlich nie Sinn. Wenn deine Tabelle / DB mit 40k Einträgen ein Problem hat liegt es vermutlich

1) am fehlenden, richtigen Index (mit weitem Abstand auf Platz #1)
2) an der verwendeten Engine (ich hoffe wenigstens InnoDB)
3) an den Einstellungen des DBMS (MySQL hat ja auch irgendwelche Config Dateien, kenn ich mich aber nicht mit aus)
4) an dem verwendeten DBMS generell (MySQL hat seine Fehler)
5) an der Hardware
6) oder noch am OS.
 
Damit lässt sich arbeiten solange man einsprachig bleibt und keine Film-und Serienversionen benutzt (uncut, director's cut etc.)
(Ist definitiv noch nicht optimal... Aber für 5min Arbeit wohl ausreichend :) )

/* Edit: wundert euch nicht über die Namen... Da bin ich immer sehr kreativ... */
Code:
Create Table video_content_tab
(
   vid_id Varchar2(10)
  ,video  Blob
  ,video_length Interval Day(0) To Second
  ,video_size Number

  Constraint pk_video_content_tab Primary Key (vid_id)
);
Create Table movie_tab
(
   mov_id Varchar2(10)
  ,description Varchar2(100)
  ,vid_id Varchar2(10)

  Constraint fk_movie_tab_01 Foreign Key (vid_id) References video_content_tab(vid_id)

  Constraint pk_movie_tab Primary Key (mov_id)
);
Create Table logical_references_tab
(
   ref_id Varchar2(10)
  ,description Varchar2(100)
  ,type        Varchar2(10)       --(SERIES/TRILOGY/etc. ...)

  Constraint pk_logical_references_tab Primary Key (ref_id)
);
Create Table series_reference_tab
(
   ref_id Varchar2(10)
  ,mov_id Varchar2(10)

  Constraint fk_series_reference_tab_01 Foreign Key (ref_id) References logical_references_tab(ref_id)
  Constraint fk_series_reference_tab_02 Foreign Key (mov_id) References movie_tab(mov_id)

  Constraint pk_series_reference_tab Primary Key (ref_id, mov_id)
);
 
Danke für die Hilfe.

Die Tabellen-Engine ist InnoDB. Folgende Tabellen habe ich:

Title
TitleActor
Actor
TitleDirector
Director
TitleGenre
Genre

und noch paar andere Tabellen die nebensächlich sind.

Spielfilme (bspw. Toy Story) und Serien (bspw. Walking Dead) werde ich nun in Tabelle Title lassen. Die Staffeln zu einer Serie packe ich in eine neue Tabelle Season. Die Episoden in eine Tabelle Episode.

Wenn ich dann einen Select auf Title mit Left Join auf Season mache und Season-ID = 0/Null ist weiß ich, dass es sich um einen Spielfilm handelt und kann direkt den Link für die Folgeseite entsprechend aufbauen. Wenn es eine Serie ist wird der Link anders aufgebaut, da auf der Folgeseite erst einmal die Staffeln, danach auf deren Folgeseite die Episoden und letztlich dann die Infos zur Episode dargestellt werden. Geht das? Irgendwie bin ich noch nicht ganz zufrieden. Alle Daten komplett in Title war schon schöner aber unperformanter...

Ich habe vor längerer Zeit schon einmal an einem ähnlichen Projekt gearbeitet. Die Tabelle war irgendwann so groß, dass Suchanfragen über den Titel eines Films schon mehrere Sekunden gedauert haben (Select über VARCHAR-Feld 255 Zeichen). Deswegen habe ich nun mal zum Test eine indexTitle-Tabelle erstellt, in der zu jedem Wort, was in einem Titel vorkommen kann, die Title-ID in einem JSON-Array abgelegt wird. So werden bei einer Suchanfrage die Wörter in der indexTitle-Tabelle gesucht und deren JSON-Arrays mit den Title-ID's zur Suche in der Tabelle Title verwendet. Am Anfang macht das denke ich keinen Unterschied. Erst wenn die Tabelle wächst wird man das spüren. Was denkt ihr?
 
Ich habe vor längerer Zeit schon einmal an einem ähnlichen Projekt gearbeitet. Die Tabelle war irgendwann so groß, dass Suchanfragen über den Titel eines Films schon mehrere Sekunden gedauert haben (Select über VARCHAR-Feld 255 Zeichen).

Man sucht auch nicht über varchar.

Deswegen habe ich nun mal zum Test eine indexTitle-Tabelle erstellt, in der zu jedem Wort, was in einem Titel vorkommen kann, die Title-ID in einem JSON-Array abgelegt wird. So werden bei einer Suchanfrage die Wörter in der indexTitle-Tabelle gesucht und deren JSON-Arrays mit den Title-ID's zur Suche in der Tabelle Title verwendet. Am Anfang macht das denke ich keinen Unterschied. Erst wenn die Tabelle wächst wird man das spüren. Was denkt ihr?

Wenn Du mit JSON-Daten arbeitest, warum dann MySQL? Das kann das nicht indexieren. Du würdest mit PostgreSQL ab 9.4 und JSONB (das speichert JSON-Daten binär und kann richtige Indexe drauf setzen) einen Performance-Boost von locker Faktor 1000 haben.
 
Danke für den Tipp aber wir nutzen hier erst einmal "nur" MySQL...

CREATE TABLE `omf`.`indextitle` (
`term` varchar(255) NOT NULL,
`titleIdArr` text NOT NULL,
PRIMARY KEY (`term`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Im Attribut 'term' steht zum Beispiel dann das Wort "Toy" und Attribut 'titleIdArr' das JSON-Array mit dem Inhalt '[999,888,777]' (eben mit den TitleID's aus der Title-Tabelle).

Ist das kompletter Bullshit? Dachte es wäre performanter nach einzelnen Wörtern zu suche als nach ganzen Strings...
 
Werbung:
Ich vermute das Stichwort lautet 'Match/Against'?

Ich könnte auch wieder auf die Volltextsuche umswitchen... Ich schätze mal in der Tabelle Title werden max. ne halbe Millionen Datensätze stehen... Was würdet ihr mir denn raten?
 
Zurück
Oben