PMG2022/DB Beleg/Lukas
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<language>SQL</language>
[[Bild:Disney.png|200px|right]]
__NOTOC__
<font size="6"><h3>Projekt SQL - Filmstreaming</h3></font>
===Idee===
Idee: Verknüpfung Streamingdienste mit Verfügbarkeit von Filmen in Bezug auf Personen mit Abosystem
Ich finde es heutzutage viel zu unübersichtlich, welcher Film bei welchem Streaminganbieter verfügbar ist.
Zudem fände ich es sehr praktisch wenn es dazu eine Plattform gäbe, die einem Auskunft darüber gibt.
Diese Plattform könnte ungefähr so aussehen...
===Modelle===
[[Bild:ERM2.png|left|650px|thumb|Entity-Relationship-Modell]]
'''Beziehungen'''
Eine Person hat mehrere Streamingdienste
abboniert.
Ein Streamingdienst hat mehrere Kunden.
-> n : m
Ein Film ist bei mehreren
Streamingdiensten verfügbar.
Ein Streamingdienst hat mehrere
Filme im Angebot.
-> n : m
'''Verknüpfung'''
Bei einer n : m Beziehung wird immer eine dritte Tabelle benötigt, folglich muss es insgesamt fünf Tabellen geben.
Als Primärschlüssel wählte ich die Kundennummer, den Plattform-Namen und die Filmnummer. In der jeweiligen
Verknüpfungstabelle würden diese dann als Fremdschlüssel verwendet.
[[Bild:ER-Bild.PNG|left|1000px|thumb|Relationenmodell]]
'''Normalformen'''
1.Normalform: nur eine Information pro Feld -> erfüllt
2.Normalform: eindeutige Zuordnung durch Primärschlüssel -> erfüllt
3.Normalform: keine Attribute dürfen von Nicht-Primärschlüsseln abhängig sein -> erfüllt
===Datenbank===
<code id="622b114a367c3">
DROP TABLE IF EXISTS Plattform;
CREATE TABLE Plattform(
Name varchar(30),
Preis integer(20)
);
INSERT INTO Plattform VALUES ('Netflix', 7.99);
INSERT INTO Plattform VALUES ('PrimeVideo', 6.99);
INSERT INTO Plattform VALUES ('Disney+', 8.99);
DROP TABLE IF EXISTS Person;
CREATE TABLE Person(
Name varchar(30),
KundenNr varchar(20)
);
INSERT INTO Person VALUES ('Max', '001');
INSERT INTO Person VALUES ('Tim', '002');
INSERT INTO Person VALUES ('Lisa', '003');
DROP TABLE IF EXISTS Film;
CREATE TABLE Film(
Titel varchar(30),
FilmNr varchar(20)
);
INSERT INTO Film VALUES ('Star Wars', '990');
INSERT INTO Film VALUES ('Harry Potter', '991');
INSERT INTO Film VALUES ('Herr der Ringe', '992');
DROP TABLE IF EXISTS VerknüpfungP;
CREATE TABLE VerknüpfungP(
Nr varchar(30),
Abo varchar (20)
);
INSERT INTO VerknüpfungP VALUES ('001', 'Netflix');
INSERT INTO VerknüpfungP VALUES ('002', 'PrimeVideo' );
INSERT INTO VerknüpfungP VALUES ('003', 'Netflix');
INSERT INTO VerknüpfungP VALUES ('003', 'Disney+' );
DROP TABLE IF EXISTS VerknüpfungF;
CREATE TABLE VerknüpfungF(
Nr varchar(30),
Abo varchar (20)
);
INSERT INTO VerknüpfungF VALUES ('990', 'Disney+');
INSERT INTO VerknüpfungF VALUES ('991', 'PrimeVideo' );
INSERT INTO VerknüpfungF VALUES ('991', 'Netflix');
INSERT INTO VerknüpfungF VALUES ('992', 'Netflix' );
</code>
<run id="622b114a3683d">
-- Allgemeine Abfrage aller Tabellen
SELECT * FROM Plattform;
SELECT * FROM Person;
SELECT * FROM Film;
-- SELECT * FROM VerknüpfungP;
-- SELECT * FROM VerknüpfungF;
-- Welche Person hat welches Abo?
SELECT Name,Abo FROM Person,VerknüpfungP
WHERE Person.KundenNr=VerknüpfungP.Nr;
-- Wer hat ein Disney+ Abo?
SELECT Person.Name,Abo,Preis FROM Person,Plattform,VerknüpfungP
WHERE Person.KundenNr=VerknüpfungP.Nr and VerknüpfungP.Abo='Disney+' and Plattform.Name='Disney+';
-- Wer kann welchen Film schauen?
SELECT DISTINCT Person.Name,Film.Titel FROM Person,VerknüpfungP,VerknüpfungF,Plattform,Film
WHERE Person.KundenNr=VerknüpfungP.Nr and VerknüpfungP.Abo=VerknüpfungF.Abo and Film.FilmNr=VerknüpfungF.Nr ;
-- Wer bezahlt welchen Preis?
SELECT Person.Name,Preis FROM Person,VerknüpfungP,Plattform
WHERE Person.KundenNr=VerknüpfungP.Nr and VerknüpfungP.Abo=Plattform.Name ;
-- Welcher Film wo verfügbar?
SELECT Titel,Plattform.Name FROM Film,Plattform,VerknüpfungF
WHERE Film.FilmNr=VerknüpfungF.Nr and VerknüpfungF.Abo=Plattform.Name;
-- Welche Filme kann Max schauen?
SELECT DISTINCT Person.Name,Film.Titel FROM Person,VerknüpfungP,VerknüpfungF,Plattform,Film
WHERE Person.Name='Max' and Person.KundenNr=VerknüpfungP.Nr and VerknüpfungP.Abo=VerknüpfungF.Abo
and Film.FilmNr=VerknüpfungF.Nr ;
-- Welcher Streamingdienst ist am günstigsten?
SELECT Name,Preis FROM Plattform
WHERE Preis = (SELECT MIN(A.Preis) FROM Plattform As A)
</run>
===Zusammenfassung===
'''Funktion und Erweiterbarkeit'''
Ich denke das Prinzip ist erkennbar und funktioniert soweit auch. Die Datenbank kann leicht erweitert werden, sowohl bei den
Streamingdiensten(da fehlt z.B. Sky oder AppleTV), bei den Filmen (da hab ich nur eine sehr geringe Auswahl geschaffen) und
auch bei den Personen.
Aufpassen müsste man dann jedoch, dass sich die Kundennummern und die Filmnummern nicht gleichen. Dies dürfte zwar
eigentlich nicht zu Problemen führen, könnte aber verwirren. Das lässt sich aber auch leicht beheben, indem man die Nummern
vier- oder fünfstellig wählt.
'''Realismus'''
Ich denke es ist unrealistisch, dass die Kundennummern universell Verwendbar sind. In der Realität hat wahrscheinlich jede
Plattform ihr eigenes System um ihre Kunden zu identifizieren. Das gleiche gilt für die Filme, obwohl diese an der
Artikelnummer eindeutig erkennbar und für alle gleich wären.
'''Serien'''
Ich habe in meine Datenbank keine Serien eingebaut. Man könnte diese jedoch auch einfach in die Tabelle der Filme mit
eintragen. Dabei muss aber jede Staffel einzeln eingetragen werden. In der Praxis wäre das etwas unpraktisch.
'''Verbesserungsmöglichkeiten'''
<ul>
<li>Personen mit mehreren Abos in eine Zeile packen</li>
<li>Preise bei Personen mit mehreren Abos summieren</li>
</ul>
----
===Quellen===
<ul>
<li>[http://hsqldb.org/doc/guide/sqlgeneral-chapt.html SQL-Befehle]25.03.2022</li>
<li>[https://www.w3schools.com/sql/sql_distinct.asp SQL-Befehle]25.03.2022</li>
<li>[https://www.html-seminar.de/befehlsuebersicht.htm HTML-Befehle]25.03.2022</li>
<li>[https://www.4kfilme.de/wp-content/uploads/2021/07/disney-plus-netflix-prime-video-marktanteile.jpg Bild zur Überschrift]25.03.2022</li>
</ul>
<code hidden>https://www.werstreamt.es</code>