Habe mal eine Frage zur Datenbankstruktur.
Mein Setup:
Django + PostgreSQL
Soweit, so gut.
Habe einen großen Datendurchlauf und versuche nun zu optimieren.
Unser Server muss pro Minute einige Datensätze aktualisieren.
Jetzt sind verschiedene Models untereinander verbunden. Und ich habe so das Gefühl einen üblen und teuren Fehler zu machen:
Im Grundeintrag (Model 1) habe ich ein Many To Many Field.
Dabei bediene ich mich aus den Daten einer anderen App (Model 2).
In diesem Datensatz ist ein weiteres Many To Many Field - innerhalb der gleichen App (Model 3).
Als dict würde ich das so darstellen:
Code: Alles auswählen
allData = [
{Model 1 : [{Model 2 : [Model 3, Model 3, Model 3, .... ]}, {Model 2 : [Model 3, Model 3, Model 3, .... ]}, {Model 2 : [Model 3, Model 3, Model 3, .... ]}, ... ]},
{Model 1 : [{Model 2 : [Model 3, Model 3, Model 3, .... ]}, {Model 2 : [Model 3, Model 3, Model 3, .... ]}, {Model 2 : [Model 3, Model 3, Model 3, .... ]}, ... ]},
{Model 1 : [{Model 2 : [Model 3, Model 3, Model 3, .... ]}, {Model 2 : [Model 3, Model 3, Model 3, .... ]}, {Model 2 : [Model 3, Model 3, Model 3, .... ]}, ... ]},
...
]
Auf den Eintrag kommen etwa 5 Einträge aus Model 2. Und auf jeden Eintrag von Model 2 kommen bei der Erstellung jeweils 1 Eintrag.
Das bedeutet: Sobald Model 1 eingetragen wird, werden insgesamt im Schnitt 11 Einträge quer durch die Datenbank gemacht.
Die Aktualisierung bedeutet, dass geschaut wird, ob ein weiteres Model 2 angelegt wurde. Ist dem so, so kommt ein weiterer Eintrag aus Model 3 hinzu.
Zusätzlich bekommen alle Verknüpfungen von Model 2 pro Aktualisierung jeweils ein Update.
Also entstehen pro Aktualisierung mindestens 5 neue Einträge in der Datenbank.
Der Datensatz für sich soll alle 2 Minuten aktualisiert werden.
Zusätzlich kommen immer wieder neue hinzu - es sollen rund 1000 Datensätze aktuell gehalten werden.
Auf 2 Minuten kommen also 5000 neue Einträge - pro Minute 2500.
Nun stelle ich die Struktur der Many To Many Feldern in Frage.
Wenn ich ein Objekt im Adminbereich bearbeiten möchte ist die Ladezeit ziemlich lange.
Auch ist der Server bereits zu 33% bei weitaus weniger Datensätzen ausgelastet. Bevor ich die Leistung skaliere, würde ich die Datenbank gerne optimieren.
Die Zuweisung der Daten ist von vorn herein klar und nicht willkürlich.
Ich überlege für Model 2 eine "for_Model_1" ID zu erstellen und das Many To Many Field an der Stelle aufzulösen.
Ähnliches mit Model 3. So kann ich die Einträge im Admin Bereich viel schneller erstellen. Die Filterarbeit beim Abfragen der Daten ist am Ende dann von den Codezeilen her gefühlt aufwändiger. Allerdings wird wesentlich (!) öfter aktualisiert als die Daten manuell abzufragen.
Würde das Performancetechnisch Sinn machen?
Ist mein erstes Projekt dieser Art ... am besten ist es wenn es die Datenbank ein paar Monate macht
Ich hoffe man konnte halbwegs folgen.