Datenstruktur gesucht

Status
Nicht offen für weitere Antworten.
T

tuxedo

Gast
Hallo,

ich hab mal ne kleine Designfrage...
Ich plane ein kleines Tool zum verwalten von Vereinsmitgliedern und deren Bankverbindungen für die jährlichen Mitgliedsbeiträge. Ich hab jetzt hin und her überlegt, bin aber auf keinen grünen Zweig bzgl. der Datenstruktur gekommen. Speichern will ich die Daten in einer Postgres-DB. Soweit kein Problem. Anbindung erfolgt über iBatis mit entsprechendem JDBC-Treiber. Auch kein Problem. Aber ich hab noch keinen Schimmer wie ich meine Datenstruktur in der DB und auf der Java-Seite (von iBatis aus gesehen) aufbaue.

Gehen wir mal davon aus dass jedes Mitglied eine Bankverbindung hat und jeder seinen Beitrag selbst zahlt. Dann würde ich die Struktur wie folgt wählen:

Code:
[Mitglied]
* Mitglied-ID
* Kontaktdaten
* Beitrag-ID (hier wird ein Beitrag referenziert)
* Bankverbindung

[Beitrag]
* Beitrag-ID
* Art
* Betrag

Okay. Das ist noch easy. Damit kann ich eindeutig eine Liste mit Bankverbindungen ein Beiträge zum einziehen der Mitgliedsbeiträge erzeugen.

Jetzt hab ich aber den Fall dass es auch Familienbeiträge gibt:
- Einer Familie gehören bestimmte Mitglieder an.
- Die Familie zahlt zusammen einen Beitrag
- Es gibt pro Familie genau eine Bankverbindung

Hmm, ich hab's bis jetzt so gemacht:

Code:
[Mitglied]
* Mitglied-ID
* Kontaktdaten
* Beitrag-ID (hier wird ein Beitrag referenziert)
* Familie-ID (hier wird eine Familie referenziert)
* Konto-ID (hier wird eine Bankverbindung referenziert)

[Beitrag]
* Beitrag-ID
* Art
* Betrag

[Konto]
* Konto-ID
* Kontonummer
* BLZ
* Inhaber

[Familie]
* Familie-ID
* Name der Familie
* Elternteil_1 (hier wird eine Mitglied-ID referenziert)
* Elternteil_2 (hier wird eine Mitglied-ID referenziert)
* Beitrag-ID (hier wird ein Beitrag referenziert)
* Konto-ID (hier wird eine Bankverbindung referenziert)

Ich finde die Lösung nicht "optimal". Grund: Ob "Einzelmitglied" oder "Familienmitglied" geht nur aus der Konstellation der

Code:
* Beitrag-ID
* Familie-ID
* Konto-ID

Felder des Mitglieds hervor. Zudem hab ich an mehreren Stellen Beitrag und Bankverbindung referenziert. Wird die Konstelation dieser 3 Felder "verwurschtelt" stimmt gar nix mehr.

Mir kommt's so vor als ob ich mittlerweile den Walt vor lauter Bäumen nicht mehr sehe. Was ich letztendlich haben will ist eine Struktur die in sich schlüssig und eindeutig ist. Aber vielleicht hat ja jemand von euch nen anderen Blick auf die Sache und kommt auf ne bessere Lösung.


Gruß
Alex
 

Ariol

Top Contributor
Was hältst du davon?
Code:
[interface Beitragszahler]//Evtl abstrakte Klasse
*BeitragID
*Art
*Betrag
*KontoID
*Kontaktdaten

[Mitglied extends Beitragszahler]
*MitgliedID
*Mitgliedsname

[Familie extends Beitragszahler]
*Familienmitglieder (Liste)
*Familienname

[Verwaltung]
*Mitglieder (Liste)
 
T

tuxedo

Gast
@DocRandom
Der erste war ja auch nur eine "heranführung" an das Thema.

Der "zweite" Vorschlag ist bis jetzt auch mein einzigster. Die Frage ist: Gibts nicht noch eine bessere, konsistentere Lösung?
Mich stört unheimlich dass ich von der Konstellation der 3 Felder abhängig bin.

Problem ist ja eigentlich nur, dass ich in 2 Tabellen Beiträge und Bankverbindungen habe.

@Ariol

Bin mir nicht sicher ob ich das so auf SQL abgebildet bekomme.
Aber ja, du hast recht. Der gemeinsame "Nenner" zwischen Mitglied und Familie ist "Beitragszahler". Muss da mal drüber nachdenken ob ich damit was "kreieren" (schreibt man das so?) kann.

[update]
Ariol's IDee hat mich auf folgende Idee gebracht:

Code:
[Mitglied]
* Mitglied-ID
* Kontaktdaten
* Familie-ID (hier wird eine Familie referenziert, wenn Einzelmitglied dann Wert: -1)

[Beitrag]
* Beitrag-ID
* Art
* Betrag

[Konto]
* Konto-ID
* Kontonummer
* BLZ
* Inhaber

[Familie]
* Familie-ID
* Name der Familie
* Elternteil_1 (hier wird eine Mitglied-ID referenziert)
* Elternteil_2 (hier wird eine Mitglied-ID referenziert)

[Beitragszahler_Einzel]
* Mitglied-ID
* Bank-ID
* Beitrag-ID

[Beitragszahler_Familie]
* Familie-ID
* Bank-ID
* Beitrag-ID

Allerdings hätte ich dann zwei Tabellen die ich abklappern müsste. Dafür hätte ich in nur einer Tabelle/Objekt (Mitglied) ein "Sonderfeld" (Familie-ID) statt drei.
 

Ariol

Top Contributor
Ich hab bei Familien noch die FamilienID vergessen.

Evtl. könntest du eine Tabelle "Mitglieder" anlegen, die dann eine Referenz auf Familie hat...also eigentlich dein erstes Konzept.
Mein Beispiel sollte nur eine andere Art der Auswertung dastellen.

alex0801 hat gesagt.:
"kreieren" (schreibt man das so?)
Jop, tut man ;)
 

DocRandom

Top Contributor
Problem ist ja eigentlich nur, dass ich in 2 Tabellen Beiträge und Bankverbindungen habe.
Problem?
Warum normalisierst Du nicht Deine Tabellenstruktur?
Je besser das Tabellendesign, desto leichter die Umsetzung!

lg
DocRandom
 
T

tuxedo

Gast
@DocRandom:

Genau da liegt ja der Hund begraben. Ich hab keinen richtigen Schimmer wie ich das "gerade gebogen" bekomme.

Normalisierung ist einfacher gesagt als getan. Ich schau schon seit Tagen auf die StrukturThematik und komme eben auf keinen grünen Zweig.

Meine Idee im 1. Beitrag wäre ja schon ein wenig "normalisiert". Aber ich hab das Problem dass ich 3 Felder "überwachen" muss um sagen zu können: Der Datensatz ist gültig oder der Datensatz ist ungültig.

Beispiel für Einzelmitglied
Beitrag-ID: irgendwas >= 0
Familie-ID: -1
Konto-ID: irgendwas >= 0

Beispiel für Familienmitglied:
Beitrag-ID: -1
Familie-ID: irgendwas >0 0
Konto-ID: -1


Ein ungültiger Datensatz wäre z.B.

Beitrag-ID: -1
Familie-ID: -1
Konto-ID: -1

oder auch

Beitrag-ID: irgendwas >0 0
Familie-ID: irgendwas >0 0
Konto-ID: -1

etc. etc. etc.
 

DocRandom

Top Contributor
Hi Alex!

Nach gründlicher Überlegeung Deiner Darstellungen bin ich zu folgendem Ansatz gekommen:

Ein Mitglied wird kaum mehrere Konten zur Abbuchung bekannt geben, ergo kommen die KTO-Daten zur Mitgliedertabelle:
Code:
[Mitglied]
* ID
* Personaldaten (Name, Alter, Geschlecht, etc)
* Kontaktdaten (Wohnadresse, telefon, etc)
* KTO-Daten (BLZ, KTO-NR, etc)

Weiters würde ich keine Unterscheidung zwischen Single und Familie treffen, sonder auch Einzelpersonen als Familie betrachten.
Code:
[Familie]
* ID
* Name/Bezeichnung
* Elternteil 1 ( Referiert auf alle Fälle auf ein Mitglied) 
* Elternteil 2 ( Im Singlefall steht da eben 0 oder was auch immer)
Beitrag bleibt wie schon von Dir beschrieben:
Code:
[Beitrag]
* ID
* Art
* Betrag

Und als Referenztabelle ergibt sich:
Code:
[Einzahler]
* ID (lfd. Nummer)
* Familien-ID
* Beitrags-ID

lg
DocRandom
 
T

tuxedo

Gast
Hmm, mal überlegen:

>> Weiters würde ich keine Unterscheidung zwischen Single und Familie treffen, sonder auch Einzelpersonen als Familie betrachten.

Diese Unterscheidung hatte ich eingeführt weil:

- Einzelmitglied hat SEINE Bankverbindung
- Familienmitglied hat eine GEMEINSAME Bankverbindung

Wenn ich ein Einzelmitglied nach deinem Vorschlag als FAMILIE eintrage: Wie unterscheide ich dann Einzelmitglied von Familie? Dann hätte ich nur noch Familien die unterschiedliche Beiträge zahlen. Das ist ja nicht im Sinne des "Familienbeitrag-Erfinders".

UND ich hätte irgendwie doppelte Daten wenn ein Einzelmitglied auch ein Eintrag in einer Familientabelle hat. Ich könnte dann genausogut die ganzen Familiendaten mit in die Mitgliedertabelle stecken.

So ganz "sauber" ist die Lösung auch nicht, oder?

- Alex
 

DocRandom

Top Contributor
Bist Du Dir sicher das Familienmitglieder immer gemeinsame Bankkonten haben?
(schnell zu meine Frau laufe und nach dem gemeinsamen Konto frage ;P)

Wenn ich ein Einzelmitglied nach deinem Vorschlag als FAMILIE eintrage: Wie unterscheide ich dann Einzelmitglied von Familie? Dann hätte ich nur noch Familien die unterschiedliche Beiträge zahlen. Das ist ja nicht im Sinne des "Familienbeitrag-Erfinders".
Die Unterscheidung findest Du beim Elternteil 2, ist der auf 0 oder -1 (nur bitte kein NULL), dann ist die Familie ein Singlebestand.

Und ob die Lösung sauber ist, oder nicht, bleibt Dir überlassen, ist ja nur ein Vorschlag.

lg
DocRandom
 

VuuRWerK

Aktives Mitglied
Was sagst Du zu folgendem Vorschlag?

Code:
Mitglied {
    id,
    Kontaktdaten
}

-- Familie ist ein, erweitertes, Mitglied
Familie {
    id,
    Name
}

-- Verbindungstabelle für Mitglieder und Familien
FamilieMitglied {
    id,
    Mitglied-Id,
    Familie-Id
}

Beitrag {
    id,
    Art,
    Betrag
}

-- Verbindungstabelle für Mitglieder und deren Beiträge
MitgliedBeitrag {
    id,
    Mitglied-Id,
    Beitrag-Id
}

Kontodaten {
    id,
    Mitglied-Id, -- Hier kann ein Mitglied, eine Familie oder ein FamilieMitglied referenziert werden
    Kontonummer,
    Bankleitzahl,
    Name-Kreditinstitut
}

Bei der Umsetzung muss man dann nur beachten das FamilieMitglied ein Mitglied ist welches aus beliebig vielen Mitgliedern und einer Familie besteht.

Das wäre mein Vorschlag, so kannst Du aufjedenfall Null-Marken verhindern und Redundanz vermeiden.

Gut Schuß
VuuRWerK ;)
 
T

tuxedo

Gast
Das mit dem Single-oder nicht:

Was ist mit Alleinerziehenden Müttern mit 2 Kindern? Das wäre auch eine Familie mit nur einem Elternteil.

Bzgl. des Kontos:

Wie das Konto der Familie arrangiert ist (gemeinsames Konto oder sonstwie) ist ja schnuppe. Wichtig ist nur, dass pro Familie nur ein Konto da ist von dem die Beiträge eingezogen werden. Ob das also das Konto der Frau, des Mannes, oder beider ist, ist ja egal. Hauptsache es gibt nur eins im System.

- Alex
 

byte

Top Contributor
Ich finde Deine Herangehensweise falsch. Warum fängst Du mit dem DB-Schema an? Das schränkt Dich in der Denkweise doch nur ein, weil Datenbankmodelle einfach veraltet sind. Natürlich braucht man sie, aber sie sollten nicht der Mittelpunkt des Entwurfs sein.
Ich würde definitiv mit dem Domänenmodell in Form des Java-Klassenentwurfs beginnen. Java bietet Dir da viel bessere Möglichkeiten und ausserdem programmierst Du dort am Ende auch die Businesslogik. Dabei würde ich mir noch überhaupt keine Gedanken über das DB-Schema machen.
Wenn das Java-Klassenmodell steht, dann überlegst Du Dir das Mapping auf die Datenbank. Kenne mich mit iBatis nicht aus, aber mit Hibernate geht das sehr komfortabel. Du definierst das Mapping per Annoations direkt in Deinem Domänenmodell und Hibernate generiert Dir daraus das Datenbankschema und legt die Tabellen an.
 
M

maki

Gast
Muss byto da zustimmen.
Für so etwas wäre imho Hibernate/JPA zu bevorzugen, dann könnte man auch Vererbungshierarchien abbilden ;)
 
T

tuxedo

Gast
Du hast meinen ersten Post nicht aufmerksam genug gelesen. Mir geht's nicht um die Struktur in der DB (nicht nur...ist scheinbar nicht so toll rübergekommen). Wenn ich das Gedankenmodell, wie was voneinander abhängt raus hab, dann kann ich das auch leicht selbst auf die DB mappen.

Die angedachte "Mitglied" Tabelle kannst du ja auch als Mitglied-Objekt betrachten. Gleiches für Familie, Beitrag und Konto.
Statt den IDs nimmst du dann halt Referenzen. Ist doch alles das gleiche.

Wenn ich also wüsste wie ich's in Java abbilde (ohne jetzt viel Logik mit rein zu stecken um die "Probleme" mit den unzulässigen Referenzkonstellationen aufzulösen), dann krieg ich's auch in der DB hin.

- Alex
 
T

tuxedo

Gast
Tapete hin oder her, ich bin auf der Suche nach einer Struktur. Ob ich jetzt in Java referenziere oder in SQL eine ID für die Verknüpfung verwendet ist doch Schnuppe.

Vielleicht komm ich ja besser auf den Trichter wenn ich's versuche mit UML abzubilden...

- Alex
 

byte

Top Contributor
alex0801 hat gesagt.:
Tapete hin oder her, ich bin auf der Suche nach einer Struktur. Ob ich jetzt in Java referenziere oder in SQL eine ID für die Verknüpfung verwendet ist doch Schnuppe.
Die OOP bietet aber viel mehr als Referenzen (Stichwort: Interfaces, Vererbung, Polymorphie, ...). Dafür sind die Objekte und ihre Schnittstellen relevant und keine Assoziationen zwischen Datensätzen. Mir fallen auch spontan mehrere Entwurfsmuster ein, die man hier anwenden könnte.


Edit:

Ich würde sowohl Mitglied, Beitrag als auch Konto abstrakt bzw. als Interface definieren. Dann bist Du flexibel und kannst verschiedene Implementierungen bereitstellen. Mitglied könnte z.B. als Composite definiert sein. Dann können Mitglieder entweder als Einzelperson auftreten oder als Gruppe verschiedener Personen (also als Familie).
Nun könntest Du weiter überlegen und feststellen, dass der Beitrag ja in Abhängigkeit zum konkreten Mitglied steht (Einzelperson zahlt sicher weniger als Familie). Also könntest Du auch hier verschiedene Implementierungen bereitstellen und dann mit Hilfe einer Abstract Factory sicherstellen, dass die richtigen Mitglieder auch die richtigen Beiträge zahlen.
 
T

tuxedo

Gast
byto hat gesagt.:
alex0801 hat gesagt.:
Tapete hin oder her, ich bin auf der Suche nach einer Struktur. Ob ich jetzt in Java referenziere oder in SQL eine ID für die Verknüpfung verwendet ist doch Schnuppe.
Die OOP bietet aber viel mehr als Referenzen (Stichwort: Interfaces, Vererbung, Polymorphie, ...).

Ja, das ist mir auch klar. Aber man kann's ja auch "simpel" halten. Ein weg findet sich immer.

Werde mir deinen Tipp mal durch den Kopf gehen lassen.

-Alex
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Collections Datenstruktur gesucht Allgemeine Java-Themen 12
N Datenstruktur für Netze gesucht Allgemeine Java-Themen 8
G Datenstruktur gesucht: Allgemeine Java-Themen 3
M Eigene Datenstruktur um eine Menge zu speichern Allgemeine Java-Themen 3
Kirby.exe Union Find Datenstruktur Allgemeine Java-Themen 27
U Klassen Komplexe Datenstruktur in Java Allgemeine Java-Themen 4
J Datenstruktur für eine Map erstellen Allgemeine Java-Themen 2
B Suche geeignete Datenstruktur Allgemeine Java-Themen 5
ruutaiokwu datenstruktur welche sich "im kreis" dreht Allgemeine Java-Themen 26
P Große Datenstruktur im Speicher halten Allgemeine Java-Themen 13
B Suche passende Datenstruktur für 2 Einträge Allgemeine Java-Themen 19
G Welche Datenstruktur? Allgemeine Java-Themen 19
D Datenstruktur für Hierarchie/Baum mit Tiefe 3 Allgemeine Java-Themen 8
D Datenstruktur .. BlockingQueue (LIFO) Allgemeine Java-Themen 3
P Suche Datenstruktur Allgemeine Java-Themen 2
S Welche Datenstruktur für verschiedene Sprachen sinnvoll? Allgemeine Java-Themen 2
ruutaiokwu schnelle datenstruktur... Allgemeine Java-Themen 13
S Baumstruktur/Datenstruktur in Datei speichern Allgemeine Java-Themen 23
D Datenstruktur Allgemeine Java-Themen 2
B Datenstruktur: Liste Allgemeine Java-Themen 5
A Thread sichere Datenstruktur Allgemeine Java-Themen 5
J Arrayähnliche Datenstruktur Allgemeine Java-Themen 4
B Script Problem "Dynamische Datenstruktur" Allgemeine Java-Themen 13
S Frage zum Design der Datenstruktur Allgemeine Java-Themen 10
G Datenstruktur: LISTEN Allgemeine Java-Themen 7
D Suche nach passender Datenstruktur Allgemeine Java-Themen 4
G Daten von Excel kopieren - sinnvolle Datenstruktur? Allgemeine Java-Themen 3
U eigene Datenstruktur ArrayList<String> nach Object [][ Allgemeine Java-Themen 2
F welche Datenstruktur? Allgemeine Java-Themen 9
F Welche Datenstruktur Allgemeine Java-Themen 2
T Datenstruktur für großes Netz Allgemeine Java-Themen 2
Z Welche Datenstruktur verwende ich h_ier bloss ? Allgemeine Java-Themen 14
G NullPointer. in einer Datenstruktur Allgemeine Java-Themen 2
S Welche Datenstruktur passt bei mir? Allgemeine Java-Themen 6
H Speicheverbrauch einer Datenstruktur ermitteln Allgemeine Java-Themen 29
S Suche geeignete Datenstruktur Allgemeine Java-Themen 27
S Datenstruktur für einen Baum Allgemeine Java-Themen 5
D Welche Datenstruktur? Allgemeine Java-Themen 2
T Datenstruktur für Straße ! Allgemeine Java-Themen 5
B Datenstruktur elegant zerlegen Allgemeine Java-Themen 6
A Datenstruktur und Sortierung Allgemeine Java-Themen 12
Peterw73 Hilfe bei Java gesucht Allgemeine Java-Themen 3
N Java API für CardDav und CalDav gesucht Allgemeine Java-Themen 4
B OCR Library gesucht Allgemeine Java-Themen 6
V Javalehrer gesucht Allgemeine Java-Themen 2
K Java-Forum gesucht Allgemeine Java-Themen 12
O Best Practice Hilfe bei Algorithmus gesucht Allgemeine Java-Themen 10
A Hilfe gesucht Allgemeine Java-Themen 44
N Schulung zu Tomcat/JSP/Struts gesucht Allgemeine Java-Themen 0
E Gewollte Endlosschleife unterbrechen oder Alternative gesucht Allgemeine Java-Themen 2
S API gesucht Allgemeine Java-Themen 3
O Freies Tool zum Jar-File obfuscaten gesucht! Allgemeine Java-Themen 5
Londi DJ MP3 Lib gesucht Allgemeine Java-Themen 0
I Dringend nachhilfe in programmieren gesucht!!!!!!!! Allgemeine Java-Themen 1
I Dringend nachhilfe in programmieren in mannheim gesucht!!!!! Allgemeine Java-Themen 3
L Lib gesucht: Java-Objekte mit JSON Allgemeine Java-Themen 2
J Kalenderwecker gesucht Allgemeine Java-Themen 2
D Kuriose Geschichte -> Antwort gesucht Allgemeine Java-Themen 4
O Tag Cloud Algorithmus Idee gesucht Allgemeine Java-Themen 2
S Java XTools gesucht Allgemeine Java-Themen 2
N Boolsche Algebra via eval vereinfachen -> Ausmultiplizieren gesucht Allgemeine Java-Themen 15
E Nachhilfe in Java gesucht!!! Allgemeine Java-Themen 3
H Graph-Algorithmus gesucht Allgemeine Java-Themen 21
B Dringend Hilfe gesucht für Struktogramm Allgemeine Java-Themen 11
N Liste gesucht Allgemeine Java-Themen 2
Guybrush Threepwood Pattern gesucht: Punkt ohne Leerzeichen dahinter Allgemeine Java-Themen 3
B IRC-Library Gesucht Allgemeine Java-Themen 2
T Projektthema gesucht Allgemeine Java-Themen 2
c_sidi90 Aufgaben für Einstellungstest (Azubicasting) gesucht Allgemeine Java-Themen 10
M WebFramework für Userhandling gesucht Allgemeine Java-Themen 7
E Dezimalzahl -> Hexadezimalzahl [Lösungsweg gesucht] Allgemeine Java-Themen 2
M Funktion gesucht: Text vektorisieren Allgemeine Java-Themen 20
J Algorithmus gesucht (Stringtransformation) Allgemeine Java-Themen 4
P JFormattedTextField für durch Semikolon getrennte Integer-Werte gesucht / Regulärer Ausdruck Allgemeine Java-Themen 3
alex_fairytail IT-Kleinprojekt: Ideen gesucht! Allgemeine Java-Themen 18
B TypeOf oder ähnliches gesucht Allgemeine Java-Themen 3
A Bibliothek für NP-harte Zuordnung gesucht. Allgemeine Java-Themen 7
E Super erzwingen, konzept/pattern gesucht. Allgemeine Java-Themen 8
T Passende Listenstruktur gesucht Allgemeine Java-Themen 5
S Webstart: vollständige JNLP-Doku. gesucht Allgemeine Java-Themen 4
S Meinung zu Programmidee gesucht Allgemeine Java-Themen 9
Guybrush Threepwood Neuronale Netzwerke - Bibliothek gesucht Allgemeine Java-Themen 3
agentone Graphen-Lib gesucht Allgemeine Java-Themen 7
Ark Name für Funktion gesucht Allgemeine Java-Themen 5
F Spam-Mail-Programm gesucht Allgemeine Java-Themen 11
S JKL - Bibiliothek gesucht ? Allgemeine Java-Themen 9
hdi Beispiel für EDT Violations gesucht Allgemeine Java-Themen 4
J Open Source Projekt anbieten - Leitfaden gesucht Allgemeine Java-Themen 3
E Mehrfacher vererbungsersatz gesucht. Allgemeine Java-Themen 9
F Passende Struktur gesucht Allgemeine Java-Themen 6
A Regex gesucht Allgemeine Java-Themen 9
J Parser / Scanner / Tokenizer gesucht Allgemeine Java-Themen 3
V DecimalformatPattern gesucht Allgemeine Java-Themen 4
as182005 Bibliothek für Graph Visualisierung gesucht Allgemeine Java-Themen 3
H Framework empfehlung / gute Anfängerbeispiele gesucht Allgemeine Java-Themen 12
M Texteditor gesucht Allgemeine Java-Themen 3
B Effizienter Suchalgorithmus gesucht Allgemeine Java-Themen 10
D design gesucht - Angabe von zu ersetzenden substrings Allgemeine Java-Themen 2
P Java-Security-Aufgabe gesucht Allgemeine Java-Themen 2
J Listener für Ende eines Threads gesucht... Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben