Hallo,
ich bin bei der Entwicklung eines Datenbankmodels auf ein paar Kleinigkeiten gestossen die ich hier mal ansprechen möchte um da den besten Weg herauszufinden. Ich fange dazu mal mit einem einfachen Beispiel an, das auf das für die Problematik notwendige reduziert ist:
Mal angenommen ich habe eine Datenbankstruktur für ein Forum. Ich habe eine Tabelle 'users' mit den Werten 'id' und 'username'. Dann noch eine Tabelle 'posts' mit den Werten 'id', 'user_id', 'text'.
Ich würde dann hingehen und 2 Beans erstellen, eine Bean 'user' mit den Feldern 'id' und 'username', und eine Bean 'post' mit den Feldern 'id', 'user_id' und 'text'. Dann entsprechende Klassen die mir einen User oder Post laden, speichern, updaten, etc können.
Jetzt möchte ich vielleicht eine View haben die mir alle Posts darstellt. Dafür würde ich dann wohl erstmal alle Einträge aus der 'posts' Tabelle laden. Ich hätte dann also eine Collection mit einer Hand voll 'post' Beans.
Die kann ich jetzt theoretisch darstellen, aber ich möchte natürlich zu jedem Posting auch den Usernamen haben, der halt nicht in der 'post' Bean drin ist. Und da gibt es ja jetzt verschiedene Wege das zu realisieren:
- Ich könnte mir zu jeder 'post' Bean auch die entsprechende 'user' Bean laden. Das würde die Zahl der SQL Abfragen verdoppeln, und ich hätte evtl. viel mehr Daten abgerufen als ich brauche. In der Realität hat die Tabelle 'users' evtl. ja wesentlich mehr Felder als hier im Beispiel.
- Ich könnte der 'post' Bean ein Feld Username geben. Ich habe mir den Sourcecode von JForum (http://freshmeat.net/projects/jforum/) heruntergeladen und dort nach dieser Problematik gesucht. Dort gibt es genau diesen Fall, und dort ist es so realisiert das die Post Bean den Usernamen nochmal enthält.
Generell finde ich dieses Vorgehen ganz ok, allerdings entsprechen dann die Beans nicht mehr dem Datenbankmodell. Der Grund, den Usernamen in der 'post' Bean zu haben, liegt nicht in der Datenhaltung, sondern rein in der Anforderung des Views. Wenn ich den Usernamen in die 'post' Bean hole könnte ich auch gleich noch alle anderen Werte aus der User Tabelle in die 'post' Bean holen.
- Mein bisheriges Vorgehen sah immer so aus das ich mich an Beans halte die genau so aussehen wie die zugehörige Tabelle. Jedenfalls fürs schreiben und interne Verarbeiten der Daten. Für diverse Views habe ich separate View Beans für gewisse Anforderungen erstellt die dann evtl. mehr Felder enthalten als die Tabelle selbst. Das ist prinzipiell einfach zu handhaben, hat aber wieder den Nachteil das mehr als eine Klasse auf eine Tabelle zugreift. Aber ich kann mir auch irgendwie nicht vorstellen das man jeglichen Zugriff auf eine Tabelle sinnvoll über eine einzige Klasse kapseln kann. Speziell wenn man Auswertungen über mehrere Tabellen laufen lassen muss um irgendwelche Werte zu erhalten.
Also, wie seht Ihr das? Bin für jeden Denkanstoss dankbar.
Grüsse,
Sven
ich bin bei der Entwicklung eines Datenbankmodels auf ein paar Kleinigkeiten gestossen die ich hier mal ansprechen möchte um da den besten Weg herauszufinden. Ich fange dazu mal mit einem einfachen Beispiel an, das auf das für die Problematik notwendige reduziert ist:
Mal angenommen ich habe eine Datenbankstruktur für ein Forum. Ich habe eine Tabelle 'users' mit den Werten 'id' und 'username'. Dann noch eine Tabelle 'posts' mit den Werten 'id', 'user_id', 'text'.
Ich würde dann hingehen und 2 Beans erstellen, eine Bean 'user' mit den Feldern 'id' und 'username', und eine Bean 'post' mit den Feldern 'id', 'user_id' und 'text'. Dann entsprechende Klassen die mir einen User oder Post laden, speichern, updaten, etc können.
Jetzt möchte ich vielleicht eine View haben die mir alle Posts darstellt. Dafür würde ich dann wohl erstmal alle Einträge aus der 'posts' Tabelle laden. Ich hätte dann also eine Collection mit einer Hand voll 'post' Beans.
Die kann ich jetzt theoretisch darstellen, aber ich möchte natürlich zu jedem Posting auch den Usernamen haben, der halt nicht in der 'post' Bean drin ist. Und da gibt es ja jetzt verschiedene Wege das zu realisieren:
- Ich könnte mir zu jeder 'post' Bean auch die entsprechende 'user' Bean laden. Das würde die Zahl der SQL Abfragen verdoppeln, und ich hätte evtl. viel mehr Daten abgerufen als ich brauche. In der Realität hat die Tabelle 'users' evtl. ja wesentlich mehr Felder als hier im Beispiel.
- Ich könnte der 'post' Bean ein Feld Username geben. Ich habe mir den Sourcecode von JForum (http://freshmeat.net/projects/jforum/) heruntergeladen und dort nach dieser Problematik gesucht. Dort gibt es genau diesen Fall, und dort ist es so realisiert das die Post Bean den Usernamen nochmal enthält.
Generell finde ich dieses Vorgehen ganz ok, allerdings entsprechen dann die Beans nicht mehr dem Datenbankmodell. Der Grund, den Usernamen in der 'post' Bean zu haben, liegt nicht in der Datenhaltung, sondern rein in der Anforderung des Views. Wenn ich den Usernamen in die 'post' Bean hole könnte ich auch gleich noch alle anderen Werte aus der User Tabelle in die 'post' Bean holen.
- Mein bisheriges Vorgehen sah immer so aus das ich mich an Beans halte die genau so aussehen wie die zugehörige Tabelle. Jedenfalls fürs schreiben und interne Verarbeiten der Daten. Für diverse Views habe ich separate View Beans für gewisse Anforderungen erstellt die dann evtl. mehr Felder enthalten als die Tabelle selbst. Das ist prinzipiell einfach zu handhaben, hat aber wieder den Nachteil das mehr als eine Klasse auf eine Tabelle zugreift. Aber ich kann mir auch irgendwie nicht vorstellen das man jeglichen Zugriff auf eine Tabelle sinnvoll über eine einzige Klasse kapseln kann. Speziell wenn man Auswertungen über mehrere Tabellen laufen lassen muss um irgendwelche Werte zu erhalten.
Also, wie seht Ihr das? Bin für jeden Denkanstoss dankbar.
Grüsse,
Sven