Relationen füllen und Ansätze zur Implementation

Hallo Liebe Mitwissende,
ich blick’s nicht.

Wenn ich irgendeine Relation habe, dann definiere ich entsprechend zwei, oder bei einer n:m-Relation drei Tabellen, die jeweils einen Primärschlüssel und einen Sekundärschlüssel (bei n:m zwei Sekundärschlüssel) tragen. ok.

Mit einem db Werkzeug z.B. phppgadmin lege ich nun diese Tabellen nun physisch in der Datenbank an. ok.

Angenommen alle Tabellen sind wie auch immer gefüllt worden (auch die Fremdschlüssel ordentlich eingetragen). Möchte man nun Daten aus herauslesen, so fügt man die einzelnen Tabellen mit JOIN in der SELECT-Anweisung etc… zusammen. ok.
ABER: da fängt es schon an! Das bedeutet doch, dass das Client-Programm das Datenmodell kennen muss. Es muss wissen, das ein bestimmter Primärschlüssel als Sekundärschlüssel in einer entsprechenden Tabelle abgelegt ist.Also gibt es hier keine Trennung mehr, zwischen Anwendungsprogramm und Datenmodell. (??)
Oder programmiert man das Anwendungsprogramm so, dass es zwar ein select absetzt, aber aus einer in der Datenbank definierten View? Denn dieses kennt ja das Datenmodell - ist es ja auch nur eine select Abfrage. Aber diese wird von der Datenbank an sich selbst abgesetzt. Aber das Anwendungsprogramm muss wissen, dass es gerade genau diesen View abfragen darf. Es fehlt irgendwie so eine Trennschicht, die weiß wie sie was aus einer Datenbank rauskitzelt.

Das andere ist folgendes:
Wie geht ihr vor, wenn ihr nun einen neuen Eintrag anlegen wollt, dessen Bestandteile innerhalb der Datenbank aufgeteilt ist, und eben anhand den Primär- und Fremdschlüssel abgelegt werden muss.
Bisher habe ich in meiner Client-Anwendung selbst(!) entsprechende sql Kommandos abgesetzt, die z.B. in die erste Tabelle einen neuen Eintrag anlegen, danach die dadurch erzeugte primärID auslese, und mit dieser in die zweite Tabelle schreibe, um die Verknüpfung abzubilden. Gibt es einen JOIN in einer insert Anweisung? Und außerdem ist beim dem insert das Datenmodell wieder(!) in meiner Client-Anwendung. Wie macht ihr das?

Das letzte ist folgendes:
Wenn ich mittels dem db-Admin tool, oder im CREATE table Anweisung mit references tabelle(primkey) arbeite, dann muss ich trotzdem mit den JOINS arbeiten, nicht? Diese references haben nur Einfluss wenn ich was weglöschen möchte und nicht an die zweite Tabelle denke. Dann würde die DB einen Fehler senden und das Kommando nicht ausführen. Das Ding hilft mir weder beim Auslesen, noch beim Eintragen einer Relation. Ich muss immer selbst in die entsprechenden Tabellen schreiben. Ist das richtig?

Das ganz letzte:
Diese Interface Schicht die mir fehlt; ist das z.B. die Persistence Schicht Hibernate bei J2EE ? Muss ich also, wenn ich nicht mit J2EE arbeiten möchte, eine komplette solche Schicht entwickeln, um meine Anwendung vom Datenmodell zu entkoppeln? Die Usecases, die ich in meinem SW Entwicklungsprozess herausgearbeitet habe, die würde ich hier implementieren. Stimmt das?

oje;
Würde mich freuen was zu lesen.Danke schonmal.
Denis

Moin, Denis,

ich blick’s nicht.

wird schon noch :smile:

die jeweils einen Primärschlüssel und einen Sekundärschlüssel
(bei n:m zwei Sekundärschlüssel) tragen. ok.

Nicht ganz: Primär- und Fremdschlüssel.

Das bedeutet doch, dass das
Client-Programm das Datenmodell kennen muss.

Keineswegs, der Bezug wird durch die Join-Bedingung hergestellt: Join … ON …

Das andere ist folgendes:
Wie geht ihr vor, wenn ihr nun einen neuen Eintrag anlegen
wollt, dessen Bestandteile innerhalb der Datenbank aufgeteilt
ist, und eben anhand den Primär- und Fremdschlüssel abgelegt
werden muss.

Erst Parent, dann Child anlegen.

Bisher habe ich in meiner Client-Anwendung selbst(!)

Wer denn sonst?

entsprechende sql Kommandos abgesetzt, die z.B. in die erste
Tabelle einen neuen Eintrag anlegen, danach die dadurch
erzeugte primärID auslese, und mit dieser in die zweite
Tabelle schreibe, um die Verknüpfung abzubilden.

Korrekt.

Gibt es einen JOIN in einer insert Anweisung?

Nein, aber inserten kann man auch über Views, ist allerdings manchmal heikel.

Und außerdem ist beim dem
insert das Datenmodell wieder(!) in meiner Client-Anwendung.

Das Datenmodell ist immer nur ein Denkmodell, das der Konstruktion der Daten dient. Sowas wie FOREIGNKEY findest Du nur in der DDL. In der DML tauchen nur Tabellen und Spalten auf.

Wenn ich mittels dem db-Admin tool, oder im CREATE table
Anweisung mit references tabelle(primkey) arbeite

Das ist die Vorbereitung für das Prüfen der referentiellen Integrität durch die DB.

noch beim Eintragen einer Relation. Ich
muss immer selbst in die entsprechenden Tabellen schreiben.

Wiederum: Wer sonst? Die DB bietet den Service, die Bezüge zu prüfen.

Gruß Ralf

hi Du,
danke.
Ich hab da was gefunden. Schlüsselbegriffe sind persistence frameworks.
Auf der Seite: http://www.odbms.org/downloads.aspx
unter der Kategorie „Great lecture notes and script on object persistence and ODBMS.“ wird darauf eingegangen. Die Applikation (client) spricht mit den Methoden der verwendeten Klassen. Und diese Methoden setzen dann tatsächlich um, dass etwas in eine Datenbank geschrieben wird. Diese Methoden wissen wo und wann sie welche Daten mit insert statements reinschreiben müsse. Nach außen (durch die public-methoden geben diese Klassen der Anwendung die Schnittstelle zum Datenmodell.
nochmals danke und Grüße
Denis

Hi!

Ich glaube, Du vermischt hier objektorientierte und relationale Datenbanksysteme.

Du entwickelst objektorientiert, befüllst aber eine relationale Datenbank.

Welche und wieviele Schichten Du da benutzt bzw. selber entwickelst, ist alleine Dir überlassen.

Du kannst Dir beispielsweise bereits auf Datenbankebene selber diese Schicht entwickeln, in dem Du nicht mehr per DML, sondern nur mehr prozedural zugreifst: Du greifst nicht mehr direkt auf die Tabellen zu, sondern nur mehr (grob) über get und set.
Damit schaffst du eine Schicht, sodaß niemand mehr irgendetwas über die DB wissen muß, um damit zu arbeiten und somit die Applikation vollkommen von der DB gelöst ist.

Du kannst Dir aber auch erst bzw. schon ganz nahe beim Client diese Schicht „einziehen“.

Meine Meinung? Es zahlt sich nicht aus, der Entwicklungsoverhead frißt Dich auf …

Grüße,
Tomh

PS: Oder ich habe Dich grundsätzlich mißverstanden …

Ganz recht.

Wenn du es geschickt machst, dann kannst du die Datenbankanbindung und den Client voneinander getrennt entwickeln und diese reden dann nur via Interface miteinander.
Ich habe früher auch mal nach dem View-ViewModel-DataModel Template gearbeitet.
Aufbau wie folgt:
View ist die reine Anzeige (wie die Daten dem User präsentiert werden, bzw. wie dieser Daten eingibt).
ViewModel ist sozusagen die Businesslogik. Also zB getAllCars, saveCar, deleteCar,…
DataModel implementiert jetzt ein Interface, das das ViewModel verwendet. Das Datamodel sagt jetzt, wie und wo die Daten gespeichert werden (gehen die Daten in eine Datenbank, werden sie in Textfiles gespeichert, in XML-Files persistiert oder nur im Hauptspeicher gehalten,…).

Das geht sogar soweit, dass das ViewModel optimalerweise nicht einmal die selben Klassen verwendet, wie das Datamodel.

lg Phylanx