Derby/JavaDB Kleine DB mit Tabelle erweitern - Integrität - Alter-Table - Netbeans ...

Miu

Mitglied
Hallo alle zusammen,

ich schreibe gerade für mein Studium eine Java Anwendung. Diese Anwendung kommuniziert mit JavaDB. Kurz: Das Tool soll mehr oder weniger eine Studenten-Verwaltung sein. Man kann neue Studenten im System anlegen, sie zu Praktika bestimmter Module anmelden, ihnen Testate vergeben. Und dann hat es noch so nette Gimmicks dass man sich diese Daten visualisiert in verschiedenen Charts anzeigen lassen kann. Nach sehr viel Arbeit bin ich nun auch fertig mit der Implementierung der Methoden und Aufbereitung der Daten. Es funktioniert soweit alles.

Allerdings habe ich nun ein Problem. Wir haben eine "fast" fertig DB bekommen, welche im Zuge der Anwendungsprogrammierung erweitert werden soll um zwei Tabellen.

Java:
STUDENT { 
MATRIKEL VARCHAR(9)   <-- Primärkey
NAME VARCHAR(20)
VORNAME VARCHAR(20)
ADRESSE VARCHAR (200)
SKUERZEL VARCHAR(3)
}

PRAKTIKUMSTEILNAHME {
MATRIKEL VARCHAR(9)         <-- Sekundärschlüssel zur Tabelle STUDENT
MKUERZEL VARCHAR(5)        <-- Sekundärschlüssel zu einer Tabelle MODUL
SEMESTER VARCHAR (7)
TESTAT BOOLEAN
}

Das habe ich bislang einfach in Netbeans gemacht (Mit JavaDB verbunden, rechtsklick -> create Table) . Aus gutem Grund, denn 1. haben wir das anlegen von Tabellen über Code nie praktisch geübt - es ging immer nur um DB Abfragen und Updates. 2. Ist in unserem Einführungs-Paper für diese Aufgabe eben genau der Weg über Netbeans bebildert.

Jetzt meinte der Dozent aber aber letzte mal zu mir, dass ich die Identitätsbedingung sicherstellen muss. Stichwörter die dabei gefallen sind "Foreign Key", "Alter Table". Weiter nachhaken konnte ich nicht. Jetzt stehe ich da und bin verwirrt.

1. Ich weiß nicht was das ist, bzw. - ich weiß zumindest das "Alter Table" ein Alternativbefehl zu Create Table. Aber die Examples die ich dazu so im Internet finde überfordern mich.

2. Ich weiß gar nicht, ob ich das einfach nur "vergessen" habe und man dies eventuell sogar in Netbeans machen kann. Aber ich weiß nicht wie. Denn ich sehe da nur "Create Table" und dann steht da nichts über Alter Table oder Foreignkey

Kann mich hier jemand aufklären, wie dies zu verstehen und ggf. in Netbeans umzusetzen ist?

Ich bedanke mich und verbleibe ratlos :rtfm:

Liebe Grüße
Miu
 
Zuletzt bearbeitet:
Moin,

ALTER TABLE ändert die Struktur einer Tabelle, die zuvor mit CREATE angelegt wurde (kommt vom Wort ALTERNATE)
SQL ALTER TABLE - 1Keydata SQL-Tutorial

Ein FOREIGN KEY ist ein sog. Fremdschlüssel, mit dem auf einen Eintrag einer anderen Tabelle verwiesen wird! So verweist in Deinem Fall eine Matrikelnummer auf einen Eintrag in der Tabelle STUDENT, d. h. du kannst die hierüber die Studenten-Stammdaten (Name etc.) holen

Gruß
Klaus
 
Nachdem die Begrifflichkeiten dank Vfl_Freak nun endlich stimmen (so muss ich es nicht schreiben), meine Frage: Muss es Derby/JavaDB sein, oder hast du es nur ausgewählt, damit irgendetwas ausgewählt ist? Soll eine tatsächliche DB erstellt werden, oder ging es nur um die DDL?
 
ALTER TABLE ändert die Struktur einer Tabelle, die zuvor mit CREATE angelegt wurde (kommt vom Wort ALTERNATE)
SQL ALTER TABLE - 1Keydata SQL-Tutorial

Ein FOREIGN KEY ist ein sog. Fremdschlüssel, mit dem auf einen Eintrag einer anderen Tabelle verwiesen wird! So verweist in Deinem Fall eine Matrikelnummer auf einen Eintrag in der Tabelle STUDENT, d. h. du kannst die hierüber die Studenten-Stammdaten (Name etc.) holen

Vielen Dank für die Antwort.
Ich bin immer noch etwas verwirrt. Wenn ich die Tabellen über Netbeans anlege, dann kann ich doch diesen "Foreignkey" direkt kennzeichnen in dem ich "index" auswähle oder?

Ich habe inzwischen herausgefunden, dass ich wohl bei PRAKTIKUMSTEILANHME die Spalten
Semester, Matrikel und Mkuerzel als Primärschlüssel kennzeichnen soll. So dass mein Primärschlüssel eine Kombination aus den dreien ist. Das habe ich nun gemacht. Dabei müsste doch MKUERZEL und MATRIKEL nun automatisch ein "ForeignKey" sein von den anderen Tabellen sein, weil "index" ja automatisch eingehakt ist.

Wofür brauch ich da speziell dann AlterTable? Oder brauch ich das gar nicht mehr? Weil ich komme ja über diese Schlüssel-Beziehungen auf die anderen Tabellen, sonst würden meine DB Abfragen ja nicht funktionieren wenn ich da das kreuzprodukt bilde, tun sie aber. Ich glaube ja, das Netbeans das automatisch macht. Oder?

Muss es Derby/JavaDB sein, oder hast du es nur ausgewählt, damit irgendetwas ausgewählt ist?

Die DB war in den uns zur Verfügung gestellt Files wo u.a auch noch Libs drin waren, die wir einbinden sollen.
 
Zuletzt bearbeitet:
Wofür brauch ich da speziell dann AlterTable? Oder brauch ich das gar nicht mehr?

Es gibt oft Fälle wo man nachträglich eine Spalte zu einer Tabelle hinzufügen will.
Damit man aber nicht erst die Tabellen entladen, löschen, neu erstellen und neu befüllen muss kann man mit dem "ALTER" Befehl direkt die neue Spalte anlegen.
 
Ich bin immer noch etwas verwirrt. Wenn ich die Tabellen über Netbeans anlege, dann kann ich doch diesen "Foreignkey" direkt kennzeichnen in dem ich "index" auswähle oder?

"Index" != "Foreign Key" !!!

Ein Index ist zunächst einmal "nur" eine Möglichkeit, schneller auf Daten zuzugreifen (das ist etwas vereinfacht ausgedrückt, aber mag hier reichen).

Dann gibt es die spezielle Form eines "Unique Index": hier wird zusätzlich noch - quasi als Zusatzbedingung - gefordert, dass alle Werte der entsprechenden Spalte (zur Verwendung mehrerer Spalten gleich mehr, hier ist also erst einmal nur eine Spalte gemeint) "einzigartig" sind, jeder Wert darf nur einmal vorkommen.

Wenn du nun einen Primärschlüssel (oder primary key) verwenden willst, ist dazu ein "Unique Index" Voraussetzung (es mag davon Abweichungen geben, aber in der Praxis kenne ich nur primary keys die auf einem "Unique Index" basieren).

Der Primärschlüssel ist für sich gesehen erst einmal relativ nutzlos - WENN du nur eine Tabelle hast oder aber NUR Tabellen, die nicht miteinander in Beziehung stehen. Der zugrunde liegende "Unique Index" hingegen ist auch für eine einzelne Tabelle sinnvoll.

Ein Sekundärschlüssel (besser bekannt als "Foreign Key" oder auch "Fremdschlüssel") stellt eine logische Verknüpfung zwischen zwei Tabellen her. Es handelt sich dabei um einen Verweis von einer Tabelle auf eine andere, wobei das Ziel deines Fremdschlüssels immer ein Primärschlüssel einer anderen Tabelle sein muss.

Konkret auf dein Beispiel bezogen:

Der PK (primary key) für die Spalte MATRIKEL der Tabelle STUDENT wird aus der Tabelle PRAKTIKUMSTEILNAHME referenziert, und zwar über die dort ebenfalls definierte Spalte MATRIKEL. Wenn du eine solche "Foreign-Key-Beziehung" (also der Verweis einer als FK (Foreign Key) deklarierten Spalte einer Tabelle auf eine als PK deklarierten Spalte einer anderen Tabelle) über den entsprechenden Datenbank-Befehl definierst, sorgt das im Ergebnis dafür, dass du in PRAKTIKUMSTEILNAHME keine MATRIKEL angeben kannst, die nicht in STUDENT schon vorhanden ist. Und zwar ist das nichts, was dein Programm tut oder "entscheidet", sondern es handelt sich dabei um eine Datenbank-Funktionalität, die sich z.B. in einer SQLException niederschlagen kann, wenn du wider besseren Wissens versuchst, doppelte Daten zu speichern.

Soweit klar?

Dann kommen wir nun noch zur Verwendung mehrerer Spalten in einem "Unique Index":

Ich habe inzwischen herausgefunden, dass ich wohl bei PRAKTIKUMSTEILANHME die Spalten
Semester, Matrikel und Mkuerzel als Primärschlüssel kennzeichnen soll. So dass mein Primärschlüssel eine Kombination aus den dreien ist.

Wie oben gesagt, basiert ein PK immer auf einem Unique Index. In PRAKTIKUMSTEILANHME ist MATRIKEL aber nicht "unique", denn dann könnte ein Student nur ein einziges Praktikum während seines gesamten Studiums erleben. Das will niemand ;-)

Auch die Kombination aus MATRIKEL und MKUERZEL oder alternativ die Kombination aus MATRIKEL und SEMESTER ist nicht eindeutig: im ersten Fall wäre keine Wiederholung eines Praktikums möglich, im zweiten Fall könnte jeder Student (und natürlich auch jede Studentin) pro Semester nur ein Praktikum machen. Auch das könnte zu Engpässen im Studienablauf führen...

Richtig eindeutig wird es also erst, wenn du die drei Spalten zusammenfasst:

EIN Student macht in EINEM Semester das Praktikum xyz sicherlich nur EINMAL mit.

SQL-technisch bekommst du das hin, indem du einen "Unique Index" über die genannten drei Spalten erzeugst. Der PK ist wiederum grundsätzlich nur notwendig, wenn du diesen "Dreier-Index" auch referenzieren möchtest, die "Einzigartigkeit" deiner Datensätze ist bereits über den Unique Index sichergestellt. Tatsächlich ist es aber in der Regel so, dass du einen PK anlegst und dabei automatisch der Unique Index mit angelegt wird.

Das habe ich nun gemacht. Dabei müsste doch MKUERZEL und MATRIKEL nun automatisch ein "ForeignKey" sein von den anderen Tabellen sein, weil "index" ja automatisch eingehakt ist.

Ich denke, dass dies "automatisch" nicht der Fall ist, dürfte nach meinen Ausführungen oben klar geworden sein. Wenn nicht, hak nochmal nach.

Wofür brauch ich da speziell dann AlterTable? Oder brauch ich das gar nicht mehr? Weil ich komme ja über diese Schlüssel-Beziehungen auf die anderen Tabellen, sonst würden meine DB Abfragen ja nicht funktionieren wenn ich da das kreuzprodukt bilde, tun sie aber. Ich glaube ja, das Netbeans das automatisch macht. Oder?

Um eine Abfrage auf zwei Tabellen auszuführen oder gar ein Kreuzprodukt zu bilden, ist weder Index, noch Unique Index, weder Primary Key noch Foreign Key notwendig(!). Dafür sorgt einzig und allein die korrekte Formulierung deines SQL-Befehls. Allerdings kann je nach Umfang deiner Daten eine SQL-Abfrage über zwei Tabellen ohne Index (egal ob unique oder nicht unique) noch dazu ohne weitere Bedingungen, so dass du also ein "wunderschönes"(???) Kreuzprodukt erstelltst, SEHR lange dauern. Wohingegen dieselbe Abfrage unter Verwendung von Indexen und sinnvollerweise einschränkenden Bedingungen DEUTLICH schneller vonstatten geht. Das kann bei einigen Millionen Datensätzen durchaus schonmal ein Unterschied der Art "einige Stunden" (ohne Index, ohne Bedingung) zu "einige Sekunden" (mit Index, mit Bedingung) sein!
 
Zuletzt bearbeitet:

Zurück
Oben