JPA Normalisierung

mschlegel

Erfahrenes Mitglied
Hallo miteinander.

Ich lese (besser gesagt google) mich gerade in JPA ein und zu einem Problem kann ich leider keine Information finden.

Ich habe eine Klasse Person und diese besitzt natürlich eine Adresse. In einigen Tutorials wurden die Annotationen @Embedable und @Embedded genutzt was aber nur dazu führt dass in der DB die Adresse als zusätzliche Spalten hinzugefügt wird. Ich möchte das ganze einigermaßen Normalisieren, soll heißen, die Adresse soll in einer eigenen Tabelle stehen. Dazu habe ich aus der dieser einfach eine Entität gemacht.

Java:
@Entity @Table(name = "Address")
public class Address {
	
	private String street;
    private String countryCode;
    private String country;
    private String zip;
    private String city;
 
}
Jetzt würde ich natürlich noch gern die Postleitzahl/Stadt und den Länderkode/Landname normalisieren. Das ganze aber ohne dafür extra weitere Klassen als Entitäten anzulegen. Es müsste doch irgendeine Annotation geben mit der ich die sagen kann dass diese Attribute in eine extra Tabelle ausgelagert werden sollen (wobei plz und länderkode die schlüssel sind)?

Danke.

P.S. muss die Adresse überhaupt als @Entity markiert sein, oder geht das auch irgendwie anders (Denn eine Adresse existiert ja nicht allein in weiter Flur)?
 
Wenn du Adressen in einer eigenen Tabelle haben willst, müssen die @Entity tragen und alles was dazugehört (ID usw). Grundsätzlich würde ich mir allerdings die Frage stellen, was so eine Normalisierung bringt. Adressen auslagern, okay - vorrausgesetzt, es gibt Entitäten, die mehr als eine Adresse referenzieren müssen. Das ganze jetzt aber nochmal aufzudröseln, nur um ein theoretisches Qualitätskriterium zu erfüllen halte ich für zumindest debattierungswürdig. Du erkaufst dir das halt mit nem ordentlichen Performanceverlust durch die nötig werdenden Joins.

Gruß
Ollie
 
Das ganze jetzt aber nochmal aufzudröseln, nur um ein theoretisches Qualitätskriterium zu erfüllen halte ich für zumindest debattierungswürdig. Du erkaufst dir das halt mit nem ordentlichen Performanceverlust durch die nötig werdenden Joins.
Ich bin über diese Frage bei SO gestolpert und die beste Antwort dazu war sehr einleuchtend.

Im moment hat die Person nur eine Adresse, aber ich plane in einer erbenden Klasse noch ein Attribut Rechnungsadresse einzuführen. Daher diese Idee (und wegen der doch sehr einleuchtenden Antwort bei SO).
 
Okay, die Antwort(en) bei SO machen sicher Sinn. Aber 1. will ja niemand absichtlich denormalisieren und 2. führt eine Normalisierung über ein gewisses maß hinaus einfach zu zusätzlicher Komplexität weil die einfach die Anzahl der zu verstehenden Artefakte und Beziehungen steigt. Eine Adresse ist IMHO eine in sich geschlossene Einheit oder Entity im Sinne des DDD. Solang es keine fachlichen Gründe gibt, das weiter aufzudröseln würde ich das auch nicht tun, aber das sind nur meine 0.02€.

Wenn es denn unbedingt sein muss, könntest du halt versuchen mit nested classes zu arbeiten und die zu mappen, dann hast du zumindest kein extra Sourcefile.

Gruß
Ollie
 
Ok, die Frage soweit ist beantwortet. Gut fand ich den Einwand das die Addresse eigentlich insich geschlossen ist (wollte mich demnächst eh mal mehr mit DDD befassen).

Mich würde trotzdem mal interessieren wie groß der Performanceverlust wäre? So einen join hab ich mir eigentlich recht einfach vorgestellt (er nimmt ja erstmal nur die ID-Spalten). Und man solll ja immer erst die kleinere Tabelle (den kleineren Index) zuerst nennen beim ON.
 
Zurück