Datenbank mit Liste

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Tobs
User
Beiträge: 65
Registriert: Sonntag 29. September 2013, 11:11

Hi, ich will eine Datenbank anlegen, die ein Programm nutzen kann um mich Vokabeln abzufragen

Das Problem ist, dass ein Wort in der anderen Sprache mehrere Bedeutungen haben kann,
man aber, soweit ich weiß, in Datenbanken keine unbegrenzten Listen anlegen kann

Die Frage wäre jetzt, kennt ihr eine Möglichkeit um Listen anzulegen?
Muss ich jedes Wort in einer eigenen Tabelle speichern?
Oder muss ich alles mit "," getrennt in eine Textdatei(oder anderweitiges) stopfen(Was nicht so toll aussieht)?

Danke für eure Hilfe im voraus :)
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Tobs hat geschrieben:Muss ich jedes Wort in einer eigenen Tabelle speichern?
Verwende eine Tabelle für das Wort an sich und zusätzlich eine davon abhängige Tabelle die per Fremdschlüssel darauf referenziert und als weitere Spalten den Sprachcode und das Wort in der entsprechenden Sprache enthält.
Tobs
User
Beiträge: 65
Registriert: Sonntag 29. September 2013, 11:11

Nochmal für Dumme, bitte? :|
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Tobs hat geschrieben:Nochmal für Dumme, bitte? :|
Eine Frage vorweg: Wie weit kennst du dich grundsätzlich mit relationalen Datenbanken aus?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

/me hat geschrieben: Eine Frage vorweg: Wie weit kennst du dich grundsätzlich mit relationalen Datenbanken aus?
Nächste Frage: Muss es denn eine "echte" Datenbank sein? Und dazu noch eine *relationale*? Oder reicht evtl. auch eine Textdatei mit einem entsprechendem Format? (JSON, XML, usw.)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Tobs
User
Beiträge: 65
Registriert: Sonntag 29. September 2013, 11:11

Naja, wir machen in der Schule gerade SQL in Informatik

Kannst du mal schnell beschreiben wie die 2 Tabellen ungefähr aussehen?

Ich kann einfache SQL Abfragen (SELECT,FROM,WHERE,GROUP BY,ORDER BY)

Ich weiß wie man mehrere Tabellen durchsucht, aber von Fremdschlüssel weiß ich nix

Bisher haben wir das immer so gemacht:

SELECT <Das Zeug was ich sehen will>
FROM Tabelle1
WHERE <Irgendwelche Vergleiche>
Tobs
User
Beiträge: 65
Registriert: Sonntag 29. September 2013, 11:11

Vorraussetzungen:
-muss zahlen speichern können(wie oft richtig/wie oft falsch)
-muss datum speichern können(wann zuletzt abgefragt bis richtig)
-muss schnell sein(irgendwann werden es 2000+ Vokabeln und mehr)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Tobs hat geschrieben: Ich kann einfache SQL Abfragen (SELECT,FROM,WHERE,GROUP BY,ORDER BY)

Ich weiß wie man mehrere Tabellen durchsucht, aber von Fremdschlüssel weiß ich nix
Ihr hab also noch keine JOINs besprochen? Oder zuvor theoretisch das relationale Modell? Hui... dann musst Du erst selber einiges nachholen fürchte ich. Hier kannst Du schon mal anfangen zu lesen...

Die Schlüssel und Fremdschlüsselbeziehungen sind ja gerade der *Clou* an relationalen Datenbanken ;-)

Ist das denn eine Hausaufgabe oder willst Du das privat selber lösen, aus Spaß an der Freude?

Wenn Du damit SQL lernen willst, bietet sich natürlich eine relationale DB als Backend an; wenn der Fokus eher auf Python liegt, kannst Du auch erst einmal das Backend vernachlässigen und die Domänenobjekte und -Funktionen bauen. Danach kann man die immer noch an eine DB anbinden oder simple Persistenz via JSON nutzen.

Ohne Eigeninitiative wirst Du so oder so nicht weit kommen! Da bringt es einfach nichts, wenn wir Dir hier das relationale Modell für die Vokabeln vorkauen.

Edit: Vielleicht hilft Dir das hier weiter - fand ich ganz gut, als ich daran beteiligt war 8)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

Von Zed Shaw gibt es das leider noch unvollständige Learn SQL The Hard Way (ALPHA). Der Anfang ist aber schon mal nicht schlecht und Fremdschlüssel sind schon dabei.
Tobs
User
Beiträge: 65
Registriert: Sonntag 29. September 2013, 11:11

Was haltet ihr davon, mir es kurz zu erklären, weil wir es demnächst sowieso in Informatik drannehmen? :mrgreen:
BlackJack

@Tobs: Was hältst Du davon zu warten bis es demnächst in Informatik drankommt? :-)
Tobs
User
Beiträge: 65
Registriert: Sonntag 29. September 2013, 11:11

Meine Eltern rasten gerade aus, weil ich mit dem Vokabelabfrager immer noch nicht weiter bin :(

Ich weiß wie man in Python ne Tabelle anlegt, und ich weiß wie man sie ändert, lädt, speichert, aber NICHT wie man sie abfrägt
Könnt ihr mir nicht einfach mal kurz erklären, wie ihr das meint, ich hab netamol gecheckt, was mir der User in der ersten Antwort
sagen wollte :(

Prinzip:

Das Wort + n*Anderssprachige Übersetzungen + Datum
in einer .db Datenbank
Tobs
User
Beiträge: 65
Registriert: Sonntag 29. September 2013, 11:11

Ich fang jetzt mal so an:

import sqlite3
datenbank = sqlite3.connect("meine_datenbank.db")
CREATE TABBLE Vokabeln (
Wort TEXT,
Datum DaTuM, #Da fehlt mir noch der Datentyp(Integer für Tagesanzahl?)
Übersetzungen LiStE_mIt_TeXt #Das ist mein Hauptproblem
)
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Ein einfacher Entwurf ohne Datentypen:

Code: Alles auswählen

VOKABEL
id

TRANSLATION
id
vokabel_id
language_code
word
Das dürfte die einfachste Variante sein. Natürlich lässt sich das mit weiteren Spalten ergänzen.

Die Tabelle VOKABEL dient jetzt ausschließlich der Gruppierung von Vokabeln. Die Tabelle TRANSLATION enthält die eigentlichen Begriffe. Das Feld vokabel_id verweist auf einen Eintrag in der Tabelle VOKABEL und gruppiert die Wörter damit. Das Feld language_code gibt die Sprache an und das Feld word enthält schließlich das Wort selber.

Du hast damit nicht eine führende Sprache der Vokabeln in allen anderen Sprachen zugeordnet werden, sondern alle Sprachen existieren gleichberechtigt nebeneinander.

Mit SELECT * FROM translation WHERE language_code = "en" könntest du so alle englischsprachigen Wörter selektieren. Wenn du dann die id der Vokabel bekommst kannst du anschließend mit SELECT word FROM translation WHERE id = [deine id] AND language_code = "en" das passende englische Wort selektieren. Umgekehrt geht es natürlich auch und eine Ergänzung um andere Sprachen ist problemlos möglich.
Tobs
User
Beiträge: 65
Registriert: Sonntag 29. September 2013, 11:11

OK, danke
Tobs
User
Beiträge: 65
Registriert: Sonntag 29. September 2013, 11:11

Du meinst mein Vokabelbfrager soll sich eine zufällige ID aus VOKABEL(die mit den IDs) holen, und dann
ein Kommando ausführen, dass alle Wörter mit dieser ID aus TRANSLATION(die Übersetzungen) zurückgibt?
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Tobs hat geschrieben:Du meinst mein Vokabelbfrager soll sich eine zufällige ID aus VOKABEL(die mit den IDs) holen, und dann
ein Kommando ausführen, dass alle Wörter mit dieser ID aus TRANSLATION(die Übersetzungen) zurückgibt?
Das wäre eine Möglichkeit. Ich würde es wahrscheinlich andersherum angehen und das zufällige Wort in meiner Quellsprache in TRANSLATION suchen. Wenn man es schön machen will, dann kann man auf Basis der identischen vokabel_id auch noch direkt überprüfen ob das Wort in der gewünschten Zielsprache ebenfalls existiert, denn sonst wäre ein Heraussuchen ja sinnlos.

Das könnte (ohne Zufallskomponente) etwa so aussehen.

Code: Alles auswählen

SELECT t1.vokabel_id, t1.word, t2.word
  FROM translation as t1
  JOIN translation as t2 ON
    t2.vokabel_id = t1.vokabel_id  AND
    t2.language_code = "de"
  WHERE 
    t1.language_code = "en"
Tobs
User
Beiträge: 65
Registriert: Sonntag 29. September 2013, 11:11

Ich hab mich halb totgesucht, um ein Programm zu finden, dass SQLite3 Datenbanken (datenbank.db) öffnen kann :(
Habt ihr da ne Freeware für mich, weil es echt verdammt mies ist so viele Datensätze über die Konsole einzugeben :(
Und kommt mir jetzt nicht mit: Programmier doch ein Programm, das das macht :|

Danke im voraus
Tobs
User
Beiträge: 65
Registriert: Sonntag 29. September 2013, 11:11

Und es wäre genial, wenn mir noch jemand sagen könnte wie ich da Variablen statt """text""" strings eintragen könnte :mrgreen:
BlackJack

@Tobs: Also mal so auf die schnelle gesucht: Es gibt ein Firefox-Plugin: SQLite Manager und zum Beispiel Sqliteman als Desktopanwendung.

Ausserdem gibt es ja noch das ``sqlite3``-Programm für die Kommandozeile womit man Textdateien importieren kann, die man zum Beispiel mit einer Tabellenkalkulation oder einem Texteditor erstellen kann.

Edit: Wie man variable Werte in einer SQL-Anfrage verwendet steht in der Dokumentation zum `sqlite3`-Modul.
Antworten