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

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: 3555
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.
Tobs
User
Beiträge: 65
Registriert: Sonntag 29. September 2013, 11:11

Aber wozu ist jetzt vokabel_id gut, ich dachte, man braucht für die Tabelle keinen extra Primärschlüssel, weil ja alle Wörter unterschiedlich sind,oder? :?:
Oder meinst du, dass die Vokabel ID dazu da ist nach Adjektiven,Verben,etc zu unterscheiden?
Tobs
User
Beiträge: 65
Registriert: Sonntag 29. September 2013, 11:11

Mit:

SELECT max(ID) FROM Vokabeln

Müsste man doch den größten ID-Wert zurückbekommen,
den ich dann in einen Integer verwandeln kann, 1 dazuzähle,
und so die neue ID bekomme, oder?
Tobs
User
Beiträge: 65
Registriert: Sonntag 29. September 2013, 11:11

OK ich hab die ID aus der Tabelle rausgeworfen, sieht jetzt so aus:

Tabelle 1 (von 1):

WORT, ÜBERSETZUNG, SPRACHE
-------------------------------
"HELLO","HALLO","ENG"
"HELLO","SERVUS","ENG"

Da ich nur 2 Sprachen hab will ich es dann noch weiterkürzen:

Tabelle 1 (von 1):

DEUTSCHES_WORT,ENGLISCHES_WORT
--------------------------------------
"HALLO","HELLO"
"SERVUS","HELLO"

Seht ihr da irgendwelche Probleme?
BlackJack

@Tobs: Es ist üblich einen numerischen Primärschlüssel zu verwenden, weil die in der Regel effizienter sortiert und verglichen werden können als Zeichenketten.

Mit dem Tabellenansatz ohne IDs sehe ich das Problem das die Daten redundant gespeichert sind. HELLO steht dort zweimal drin. Jetzt überlege Dir mal wieviel Aufwand das macht eine Vokabel bei der man sich verschrieben hat, in der Datenbank zu ändern. Und was zum Beispiel passiert wenn der Verschreiber dazu führt, dass sie den gleichen Namen hat, wie eine bereits vorhandene.

Das mit der max(ID) + 1 ist überflüssig. Alle mir bekannten relationalen DBMS kennen einen Mechanismus um die automatisch zu vergeben. So auch SQLite. Einfach eine ``INTEGER PRIMARY KEY`` deklarieren und dann den Wert beim Eintragen nicht angeben. SQLite trägt dann selbst eine passende ID ein.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Tobs: die Vokabel-Id beschreibt ist für jede Bedeutung eines Wortes die selbe. Jeder Bedeutungs-ID sind dann verschiedene Wörter in verschieden Sprachen zugeordnet. Du hast jetzt eine künstliche Trennung zwischen Wort und Übersetzung. Ist die Übersetzung etwa kein Wort?

ID, WORT, SPRACHE
-------------------------------
1, "HELLO","ENG"
1, "HALLO","DEU"
1, "SERVUS","BAY"
2, "BANK", "ENG"
2, "BANK", "DEU"
3, "BENCH", "ENG"
3, "BANK", "DEU"
BlackJack

@Tobs: Dann stellt sich als nächstes die Frage woran solche Informationen wie „zuletzt abgefragt” geknüpft werden sollen. An die Vokabel mit all ihren Übersetzungen, oder an die einzelnen Übersetzungen?
Tobs
User
Beiträge: 65
Registriert: Sonntag 29. September 2013, 11:11

Solang das Programm weiß, dass wenn es deutsch_englisch "HALLO" abfragt,
alles richtig ist, was "HALLO" in der Spalte "Deutsch" stehen hat, passt es.
Ist der Geschwindigkeitsverlust wirklich SOOO schlimm?
Mehr als ne halbe Sekunde macht das doch eh net aus, oder?
BlackJack

@Tobs: Es ist im Grunde völlig egal wie schnell das ist wenn Du es unsauber programmierst, es bleibt unsauber. Mach es so wenn Du magst, aber dann frag halt auch nicht wie man es richtig macht. ;-)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

BlackJack hat geschrieben:@Tobs: Es ist üblich einen numerischen Primärschlüssel zu verwenden, weil die in der Regel effizienter sortiert und verglichen werden können als Zeichenketten.
Ach wozu gibt es denn Indizes... *duck und weg* :mrgreen:
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

Am Ende will ich es schon richtig haben, aber momentan steh ich unter Zeitdruck,
deshalb lieber Dreckig und jetzt fertig als, ich blick noch nicht durch und Chaos :mrgreen:

Sry, hab schon wieder ein Problem:

c.execute("DELETE FROM vokabeln WHERE eng = " + attribut)

Das haut nicht hin, mit DELETE * FROM ... geht es auch nicht...
Tobs
User
Beiträge: 65
Registriert: Sonntag 29. September 2013, 11:11

Ich hab ein jetzt richtig mieses Problem mit mit miesen Folgen...

Ich hab ungefähr 200 Datensätze angelegt, und danach festgestellt, dass er die zwei Spalten genau verkehrt herum
reingeschrieben hat. Ich hab versucht mit nem externen Programm die Spalten umzubenennen, aber wenn ich es in
Python öffne ist alles so wie vorher

Wie kann ich die Inhalte der beiden Spalten tauschen?

Oder muss ich alles neu schreiben??? :?

Edit: Hat sich erledigt, ich hab die Datenbank geschrottet, indem ich sie mit nem Texteditor geöffnet hab. Ja ihr dürft mich jetzt auslachen :mrgreen:
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dann hast du doch jetzt gleich mehrere Dinge gelernt:

1. Dinge die automatisierbar sind, sollte man automatisieren. Wenn du Daten per Hand eingibst, dann darfst du dich nicht beschweren, wenn du das irgendwann noch einmal machen musst. Anders hättest du nur das Programm zum Einfügen umschreiben müssen. Ich zitiere dich mal:
Tobs hat geschrieben: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 :|
2. Verändere nie binäre Daten mit einem einfachen Texteditor.

3. Versionsverwaltungssystem sind etwas Tolles.

4. Gib keine 200 Datensätze ein ohne zwischendurch vielleicht mal zu testen ;-)

5. Wer den Schaden hat ... ;-)
Das Leben ist wie ein Tennisball.
Tobs
User
Beiträge: 65
Registriert: Sonntag 29. September 2013, 11:11

Ich hab bereits ein Programm zum beschreiben und löschen mit easygui geschrieben, trotzdem muss ich es noch von Hand eingeben,
das Programm erspart mir nur den Code und die Groß-Klein-Schreibung, und fragt mich ob ich einen Datensatz löschen will, wenn er
bereits vorhanden ist, aber ich habs jetzt halt trotzdem nochmal von Hand eingeben müssen :-/
Antworten