Ich bin gerade dabei eine Anwendung zu basteln mit der sich Videos verwalten lassen, und als Anfänger hadere damit ein passendes Schema zu finden das all meinen Ansprüchen genüge trägt. In Ermangelung nativer Unterstützung anderer DBMS läuft das ganze übrigens mit SQLite, und ich bin mir nicht sicher ob diese Frage nicht eventuell in das SQLite Unterforum gehört.
Hier mal ein Paar Details. Um genau zu sein geht es um Filmreihen, Filme (können zu Filmreihen gehören, müssen es aber nicht), Szenen/Kapitel (gehören zu einem Film), Clips (können zu einem Film gehören), TV-Serien, Staffeln (gehrören zu einer TV-Show), und Episoden (gehören zu einer Staffel), all dies soll als individuelle Entitäten erfasst werden. Verwaltet wird all dies in Bibliotheken, wobei eine Bibliothek z.B. ausschließlich aus Clips bestehen kann, oder aus Episoden und Szenen, nur aus Filreihen, oder aus allem zusammen, etc.
Allen Entitäten sollen u.a. Tags zugewiesen werden können, wobei es hier wichtig wäre sich nicht zu wiederholen, sprich ich möchte nicht eine Filmreihe sowie die zugehörigen Filme mit den gleichen Tags versehen müssen, idealerweise würden die Filme die Tags der Filmreihe "erben", könnten aber mit zusätzlichen Tags versehen werden, das gleiche bei den Serien. Außerdem haben alle Entitäten auch Dinge wie Titel, Beschreibung, Bewertung, Vorschaubild (Cover), etc. Später sollen dann evtl noch Informationen zu den mitwirkenden Schauspielern etc hinzukommen, und dann sicher auch entsprechend suchbar sein.
Ich würde die Videos gerne sowohl gruppiert (zu Filmreihen und TV-Shows, evtl auch Staffeln) anzeigen, filtern (z.B. nach Tags, Wörtern im Titel oder der Beschreibung, etc), und ordnen (z.B. nach Bewertung oder Titel) lassen, und das alles über Seiten hinweg. Genau so sollte es möglich sein die Videos ohne Gruppierung darzustellen, als z.B. einfach alle Filme und Episoden einzeln, und in der schönsten aller Welten auch noch ein zwischending, Gruppen da wo sie vorhanden sind, gemischt mit einzelnen Videos falls sie keiner Gruppe angehören.
Mal ein Beispiel. Ich such nach "Bruce Wayne" und filtere nach den Tags "Anti-Hero" und "Comic Adaption". Nehmen wir an das würde auf folgendes zutreffen, die Filmreihe "Batman - The Dark Knight Trilogy", das wären die Filme "Batman Begings", "The Dark Knight", und "The Dark Knight Rises", außerdem träfe es auf die TV-Serie "Gotham" und ein Paar ihrer Episoden zu. Das heißt ich hätte hier fünf verschiedene Typen von Treffern, Filmreihe, Film, Serie, Staffel, und Episode.
Nach vielem hin und her bin ich bei einem Schema hängen geblieben in dem sämtliche Typen in einer einzigen Tabelle gespeichert sind, und das sieht ungefähr so aus
Was ich vorhabe funktioniert damit auch, aber schön ist es irgendwie nicht. Eine Abfrage für eine Suche wie für das erwähnte Batman Beispiel mit den Tags ist irgendwie arg ineffizient, also zumindest dann wenn es darum geht z.B. Filmreihen und Filme zu finden, wobei die jenigen Filme ausgenommen werden sollen die sich in einer Filmreihe befinden, und wenn dann noch Episoden und TV-Serien dazu kommen, und Tags vererbt werden sollen, oh je...
Nehmen wir mal folgende Datensätze an:
Ich sehe mich da irgendwie eher ineffiziente Abfragen benutzen, z.B.:
Damit bekomme ich das was ich erwarte
Szenen/Kapitel und Clips mit einzubeziehen würde auch funktionieren, genau so wie Sortieren und Limitieren, das Einbeziehen von weiteren Tags die z.B. nur Filmen zugeordnet sind, oder das Ausschließen von Videos die einer Gruppe angehören.
Performant, ist aber anders. Das LIKE hilft hier ungemein, so das ich bei Größenordnungeb von 300,000 Einträgen so bei 0.1 - 0.2 Sekunden heraus komme, doch ohne eine solche weitere Einschränkung (wie es z.B. der Fall wäre wenn man nur nach Tags filtert) geht die Performance aufgrund des einbeziehens der Elterntabellen böse in den Keller, dann sind nämlich 3 Sekunden und aufwärts angesagt, und das gefällt mir irgendwie so gar nicht.
Stellt sich mir die Frage ob, und wenn wo ich hier auf dem falschen Dampfer bin. Ist das ganze bereits durch das Schema zum Scheitern veruteilt?
Gruß, Timo
Hier mal ein Paar Details. Um genau zu sein geht es um Filmreihen, Filme (können zu Filmreihen gehören, müssen es aber nicht), Szenen/Kapitel (gehören zu einem Film), Clips (können zu einem Film gehören), TV-Serien, Staffeln (gehrören zu einer TV-Show), und Episoden (gehören zu einer Staffel), all dies soll als individuelle Entitäten erfasst werden. Verwaltet wird all dies in Bibliotheken, wobei eine Bibliothek z.B. ausschließlich aus Clips bestehen kann, oder aus Episoden und Szenen, nur aus Filreihen, oder aus allem zusammen, etc.
Allen Entitäten sollen u.a. Tags zugewiesen werden können, wobei es hier wichtig wäre sich nicht zu wiederholen, sprich ich möchte nicht eine Filmreihe sowie die zugehörigen Filme mit den gleichen Tags versehen müssen, idealerweise würden die Filme die Tags der Filmreihe "erben", könnten aber mit zusätzlichen Tags versehen werden, das gleiche bei den Serien. Außerdem haben alle Entitäten auch Dinge wie Titel, Beschreibung, Bewertung, Vorschaubild (Cover), etc. Später sollen dann evtl noch Informationen zu den mitwirkenden Schauspielern etc hinzukommen, und dann sicher auch entsprechend suchbar sein.
Ich würde die Videos gerne sowohl gruppiert (zu Filmreihen und TV-Shows, evtl auch Staffeln) anzeigen, filtern (z.B. nach Tags, Wörtern im Titel oder der Beschreibung, etc), und ordnen (z.B. nach Bewertung oder Titel) lassen, und das alles über Seiten hinweg. Genau so sollte es möglich sein die Videos ohne Gruppierung darzustellen, als z.B. einfach alle Filme und Episoden einzeln, und in der schönsten aller Welten auch noch ein zwischending, Gruppen da wo sie vorhanden sind, gemischt mit einzelnen Videos falls sie keiner Gruppe angehören.
Mal ein Beispiel. Ich such nach "Bruce Wayne" und filtere nach den Tags "Anti-Hero" und "Comic Adaption". Nehmen wir an das würde auf folgendes zutreffen, die Filmreihe "Batman - The Dark Knight Trilogy", das wären die Filme "Batman Begings", "The Dark Knight", und "The Dark Knight Rises", außerdem träfe es auf die TV-Serie "Gotham" und ein Paar ihrer Episoden zu. Das heißt ich hätte hier fünf verschiedene Typen von Treffern, Filmreihe, Film, Serie, Staffel, und Episode.
Nach vielem hin und her bin ich bei einem Schema hängen geblieben in dem sämtliche Typen in einer einzigen Tabelle gespeichert sind, und das sieht ungefähr so aus

Was ich vorhabe funktioniert damit auch, aber schön ist es irgendwie nicht. Eine Abfrage für eine Suche wie für das erwähnte Batman Beispiel mit den Tags ist irgendwie arg ineffizient, also zumindest dann wenn es darum geht z.B. Filmreihen und Filme zu finden, wobei die jenigen Filme ausgenommen werden sollen die sich in einer Filmreihe befinden, und wenn dann noch Episoden und TV-Serien dazu kommen, und Tags vererbt werden sollen, oh je...
Nehmen wir mal folgende Datensätze an:
Code:
libraries
+----+------------+
| id | title |
+----+------------+
| 1 | My Library |
+----+------------+
types
+----+--------------+
| id | title |
+----+--------------+
| 1 | Movie series |
| 2 | Movie |
| 3 | Scene |
| 4 | Clip |
| 5 | TV-Show |
| 6 | Season |
| 7 | Episode |
+----+--------------+
items
+----+-----------+------------+---------+----------------------------------+----------------------------------------+
| id | parent_id | library_id | type_id | title | description |
+----+-----------+------------+---------+----------------------------------+----------------------------------------+
| 1 | (null) | 1 | 1 | Batman - The Dark Knight Trilogy | lorem ipsum dolor sit Bruce Wayne amet |
| 2 | 1 | (null) | 2 | Batman Begins | lorem ipsum dolor sit Bruce Wayne amet |
| 3 | 1 | (null) | 2 | The Dark Knight | lorem ipsum dolor sit Bruce Wayne amet |
| 4 | 1 | (null) | 2 | The Dark Knight Rises | lorem ipsum dolor sit Bruce Wayne amet |
| 5 | (null) | 1 | 4 | Batman Clip | lorem ipsum dolor sit Bruce Wayne amet |
| 6 | (null) | 1 | 5 | Gotham - TV Show | lorem ipsum dolor sit Bruce Wayne amet |
| 7 | 6 | (null) | 6 | Gotham - Season 01 | lorem ipsum dolor sit Bruce Wayne amet |
| 8 | 7 | (null) | 7 | Gotham - Season 01 - Episode 01 | lorem ipsum dolor sit Bruce Wayne amet |
+----+-----------+------------+---------+----------------------------------+----------------------------------------+
tags
+----+----------------+
| id | title |
+----+----------------+
| 1 | Anti-Hero |
| 2 | Comic Adaption |
+----+----------------+
tags_items
+----+--------+---------+
| id | tag_id | item_id |
+----+--------+---------+
| 1 | 1 | 1 |
| 2 | 2 | 1 |
| 3 | 1 | 5 |
| 4 | 2 | 5 |
| 5 | 1 | 6 |
| 6 | 2 | 6 |
+----+--------+---------+
Ich sehe mich da irgendwie eher ineffiziente Abfragen benutzen, z.B.:
Code:
SELECT
items.id, items.title
FROM
items
LEFT JOIN
items parent_items ON parent_items.id = items.parent_id
LEFT JOIN
items parent_parent_items ON parent_parent_items.id = parent_items.parent_id
INNER JOIN
libraries
ON (
libraries.id = items.library_id
OR
libraries.id = parent_items.library_id
OR
libraries.id = parent_parent_items.library_id
)
AND libraries.id = 1
INNER JOIN
tags_items
ON (
tags_items.item_id = items.id
OR
tags_items.item_id = parent_items.id
OR
tags_items.item_id = parent_parent_items.id
)
AND tags_items.tag_id IN (1, 2)
WHERE
items.type_id IN (1, 2, 5, 6, 7)
AND
(items.title LIKE '%Bruce Wayne%' OR items.description LIKE '%Bruce Wayne%')
GROUP BY
items.id
HAVING
COUNT(DISTINCT tags_items.tag_id) = 2;
Damit bekomme ich das was ich erwarte
Code:
+----+----------------------------------+
| id | title |
+----+----------------------------------+
| 1 | Batman - The Dark Knight Trilogy |
| 2 | Batman Begins |
| 3 | The Dark Knight |
| 4 | The Dark Knight Rises |
| 6 | Gotham - TV Show |
| 7 | Gotham - Season 01 |
| 8 | Gotham - Season 01 - Episode 01 |
+----+----------------------------------+
Szenen/Kapitel und Clips mit einzubeziehen würde auch funktionieren, genau so wie Sortieren und Limitieren, das Einbeziehen von weiteren Tags die z.B. nur Filmen zugeordnet sind, oder das Ausschließen von Videos die einer Gruppe angehören.
Performant, ist aber anders. Das LIKE hilft hier ungemein, so das ich bei Größenordnungeb von 300,000 Einträgen so bei 0.1 - 0.2 Sekunden heraus komme, doch ohne eine solche weitere Einschränkung (wie es z.B. der Fall wäre wenn man nur nach Tags filtert) geht die Performance aufgrund des einbeziehens der Elterntabellen böse in den Keller, dann sind nämlich 3 Sekunden und aufwärts angesagt, und das gefällt mir irgendwie so gar nicht.
Stellt sich mir die Frage ob, und wenn wo ich hier auf dem falschen Dampfer bin. Ist das ganze bereits durch das Schema zum Scheitern veruteilt?
Gruß, Timo
