Autor Beitrag
rushifell
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: Mo 14.04.14 09:21 
Hallo,

ich möchte einen kleinen Vokabeltrainer bauen und nutze dafür SQLITE3.

Die Tabelle ist folgendermaßen aufgebaut:
ausblenden 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:
ausblenden Quelltext
1:
Bewertungsindex  - Wortindex - Bewertung					


2) Ich erstelle nur eine weitere Tabelle für die Bewertungen:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)

Für diesen Beitrag haben gedankt: rushifell
rushifell Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: 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:

ausblenden Quelltext
1:
CREATE TABLE Bewertungstabelle (..... , UNIQUE (Benutzerindex, Wortindex) ON CONFLICT REPLACE);					


Gruß
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Mo 14.04.14 10:45 
user profile iconrushifell hat folgendes geschrieben Zum zitierten Posting springen:


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.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)

Für diesen Beitrag haben gedankt: rushifell
rushifell Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: Mo 14.04.14 11:12 
Vielen Dank :D

Also kann ich den PRIMARY KEY ähnlich wie UNIQUE verwenden.
ausblenden Quelltext
1:
CREATE TABLE Bewertungstabelle (..... , PRIMARY KEY (Benutzerindex, Wortindex) ON CONFLICT REPLACE);					


Viele Grüße