SQL Datenbank Modell PK und FK setzen

Cool Master

Fleet Admiral
Registriert
Dez. 2005
Beiträge
39.752
Moin,

ich habe ein kleines Problem. Ich möchte eine kleine Kurs App in Django bauen, allerdings habe ich keine Ahnung wie ich die Primary und Foreign Keys am besten und sinnvolsten setzen soll.

Im Anhang mal ein Bild was ich aktuell habe.
Sollte da noch ein Problem bei den Tabellen sein, ich bin offen was ich noch ergänzen könnte.

Falls fragen sind einfach fragen, aber ich hoffe das Bild erklärt alles.
 
für jede 1..n beziehung brauchst du eine weitere Tabelle in der die Zuordnung definiert wird

kurs.id ist dann PK in Kurs
handlungsbereich.id ist dann PK in handlungsbereich

neue Tabelle Kurszuordnung
kurs.id als FK aus Kurs
handlungsbereich.id als FK aus handlungsbereich
 
Die PKs sind einfach die jeweiligen IDs. Bei den FKs hast du immer 1:n-Beziehungen, da fügst du dann auf der n-Seite die ID der 1-Seite hinzu, also z. B. in der Tabelle 'lernbereiche' ein Feld 'kurs_id', das ein Fremdschlüssel auf die Kurs-Tabelle ist, usw.

Edit @redasurc: eine weitere Tabelle brauchst du nur für m:n-Beziehungen, bei 1:n macht man es einfacher so wie oben beschrieben.
 
@NullPointer

Wenn ich das nun richtig verstanen habe ergänze ich all meine Felder (außer Kurs) mit kurs_id welche auf den PK, Kurs.id zeigt?
 
Kurs:
id ist der Hauptschlüssel

Handlungsbereich:
id ist der Hauptschlüssel
Kurs_id ist der Fremdschlüssel

Lernbausteine:
id ist der Hauptschlüssel
Handlungsbereich_id ist der Fremdschlüssel

Vertiefungsaufgabe:
id ist der Hauptschlüssel
Lernbaustein_id ist der Fremdschüssel

Uebungsaufgabeaufgabe:
id ist der Hauptschlüssel
Lernbaustein_id ist der Fremdschüssel

Es wird keine weitere Tabelle benötigt, da nur 1:n Beziehungen vorkommen.
 
Ich würde erstmal alle Namen auf Englisch übertragen - wenn das Projekt schon course app heißt, dann sollten auch alle Models und deren Attribute konsistent sein. Benutzt du South für Migrationsmanagement? Weil das ist echt nützlich für eine versionierte Datenbankstruktur, wenn du das Projekt weiter entwickelst und es unter Versionskontrolle (z.B. Git) hast.
So wie ich das sehe hast du keine spezifische Reihenfolge bei den Lernbausteinen innerhalb der Handlungsbereiche festgelegt. Außer bei den Voraussetzungen, die aber ihrerseits ein TextField sind. Vorausgesetzt, dass man die Kurse linear durchläuft, würde ich dort stattdessen ein parent Feld mit der ID des vorherigen Bausteins anlegen. Ist dies der erste Schritt, ist die Vorraussetzung NULL. Soll es mehrere Vorraussetzungen geben, solltest du dann für jeden Baustein diese in einer separaten Tabelle ablegen. Mehrere Werte in einem Feld sollte man unbedingt vermeiden.
Das Gleiche gilt für die Aufgaben (bei denen du allerdings doppelt das Feld text hast, was auch immer das sein soll). Bei den Aufgaben kannst du dir auch die 2 Tabellen sparen und einfach ein booleanField einfügen, das bestimmt ob es eine Vertiefungsaufgabe ist oder nicht - so musst du dir nur über eine Datenstruktur Gedanken machen.
Außerdem möchtest du sicher verschiedene Benutzer in deiner Webapp haben, also plane am besten gleich ein Besitzer Feld bei den Kursen ein. Den Individuellen Fortschritt der Anwender solltest du dann in einer separaten Tabelle verfolgen.

Ich empfehle dir mal diesen Artikel zu lesen: http://de.wikipedia.org/wiki/Normalisierung_(Datenbank)

Außerdem kann man sich auch mal hier und hier umschauen. Wobei der zweite Link ein bisschen alt ist, aber dafür auch sehr verständlich über Django informiert. Aber die hast du wahrscheinlich eh schon gelesen.

Das sind nur Vorschläge meinerseits, du musst dich nicht genötigt fühlen diese umzusetzen und einen Anspruch auf Perfektion erhebe ich auch nicht. :D Ich hoffe das hat dir geholfen.
 
Zuletzt bearbeitet:
@Theobald93

Danke, so ergibt das natürlich mehr Sinn statt alles auf Kurs zeigen zu lassen :)

Edit:

@dasnacht

Wie gesagt ich bin für Kritik oder Verberssungern immer offen :)

Edit:

Habe eben deine Nachricht noch mal genauer gelesen. Die Vorausetzung ist effektiv nur ein Info Text. Es soll nicht dazu beitragen das z.B. Lernabustein 5 geblockt wird, wenn man 1-4 noch nicht gesehen/gemacht hat. Ich halte von solchen Gängelungen nichts, wenn ein User gleich das Quiz machen will bitte, soll er.

Bzgl. South: Ja, ich nutze es (wegen django-cms), allerdings habe ich damit noch nie gearbeitet also selber etwas programmiert.

Zu den deutschen Variablen --> Bin in C++ mal gut auf die Fresse gefallen seit dem sind all meine Variablen deutsch ist aber am ende vom Tag eh egal wie die Teile sich nennen.

Warum ich bei Aufgaben das ganze zweimal habe kann ich dir auch nicht sagen war ein Denkfehler und ist wieder draußen, dachte ich bräuchte es zweimal aber war nicht der Fall.

Die App ist mittlerweile auch Lauffähig, wenn auch nur im Admin. Ich muss mal schauen ob ich die Lust auf ein Plugin schreiben habe damit man direkt in der Kursauswahl Seite ein Kurs anlegen kann und das ganze praktisch im Frontend aufbauen kann.
 
Zuletzt bearbeitet:
Zurück
Oben