Entwickler-Ecke
Datenbanken - Bewertung eines Records durch mehrere Benutzer
rushifell - Mo 14.04.14 09:21
Titel: Bewertung eines Records durch mehrere Benutzer
Hallo,
ich möchte einen kleinen Vokabeltrainer bauen und nutze dafür SQLITE3.
Die Tabelle ist folgendermaßen aufgebaut:
Quelltext
1: 2: 3:
| Wortindex (Primärschlüssel) - Fremdwort - Deutsch - Lektion - Bewertung
01 - alzarsi - aufstehen - Lektion 9 - 1 |
In der Bewertung kann man in einem Integerwert festlegen, wie gut man das Wort gewusst hat (z.B. 0 = noch nicht bewertet;
1 = sehr gut; 6 = ungenügend). Dadurch besteht später die Möglichkeit, gut gewusste Wörter herauszufiltern.
Nun möchte ich gerne, dass mehrere Leute eine Zeile bewerten können.
Ich dachte nun an folgende Möglichkeiten:
1) Ich erstelle einfach pro Benutzer eine weitere Tabelle mit den Spalten:
Quelltext
1:
| Bewertungsindex - Wortindex - Bewertung |
2) Ich erstelle nur eine weitere Tabelle für die Bewertungen:
Quelltext
1: 2: 3:
| Bewertungsindex - Wortindex - Benutzername - Bewertung 01 - 01 - Person 1 - 2 02 - 01 - Person 2 - 4 |
Bei der zweiten Möglichkeit müsste ich überprüfen, ob der Eintrag Wortindex und Benutzername bereits existiert. Allerdings erscheint mit diese als sinnvoller. Da ich jedoch absoluter Neuling bin, was Datenbank-Programmierung angeht, bin ich mir unsicher.
Viele Grüße
Nersgatt - Mo 14.04.14 09:37
Generell bist Du auf dem richtigen Weg.
Ich würde nur noch eine weitere Tabelle mit den Benutzer machen. So dass Du in der Bewertungstabelle nicht den Benutzernamen speicherst, sondern den Benutzerindex.
Als Primärschlüssel könnte man hier auch die Kombination aus Wortindex und Benutzerindex verwenden und sich den Bewertungindex sparen.
Allerdings wird oft bei solchen Konstrukten noch eine Spalte als Primärindex mitgeführt - so wie Du es vorschlägst -. Das hat den Vorteil, dass die Indizes nicht ellenlang werden, wenn es noch weitere Detailtabellen zu den Bewertungen gibt.
In dem Fall solltest Du aber die Kombination aus Benutzerindex und Wortindex in der Datenbank als UNIQUE markieren, damit hier nur ein Bewertung pro Benutzer pro Wort gespeichert werden kann.
rushifell - Mo 14.04.14 10:37
Danke für Deine Antwort.
Nersgatt hat folgendes geschrieben: |
Ich würde nur noch eine weitere Tabelle mit den Benutzer machen. So dass Du in der Bewertungstabelle nicht den Benutzernamen speicherst, sondern den Benutzerindex. |
Das ist ein sehr guter Hinweis. Ich habe mir zwar schon einiges zu Datenbanken durchgelesen, hatte daran aber garnicht mehr gedacht. Eine Liste mit den bereits angelegten Benutzern muss ich sowieso speichern. Außerdem vermute ich, dass durch das Speichern des Benutzerindex statt des Benutzernamens Speicherplatz gespart wird.
Nersgatt hat folgendes geschrieben: |
Als Primärschlüssel könnte man hier auch die Kombination aus Wortindex und Benutzerindex verwenden und sich den Bewertungindex sparen. |
Das klingt gut und ist bei der Suche bestimmt auch einfacher und effizienter. Muss ich die Kombination aus Wortindex und Benutzerindex selbst erstellen oder gibts dafür bereits eine fertige Lösung? Ich habe im Moment keine Idee, wie ich zwei Integerwerte einfach verschmelzen kann.
Nersgatt hat folgendes geschrieben: |
In dem Fall solltest Du aber die Kombination aus Benutzerindex und Wortindex in der Datenbank als UNIQUE markieren |
Danke, das wusste ich auch noch nicht. Also so:
Quelltext
1:
| CREATE TABLE Bewertungstabelle (..... , UNIQUE (Benutzerindex, Wortindex) ON CONFLICT REPLACE); |
Gruß
Nersgatt - Mo 14.04.14 10:45
rushifell hat folgendes geschrieben : |
Nersgatt hat folgendes geschrieben: | Ich würde nur noch eine weitere Tabelle mit den Benutzer machen. So dass Du in der Bewertungstabelle nicht den Benutzernamen speicherst, sondern den Benutzerindex. |
Das ist ein sehr guter Hinweis. Ich habe mir zwar schon einiges zu Datenbanken durchgelesen, hatte daran aber garnicht mehr gedacht. Eine Liste mit den bereits angelegten Benutzern muss ich sowieso speichern. Außerdem vermute ich, dass durch das Speichern des Benutzerindex statt des Benutzernamens Speicherplatz gespart wird. |
Es geht nicht wirklich um Speicherplatz. Heute ist Festplattenspeicher spottbillig. Wenn Du nun aber den Benutzer Meier anlegst, kann er damit arbeiten. Irgendwann sagt die Meier aber "eigentlich heiße ja Maier und nicht Meier". Wenn Du nun eine Benutzertabelle hast und sonst nur die Benutzerindizes speicherst, dann musst Du nur ein Update auf einen Datensatz machen und schwupps heißt Meier Maier.
Wenn Du jedoch den Benutzernamen in den Detailtabellen speicherst, dann müsstest Du alle Datensätze updaten. Wenn Du den Benutzernamen dann noch in weiteren Tabellen gespeichert hast, musst Du alle Tabellen updaten (und dabei ja keine Tabelle vergessen!).
Zitat: |
Nersgatt hat folgendes geschrieben: | Als Primärschlüssel könnte man hier auch die Kombination aus Wortindex und Benutzerindex verwenden und sich den Bewertungindex sparen. |
Das klingt gut und ist bei der Suche bestimmt auch einfacher und effizienter. Muss ich die Kombination aus Wortindex und Benutzerindex selbst erstellen oder gibts dafür bereits eine fertige Lösung? Ich habe im Moment keine Idee, wie ich zwei Integerwerte einfach verschmelzen kann. |
Nein, Du musst keine Wert verschmelzen. Es bleiben zwei eigenständige Spalten. Nur kann ein Primärindex aus mehr als einem Feld bestehen. Du kannst also bei der Definition des Primärindex einfach angeben, dass dieser aus den Feldern Benutzerindex und Wortindex besteht.
rushifell - Mo 14.04.14 11:12
Vielen Dank :D
Also kann ich den PRIMARY KEY ähnlich wie UNIQUE verwenden.
Quelltext
1:
| CREATE TABLE Bewertungstabelle (..... , PRIMARY KEY (Benutzerindex, Wortindex) ON CONFLICT REPLACE); |
Viele Grüße
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!