Beziehungen auf MySQL erstellen?

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Freaky
***
Beiträge: 50
Registriert: Mo, 24.05.2010 08:30

Beziehungen auf MySQL erstellen?

Beitrag von Freaky »

Hallo,

folgendes verwende ich:

LibreOffice 3.5.4.2 (Ubuntu)
externe MySQL Datenbank (all-inkl)
JDBC

den ganzen Tag schon, versuche ich Beziehungen zwischen meinen Tabellen aufzubauen. Primärschlüssel habe ich vergeben, doch da ich mehrere Tabellen habe, muss ich ja noch Beziehungen erstellen. Sorry schon mal für die Newbiesprache, bin mich noch am einlesen.
Wenn ich die Beziehungen in Base über Beziehungen einfach per Maus rüberschiebe, passiert nichts. Ich habe mir schon zig Videos angeguckt, wo das alles ganz easy geht, bei mir geht da auch nach 4 Stunden rumexperimentieren nichts.

Dann habe ich mir MySQL Workbench installiert. Mich da auch wieder eingelesen, ich verbinde mich zu meiner Datenbank, sobald ich dann jedoch ein neues EER Diagramm erstelle, ist meine Datenbank nicht mehr vorhanden. Ich kann sie also nicht einbeziehen.

Durch längeres suchen bin ich auf MyISAM und InnoDB gestoßen. In phpMyAdmin wird mir ersteres angezeigt. Hat das was damit zu tun?
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: Beziehungen auf MySQL erstellen?

Beitrag von juetho »

Hallo, du solltest dich auf ein Verfahren festlegen und nicht hin- und herspringen. Das wird dann nicht nur für dich selbst, sondern auch für potenzielle Helfer unübersichtlich. Deshalb zunächst ein paar Hinweise.

Base und MySQL: Die Fremdschlüssel sind Festlegungen der Datenbank selbst, also von MySQL. Base ist die Schnittstelle zwischen der Datenbank und der Benutzeroberfläche, also von Abfragen, Formularen und Berichten. Du kannst Fremdschlüssel in Base anlegen, indem du über Extras > SQL einen ALTER TABLE-Befehl abschickst. (Ich weiß nicht, ob der Weg über Extras > Beziehungen nur die vorhandenen Verknüpfungen anzeigen kann oder sie auch anlegen.)

MyISAM und InnoDB haben damit etwas zu tun, wie MySQL die Datenbanken physikalisch auf der Festplatte speichert und intern organisiert. Das hat nichts mit den SQL-Befehlen, den Fremdschlüsseln oder der Zusammenarbeit mit Base zu tun.

Die Workbench, phpmyadmin oder das Konsolenprogramm mysql sind unterschiedliche Wege, um mit der Datenbank zu kommunizieren. Das Ergebnis ist in allen Fällen gleich: Entweder etwas funktioniert, oder es funktioniert nicht. :?

Die Workbench ist allerdings viel mehr als ein SQL-Hilfsprogramm, sie dient nämlich auch zur Konzeption von Datenbanken. Für den Einstieg solltest du dich auf den SQL-Editor beschränken - aus dem Startfenster heraus mit Strg-U aufzurufen (vorausgesetzt, dass unter Ubuntu der gleiche ShortCut gilt).

Soweit die Vorrede, jetzt konkret zur Erzeugung der Fremdschlüssel. (Ich beschränke mich auf zwei Tabellen, die miteinander verknüpft werden sollen, und die dafür nötigen Spalten.) Voraussetzung ist, dass die Spalten und die Datentypen des Primärschlüssels in der Primärtabelle übereinstimmen mit den Spalten und Datentypen des Fremdschlüssels in der Detailtabelle. Beispiel (übernommen aus Beziehungen bei Base funktionieren nicht und berichtigt):
  • Tabelle Schueler hat das Feld ID vom Typ INTEGER als Primärschlüssel (am besten auch gleich AutoIncrement)
  • Tabelle Termine hat ein Feld ID vom Typ INTEGER als Primärschlüssel (am besten auch gleich AutoIncrement) und außerdem ein Feld Schueler_ID ebenfalls vom Typ INTEGER.
  • Tabelle Termine verknüpft über einen Fremdschlüssel die Felder Termine.Schueler_ID und Schueler.ID.
In der Workbench legst du die Fremdschlüssel so fest: Object Browser > Datenbank > Tables > die betreffende Detailtabelle > Alter Table. Im Register ForeignKeys vergibst du dem Fremdschlüssel einen passenden Namen (am besten etwas wie: Detailtabelle_Spalte_FK oder Detailtabelle_Spalte_Primärtabelle). Unter "Referenced Table" wählst du die Primärtabelle aus, im rechten Teilfenster ordnest du dem Feld aus der Detailtabelle (im Beispiel Schueler_ID) das passende Feld der Primärtabelle zu. Mit Apply wird das gespeichert.

Aus dem Kontext-Menü heraus kannst du mit Send to SQL Editor > Create Statement prüfen, wie MySQL den Foreign Key erzeugt hat. Das kannst du auch direkt als SQL-Befehl - in der Regel mit ALTER TABLE - manuell machen.

Es ist möglich, auch andere Felder für Primär- und Fremdschlüssel vorzusehen. Davon ist aber in aller Regel abzuraten. Die ID und damit auch ein Fremdschlüsseln sollte nur die Funktion haben, dass die Datenbank selbst einen Datensatz eindeutig identifizieren kann, aber keine sonstige Bedeutung für den Anwender.

Mehr zu Fremdschlüsseln findest du beispielsweise in der Einführung in SQL. Gruß Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
RobertG
********
Beiträge: 2068
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Beziehungen auf MySQL erstellen?

Beitrag von RobertG »

Hallo Freaky,

ich habe noch nicht getestet, ob Base in der Lage ist, die Beziehungen von Tabellen in MySQL auch über die GUI zu erstellen. Eine Grundlage solltest Du aber beachten: Fremdschlüsseldefinitionen werden nur bei Tabellen des Typs INNODB unterstützt. Siehe http://dev.mysql.com/doc/refman/5.1/de/ ... -keys.html

Du musst allerdings nicht mit den Beziehungsdefinitionen der Datenbank arbeiten. Wenn Du eine Datenbank sauber erstellst, dann wird die Beziehung über die Formulare gesichert. Dann darf allerdings niemand einfach an den Tabellen mit Werten für Fremdschlüsselfeldern arbeiten, die gar kein Gegenüber haben.

Gruß

Robert
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: Beziehungen auf MySQL erstellen?

Beitrag von juetho »

RobertG hat geschrieben:Eine Grundlage solltest Du aber beachten: Fremdschlüsseldefinitionen werden nur bei Tabellen des Typs INNODB unterstützt. Siehe http://dev.mysql.com/doc/refman/5.1/de/ ... -keys.html
Ach du meine Güte. Noch ein Grund, warum MySQL von manchen Leuten nicht als vollwertige Datenbank angesehen wird und InnoDB bei neu angelegten Datenbanken als Standard vorgesehen ist, siehe InnoDB as default engine. Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
Freaky
***
Beiträge: 50
Registriert: Mo, 24.05.2010 08:30

Re: Beziehungen auf MySQL erstellen?

Beitrag von Freaky »

juetho hat geschrieben:
RobertG hat geschrieben:Eine Grundlage solltest Du aber beachten: Fremdschlüsseldefinitionen werden nur bei Tabellen des Typs INNODB unterstützt. Siehe http://dev.mysql.com/doc/refman/5.1/de/ ... -keys.html
Ach du meine Güte. Noch ein Grund, warum MySQL von manchen Leuten nicht als vollwertige Datenbank angesehen wird und InnoDB bei neu angelegten Datenbanken als Standard vorgesehen ist, siehe InnoDB as default engine. Jürgen
Deshalb bin ich ja überhaupt darauf gekommen und frage nach. Bei mir ist der Standard nämlich MyISAM.

Vielen Dank erst mal für Eure Antworten. Das ist erstmal wieder Input um mich weiter durch zu lesen.

Offtopic:
Wollt Ihr eventuell mal auf meine Übersicht gucken ob das okay aussieht?

Wenn ich da im übrigen Tabellen verbinde und speicher, sind sie wieder weg wenn ich sie neu öffne.
Dateianhänge
Auswahl_163.jpeg
Auswahl_163.jpeg (56.48 KiB) 5853 mal betrachtet
RobertG
********
Beiträge: 2068
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Beziehungen auf MySQL erstellen?

Beitrag von RobertG »

Hallo Freaky,

scheint mir irgendwie logisch, dass die Tabellenansicht nachher nicht mehr da ist. Ich nehme an, dass Base die aus der Datenbank ausliest. Woher soll diese Ansicht sonst auch kommen. Und da keine Beziehungen definiert sind, brauchen da auch keine Tabellen zu stehen.
Ich habe das gerade einmal bei meiner MySQL-Datenbank getestet (LO 3.3.4, MySQL-Native-Treiber). Wenn Du InnoDB-Tabellen nimmst, dann kannst Du die Verbindungen ziehen. Sie bleiben auch stehen. In PHPMyAdmin werden die Verbindungen auch angezeigt.

In Deiner Übersicht hat die Tabelle "artikel" zwei Primärschlüssel. Warum?

Gruß

Robert
Freaky
***
Beiträge: 50
Registriert: Mo, 24.05.2010 08:30

Re: Beziehungen auf MySQL erstellen?

Beitrag von Freaky »

Also die Tabellen stehen da hinterher schon noch so. Nur die angelegten Beziehungen werden nicht gespeichert.
Warum in der Tabelle zwei Primärschlüssel sind, weiß ich nicht, lässt sich auch nicht mehr entfernen, muss ich noch mal löschen und neu anlegen.

Ich kann ja in PHPMyAdmin nachträglich auf InnoDB stellen. Kann ich das einfach machen oder kommt Base dann durcheinander?
RobertG
********
Beiträge: 2068
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Beziehungen auf MySQL erstellen?

Beitrag von RobertG »

Hallo Freaky,

ich würde das mit der Tabellenformatsänderung einfach versuchen. Eigentlich liest ja Base nur die Tabellennamen und andere Informationen aus. Da dürfte eigentlich kein Problem auftauchen - außer, dass Du eventuell die Tabellen in der Beziehungsdefinition entfernen und wieder neu laden musst. Als ich nämlich die beiden Tabellen mit InnoDB dabei hatte war Base erst einmal bei der Erstellung des Bildschirms für die Beziehungsdefinitionen mächtig am Rotieren - vielleicht, weil da ein paar mehr Datenbanken liegen und bei allen geklärt werden musste, ob InnoDB dabei ist oder nicht ...

Gruß

Robert
Freaky
***
Beiträge: 50
Registriert: Mo, 24.05.2010 08:30

Re: Beziehungen auf MySQL erstellen?

Beitrag von Freaky »

Guten Morgen!

Das umstellen per PHPMyAdmin hat problemlos geklappt.
Nach ein paar Stunden Schlaf ist mir nun auch der Rest gelungen und quasi im Traum eingefallen.

Die IDs hatten mehrfach Auto-Werte, und einige Tabellen waren zum testen schon ein wenig befüllt.
Jetzt klappen alle Beziehungen, auch 1:n.

Wahnsinn was Schlaf bringt!
Freaky
***
Beiträge: 50
Registriert: Mo, 24.05.2010 08:30

Re: Beziehungen auf MySQL erstellen?

Beitrag von Freaky »

Eine Frage habe ich dennoch.
Meine Beziehungen sehen jetzt so aus:
Auswahl_168.jpeg
Auswahl_168.jpeg (53.19 KiB) 5784 mal betrachtet
Dann müsste doch, wenn ich einen Artikel anlege, die automatisch generierte ID auch in der Tabelle "Medien" erscheinen oder?
Tut sie aber nicht.
Hier die beiden Tabellen:
Auswahl_169.jpeg
Auswahl_169.jpeg (93.4 KiB) 5784 mal betrachtet
Habe mir schon Beispielprojekte angeschaut, da ist es auch so, soweit ich das gesehen habe.
RobertG
********
Beiträge: 2068
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Beziehungen auf MySQL erstellen?

Beitrag von RobertG »

Hallo Freaky,
Freaky hat geschrieben: Dann müsste doch, wenn ich einen Artikel anlege, die automatisch generierte ID auch in der Tabelle "Medien" erscheinen oder?
Die automatisch generierte ID erscheint nicht in "medien". Sie muss dort eingetragen werden. Es darf nur zu jedem Artikel ein Medium existieren - aber auch gar keines.

In Base wird der Übertrag über Formular und Subformular geregelt. Die Tabelle "artikel" gehört ins Hauptformular, die Tabelle "medien" ins Subformular. Ist ein "artikel" eingegeben, dann existiert eine "artikel"."id". Die wird übergeben an die "medien"."id".

Gruß

Robert
Antworten