Datenbank für Social Media

Nun gut dann erstelle ich mal hier einen Beitrag.
Ja dazu finden sich ein haufen Beiträge im Internet. Doch alle sind so allgemein gehalten oder gehen so sehr ins Detail, dass die auch wieder nicht das beantworten, was ich wollte. Oder meine Englischkenntnisse reichen nicht aus.

Nun aber zum Thema:
Ich plane eine art Social Media zu erstellen (nicht alleine). Dazu verwenden wir Django und wollen MySQL nehmen (haben da gelesen, dass dies die beste Variante ist, wenn es dazu Anmerkungen gibt gerne auch mit sagen ^^)
Natürlich wird es nicht sowas krasses wie Facebook, sondern einfach etwas wo wir etwas lernen und worauf wir stolz sein können.

Im Endeffekt wird es da Nutzer und Posts geben. Nun kommt die erste Frage dazu:
Wie sinnvoll ist es, die Datenbank in ihre 3. Normalform zu bringen?
Der Nutzer z. B.:
grafik
Ist es hier wirkklich sinnvoll drei Tabellen zu haben in dem die Nutzerdaten gespeichert werden? Oder wäre es in dem Falle besser, wenn es einfach eine Tabelle gibt in der alle Werte von den Nutzern stehen?

Frage 2:
Der Nutzer wird ja Leuten Folgen können. Dazu haben wir bis jetzt nur die Idee, dass wir in der Datenbank einen String mit den IDs der Gefolgten Leute speichern. Jedoch habe ich da so das Gefühl, dass der String schnell voll sein wird und dass es da eine bessere Methode geben muss.

Frage 3:
Wenn ich angemeldet bin kann ich ja in meinem Dashboard alle neuen Posts von den Leuten denen ich Folge einsehen. Jetzt kann ich mir nur kaum vorstellen, dass ich dazu schaue wem ich folge und dann alle Einträge in der Post Tabelle abrufe um zu schauen ob da ein Post dabei ist. Ich meine, irgenwann ist der Server ja auch ausgelastet und es klingt so umständlich.

Hier noch die komplette Datenbank:


Das Datenbankschema ist natürlich so noch lange nicht vollständig aber bevor wir dazu kamen, haben sich uns diese Fragen gestellt.
Ich gebe ehrlich zu, dass ich nicht gedacht hätte, dass bei den Datenbanken so viele unklarheiten auftreten.

Schonmal danke fürs lesen und beantworten :slight_smile:

1 Like

Hey, danke für deinen Beitrag!

Vorab: Mit MySQL (bzw. MariaDB) macht ihr garantiert nichts falsch. Und wenn ihr Django nutzt, seid ihr sowieso Datenbankunabhängig und könntet später auch zu einer anderen wechseln.

Frage 1: Bei der Anwendung der Normalformen geht der Streit schon los… meiner Ansicht nach sollte die 2. Normalform so gut wie immer eingehalten werden, die 3. allerdings nur, wenn es Sinn ergibt. In der Praxis lohnt es sich oft nicht, diese anzuwenden, weil es einfach nur Nachteile hätte. So würde ich auch in deinem Fall einen Mix empfehlen. Ich würde den User (also den Account) vom Profil trennen. Also Login-Informationen, etc. in eine Tabelle, Profil-Informationen (Name, Beschreibung, etc.) in eine andere. Mit der „Following“ und „Follower“-Spalte werdet ihr übrigens noch Probleme bekommen, siehe dazu:

Frage 2: Zu den Beziehungen von Datenbanken kannst du dir mal den Wikipedia-Artikel zu Kardinalitäten angucken. Relationale Datenbanken, wie MySQL/MariaDB, haben prinzipiell sehr wenig Probleme mit solchen Beziehungen anhand von IDs, wie du sie erwähnt hast. Das ist auch der richtige Weg, das zu tun. Extra-Punkte gibt es, wenn ihr die Foreign-Keys richtig setzt und dadurch auf Datenbank-Ebene für Konsistenz sorgt. Wichtig ist, dass ihr nicht eine Spalte mit „Following“ habt und da kommageteilt alle IDs reinpackt. Wie du schon richtig festgestellt hast, würde der String dann recht schnell voll und das Ganze inperformant werden. Richtig ist es, eine Zuordnungstabelle für die Beziehungen zu verwenden, in der jede Zeile ein Follow ist (ID von Folgendem und Gefolgtem). Sowas wird bei relationalen Datenbanken bei einer n:m-Beziehung immer benötigt.

Frage 3: So wird es vermutlich ablaufen müssen :slight_smile: Es gibt natürlich noch andere Wege mit Caches, Nicht-Rationalen Datenbanken (NoSQL), etc., aber für den Anfang ist das der einfachste und „bevorzugte“ Weg. Und wenn ihr entsprechende Indizes setzt und effiziente Queries schreibt, habt ihr da auch keine Performance-Probleme, bis ihr mehrere Millionen Nutzer und Leute mit Tausenden von Followern habt, und dann kann man das ja anpassen. Datenbanken wie MySQL und co. sind darauf ausgelegt, Millionen von Datensätzen in kürzester Zeit zu durchforsten und haben viele sehr effiziente Strategien das zu tun, daher werdet ihr bei richtiger Anwendung keine großen Nachteile haben. Wenn man dann in Dimensionen von Facebook, Twitter und Google rechnet, gilt das natürlich nicht mehr, aber darüber muss man sich ja zum Glück auch erst dann Gedanken machen, wenn man auch entsprechend viel Geld verdient ;D

Wünsche auf jeden Fall schon einmal viel Erfolg beim Projekt, ihr werdet bestimmt viel dabei lernen! Und lasst euch nicht entmutigen, wenn ihr falsche Design-Entscheidungen trefft oder später seht, wie ihr etwas besser machen könntet. Das hat man gerade am Anfang immer, und deswegen übt man ja auch :slight_smile:

2 Like

Danke für die schnelle und unglaublich ausfürhliche Antwort ^^
Ich denke das wird uns extrem weiterhelfen.
Zu zweitens ist mir noch einiges unklar, aber da muss ich mich wohl erstmal informieren wie der genze Spaß mit Kardinalitäten in Datenbanken funktioniert und umgesetzt wird bevor ich weitere Fragen dazu stellen kann.

Ich denke so schnell sind wir nicht zu entmutigen :stuck_out_tongue: