-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 6 posts ] 
Author Message
 Post subject: Daten in zwei Tabellen aufteilen
PostPosted: Tue Jun 07, 2011 1:07 pm 
Regular
Regular

Joined: Fri Feb 09, 2007 3:47 pm
Posts: 56
Hi,

ich habe folgendes Problem:

Ich bekomme in einem Objekt mehrere attribute, die in zwei Tabellen aufgeteilt werden sollen.
Dabei besteht zwischen den Attributen eine Many to one Beziehung.

Beispiel:
1. Objekt: name=Hans; value=5
2. Objekt: name=Hans; value=2
3. Objekt: name=Hans; value=10
4. Objekt: name=Peter; value=2
...

Das Attribute "name" soll dabei nur einmal gespeichert werden in Tabelle A mit zusätzlich einem Primärschlüssel.
Die Attribute "value" sollen in Tabelle B gespeichert werden, mit zusätzlichen Fremdschlüssel aus A (Für die Zuordnung ;-)).

Am Ende soll sowas rauskommen:
Tabelle A
1 | Hans
2 | Peter

Tabelle B
1 | 5
1 | 2
1 | 10
2 | 2

Mein momentaner Ansatz ist, dass ich zwei POJOs für Tabelle A und Tabelle B erstellt habe. In Tabelle B existiert eine @ManyToOne Beziehung auf Tabelle A.

Das Problem ist nun, dass ich die zusammengesetzten Objekte bekomme, und diese erstmal in die zwei POJOs für Tabelle A und Tabelle B aufteile und diese dann speichere.
Leider bekomme ich in Tabelle A dann 3 mal "Hans" rein, mit unterschiedlichen Primärschlüssel.

Eine Möglichkeit dies zu umgehen (die mir so eingefallen sind), ist zu schauen ob "Hans" schon existiert (entweder über DB abfrage, oder ich speichere mir die erstellten Objekte und mache ein Lookup nach "Hans"). Leider sind beide Ansätze sehr ineffizient (entweder Anfrage an DB stellen (zeitlich) oder hohen Speicherverbrauch, da Objekte zwischen gespeichert werden; Daten bestehen nicht nur aus name in Tabelle A).

Gibt es eine effiziente Möglichkeit dieses Problem mit Hibernate zu lösen?

Vielen Dank schon mal.


Top
 Profile  
 
 Post subject: Re: Daten in zwei Tabellen aufteilen
PostPosted: Wed Jun 08, 2011 1:08 pm 
Newbie

Joined: Wed Jun 08, 2011 12:50 pm
Posts: 8
Location: Germany
Hi,

also wenn ich Dich richtig verstanden habe fragst Du Dich ob Du immer neue Datensätze hinzufügen oder die bestehenden updaten sollst.

Alternative A ist beim Schreiben schneller und verbraucht mehr Speicherplatz (weniger Zeilen in der Tabelle).
Alternative B ist beim Schreiben langsamer und verbraucht weniger Speicherplatz (mehr Zeilen in der Tabelle).

Eine weitere Alternative wäre die Tabellen alle in einer Tabelle zu speichern.
Dazu müsstest Du einfach nur die Zahlen als String speichern, und beim Zugriff wieder umwandeln.
Dann würdest Du einen Join sparen.


Top
 Profile  
 
 Post subject: Re: Daten in zwei Tabellen aufteilen
PostPosted: Wed Jun 08, 2011 7:53 pm 
Regular
Regular

Joined: Fri Feb 09, 2007 3:47 pm
Posts: 56
Hi,
danke für deine Antwort.

Habe mich wohl ein bisschen falsch ausgedrückt. Meine oben beschriebenen Tabellen sind nur ein einfaches Beispiel. In Tabelle A und B exisitieren noch einige weitere Spalten, die die Datenmenge sehr schnell wächsen lässt.

Ich bekomme ein Objekt mit den Daten für Tabelle A und Tabelle B. Wegen Redundanz soll das Attribute "name" in A gespeichert werden und die zugehörigen Werte in Tabelle B.
In den Daten die ich bekomme, ist das Attribute "name" redundant. Daher die ManyToOne Relation.

Momentan erstelle ich aus den bekommen Daten jeweils ein Objekt für Tabelle A und Tabelle B. Und füge diese dann in die Datenbank ein.
Dadurch dass ich immer wieder ein neues Objekt für Tabelle A erstelle, fügt er dieses auch wieder ein.
Ich möchte aber, dass z.B. nur einmal "Hans" in der Tabelle A auftaucht, auch wenn ich ein neu erstelltes Objekt mit "Hans" hinzufüge, aber dieses Objekt auch in Objekt von Tabelle B legen kann, damit die IDs richtig gesetzt werden. (Sehr verwirrend geschrieben *sry*, Beispielcode gibt es unten)

Im Grunde suche ich momentan eine Lösung, um die Daten die ich bekomme in zwei Tabellen aufzuteilen. Aber zwischen den Tabellen besteht keine 1 zu 1 Beziehung.

Wäre auch Denkbar, dass ich nur ein Objekt erstelle, dass ich persistieren möchte, aber dieses in zwei Tabellen aufteile. Nur hat dies auch nicht so geklappt, wie ich es mir vorstelle.

Meinen Ansatz kann auch gerne verworfen werden und anders angegangen werden. Das Ziel ist es nur, in dieses Datenbank-Schema die Daten zu bekommen und das möglichst effizient!

Klar könnte ich jedes mal bevor ich für Tabelle A ein neues Objekt erstelle, in der DB nachschauen, aber dies kommt mir sehr ineffizient vor. Daher suche ich noch eine andere Möglichkeit.

Ein bisschen Beispiel-Code noch, um mein Problem zu verdeutlichen:
Objekt A:
Code:
@Entity
public class A {
   @Id
   @GeneratedValue
   int id;

   int name;

   // Constructor, getter and setter ...
}


Objekt B:
Code:
@Entity
public class B {
   @Id
   @GeneratedValue
   int id;

   @ManyToOne
   @JoinColumn(name = "aID")
   A a;

   int value;

   // Constructor, getter and setter ...
}


in der main:
Code:
A a1 = new A("Hans");
B b1 = new B(8, a1);
session.save(a1);
session.save(b1);

A a2 = new A("Hans");
B b2 = new B(2, a2);
session.save(a2);
session.save(b2);



Was ich gerne hätte ist, dass "Hans" einmal in Tabelle A auftaucht und zwei Einträge in Tabelle B mit dem richtigen Fremdschlüssel auf "Hans" existieren.
Ich bekomme aber zwei Einträge mit "Hans" in Tabelle A und zwei Einträge in Tabelle B die auf unterschiedliche Einträge in Tabelle A verweisen.


Top
 Profile  
 
 Post subject: Re: Daten in zwei Tabellen aufteilen
PostPosted: Thu Jun 09, 2011 1:10 am 
Newbie

Joined: Wed Jun 08, 2011 12:50 pm
Posts: 8
Location: Germany
Hi,

also A steht zu B in einer n-1-Beziehung.
Wenn Du also einen bestehenden Eintrag in B referenzieren willst, kommst Du um ein SELECT vor dem INSERT nicht herum.
Wie soll sonst der Wert für den Fremdschlüssel festgelegt werden?
Aber es ist ja nur ein einfaches SELECT vor einem INSERT.
Da würde ich mir über Performance keine Gedanken machen.


Top
 Profile  
 
 Post subject: Re: Daten in zwei Tabellen aufteilen
PostPosted: Thu Jun 09, 2011 3:27 am 
Expert
Expert

Joined: Thu Jan 08, 2009 6:16 am
Posts: 661
Location: Germany
Ich würde den Namen zum Primary Key machen, wenn er der Identifier ist. Dann übernimmt Hibernate die Entscheidung, ob Insert oder Update. Dennoch kommst du über ein vorheriges Select nicht drumherum, woher willst du denn sonst wissen, ob "Hans" schon in der Datenbank ist. Machst du den Namen zum PK hast du wenigstens aber nur ein select pro Session, da das Objekt danach ja im First Level Cache ist.

Weitere Performance-Optimierungen müsste man sehr Usecase-bezogen machen.

_________________
-----------------
Need advanced help? http://www.viada.eu


Top
 Profile  
 
 Post subject: Re: Daten in zwei Tabellen aufteilen
PostPosted: Thu Jun 09, 2011 3:56 pm 
Regular
Regular

Joined: Fri Feb 09, 2007 3:47 pm
Posts: 56
Hi,
vielen danke für eure Antworten.

Ok, dann werde ich wohl um ein Select nicht rum kommen.
Hatte gedacht, dass es in Hibernate eine optimierte Lösung gäbe, um sowas geschickter und einfacher in die Datenbank zu bekommen.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 6 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.