-->
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.  [ 11 posts ] 
Author Message
 Post subject: Datenbank Denormalisierung
PostPosted: Fri Nov 25, 2005 12:31 pm 
Newbie

Joined: Thu Aug 11, 2005 8:47 am
Posts: 6
Hibernate version:3.1

Hallo,
ich habe folgendes Problem:
Meine Aufgabe liegt darin, das O/R Mappingframework Hibernate auf Performanzengpässe hin zu überprüfen und möglichst effizient einzusetzen. Dabei habe ich (erfolglos) versucht, das Datenbankschema zu denormalisieren, um eine Performanzsteigerung zu erhalten. Konkret sieht das so aus:
Im Objektmodell habe ich ein User, ein Course und ein Assessmentobjekt.
Das Assessmentobjekt verfügt über eine Referenz auf ein Courseobjekt. Ein Courseobjekt kann mehrere Assessmentobjekte über ein Set referenzieren, des Weiteren ist in Course ein Verweis auf das Userobjekt enthalten.
Jetzt stellt sich mir die Frage, ob ich ein Datenbankschema mappen kann, welches in der Tabelle für Assessments eine zusätzliche Spalte mit einem Fremdschlüssel für User hat, ohne dass es diese Assoziation im Objektmodell gibt. (Assessment hat KEINE Referenz zu einem Userobjekt).
Der Grund hierfür wäre eine Optimierung der Anfrage, den User zu finden, der (indem er einen Course angelegt hat) ein bestimmtes Assessment kreiert hat.
Ist so etwas überhaupt möglich?

Mein Mapping sieht im Moment so aus:



Code:
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class
        name="User"
        table="users"
    >
        <id
            name="login"
            column="login"
            type="java.lang.String"
            length="64"
        >
            <generator class="assigned">
            </generator>
        </id>
    </class>

</hibernate-mapping>


Code:
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping
>
    <class
        name="Course"
        table="courses"
    >

        <id
            name="id"
            column="id"
            type="java.lang.Long"
        >
            <generator class="native">
            </generator>
        </id>

        <set
            name="assessments"
            lazy="true"
            inverse="true"
            cascade="all"
            sort="unsorted"
        >

            <key
                column="course"
            >
            </key>

            <one-to-many
                  class="Assessment"
            />

        </set>
       

        <many-to-one
            name="user"
            class="User"
            cascade="none"
            outer-join="auto"
            update="true"
            insert="true"
            column="user"
        />


    </class>

</hibernate-mapping>



Code:
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping
>
    <class
        name="Assessment"
        table="assessments"
    >

        <id
            name="id"
            column="id"
            type="java.lang.Long"
        >
            <generator class="native">
            </generator>
        </id>


        <many-to-one
            name="course"
            class="Course"
            cascade="none"
            outer-join="auto"
            update="true"
            insert="true"
            column="course"
        />


    </class>

</hibernate-mapping>


Für Hilfe oder sonstige Anregungen wäre ich sehr dankbar
Gruß Uli


Top
 Profile  
 
 Post subject:
PostPosted: Fri Nov 25, 2005 12:45 pm 
Hibernate Team
Hibernate Team

Joined: Mon Aug 25, 2003 9:11 pm
Posts: 4592
Location: Switzerland
D.h. du opferst Integritaet der Daten fuer zweifelhaften Performanzvorteil?


Top
 Profile  
 
 Post subject:
PostPosted: Fri Nov 25, 2005 1:40 pm 
Newbie

Joined: Thu Aug 11, 2005 8:47 am
Posts: 6
Meine Aufgabe ist, die Performanz zu Analysieren. Dabei soll ich alle Möglichkeiten (oder zumindest so viele wie möglich) ausschöpfen. Bis jetzt sehen meine Ergebnisse so aus, dass die Performanz umso besser ist, je weniger Anfragen ich (oder Hibernate) an die DB stelle. Dies kann ich auch meist ohne Probleme mit optimierten HQL-Anfragen schaffen, allerdings bin ich dann an das Datenbankschema gebunden. Das heißt, dass ich in obigen Beispiel einen Join mehr habe. Dies mag jetzt in diesem Beispiel absolut keine oder nur wenig Verbesserung bringen, über einen "Navigationspfad" über mehrere Objekte hinweg aber durchaus interessant sein.
Dass Denormalisierung auch Probleme mit sich bringt, ist mir durchaus bewusst. Die Datenintegrität muss dann natürlich auf andere Weise gesichert werden. Aus Deinem Posting nehme ich an, dass Hibernate das (im Moment) noch nicht bietet. Das wäre der nächste Untersuchungspunkt gewesen.
Die Frage ist aber immer noch, ob es überhaupt irgendwie möglich ist.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Nov 25, 2005 2:16 pm 
Hibernate Team
Hibernate Team

Joined: Mon Aug 25, 2003 9:11 pm
Posts: 4592
Location: Switzerland
Mir scheint eher dass du einen "mal probieren"-Ansatz zur Optimierung verwendest. Empfehlenswert ist "SQL Tuning" von O'Reilly.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Nov 25, 2005 4:43 pm 
Expert
Expert

Joined: Tue Oct 05, 2004 9:45 am
Posts: 263
Quote:
Datenintegrität muss dann natürlich auf andere Weise gesichert werden

Ich bin nun weit davon entfernt, ein DB-Spezialist zu sein, aber Datenintegrität anders zu sichern als über die Datenbank halte ich für sehr gefährlich ... bisher ist mir noch nichts begegnet, wo das funktioniert hätte. Früher oder später leidet die Qualität der Daten, was der Performance sicherlich auch nicht zu gute kommt.
Dann lieber über Möglichkeiten des Cachings, SQL-Tuning oder dergleichen nachgedacht.


Top
 Profile  
 
 Post subject:
PostPosted: Sat Nov 26, 2005 5:38 am 
Newbie

Joined: Thu Aug 11, 2005 8:47 am
Posts: 6
Die Untersuchung findet im Rahmen einer Diplomarbeit statt. Dort ist es die Aufgabe, die Performanz von Hibernate (als ausgewähltes Bsp. eines OR Mappingframeworks) zu untersuchen. Dazu betrachte ich mehrere Ansatzpunkte, um die Performanz steigern zu können. Parallel läuft eine zweite Arbeit, die die Performanzsteigerung anhand eines reinen Datenbank Tunings untersucht. Dort wird Denormalisierung verwendet. Da dies eine wohl nicht unübliche (wenn auch zugegebenermaßen gefährliche) Maßnahme ist, möchte ich dies, wenn es überhaupt möglich ist, auch durch ein Mapping umsetzten. Wie die Datenintegrität gesichert werden kann, ist dann ein weitere Punkt, den es aber erst zu Betrachten gilt, wenn diese Maßnahme überhaupt umsetzbar ist. Ob das dann über das Framework direkt oder über die Datenbank etwa durch anlegen von Triggern geschieht, kann dann in einem weiteren Schritt überprüft werden.
Die Frage ist aber weiterhin, ob es durch "reines" Mapping möglich ist, eine Assoziation auf relationaler Ebene zu erstellen, wenn es auf objektorientierter Seite keine Assoziation gibt.


Top
 Profile  
 
 Post subject:
PostPosted: Sat Nov 26, 2005 7:15 am 
Expert
Expert

Joined: Tue Oct 05, 2004 9:45 am
Posts: 263
hmmm ... naja ... ich persönlich finde die Idee, die Performance dadurch zu steigern indem ich die Integrität der Daten gefährde, nicht unbedingt für den richtigen Weg, aber das zu diskutieren ist auch nicht Sinn meiner Antwort ...

Um Deine Frage (aus meiner Sicht) zu beantworten: Jein ;-)

Es zwingt Dich ja keiner auf dem Domain-Model direkt zu arbeiten. Von daher kannst in der Datenbank und was die Mappings angeht "machen was Du willst" und es vor der Anwendung verbergen ... Klar, das ganze will synchronisiert werden, was aber ja durchaus geht.

Alternativ kannst Du den Zugriff auf die Assoziation auf Feld-Ebene modellieren und keine get-/ set- Methoden definieren ... Dann gibt es diese Assoziation zwar, aber man kann nicht so ohne weiteres darauf zugreifen ...

In beiden Fällen musst aber irgendwie dafür sorgen, dass die benötigten Werte richtig gesetzt werden ... dass mus dann die Applikation leisten.

gtx
curio

P.S.: Aber ob sowas einen Design-Preis gewinnt, geschweige denn aus praktischer Sicht Sinn macht, sei mal dahingestellt ... Frage ist, ob man sich da nicht mit Views, Indizes oder dergleichen das Leben nicht ein wenig einfacher macht. Das kann ich aber nicht sagen ...


Top
 Profile  
 
 Post subject:
PostPosted: Sat Nov 26, 2005 7:29 am 
Hibernate Team
Hibernate Team

Joined: Mon Aug 25, 2003 9:11 pm
Posts: 4592
Location: Switzerland
Quote:
Da dies eine wohl nicht unübliche (wenn auch zugegebenermaßen gefährliche) Maßnahme ist, möchte ich dies, wenn es überhaupt möglich ist, auch durch ein Mapping umsetzten.


Das ist aus einem Grund nicht unueblich: fehlendes Wissen der Verantwortlichen. Es ist auf keinen Fall etwas das man lernen geschweige denn anwenden sollte. Aber, ich bin mir sicher dass in dieser Arbeit Dinge wie Query Plan Optimierung nur sporadisch vorkommen werden. Dabei fuellen allein die Grundlagen richtiger Optimierungstechniken Buecher. Wird trotzdem eine gute Note geben... das Gute daran ist dass ich nie arbeitslos werde, weil immer wieder Schrott-Datenbanken zu reparieren sind :)


Top
 Profile  
 
 Post subject:
PostPosted: Sat Nov 26, 2005 7:37 am 
Hibernate Team
Hibernate Team

Joined: Mon Aug 25, 2003 9:11 pm
Posts: 4592
Location: Switzerland
http://dmreview.com/article_sub.cfm?articleId=5251


Top
 Profile  
 
 Post subject:
PostPosted: Sat Nov 26, 2005 8:13 am 
Expert
Expert

Joined: Tue Oct 05, 2004 9:45 am
Posts: 263
@christian
Danke für den Link! Das Buch von Fabian Pascal ist die Tage angekommen und ich muss sagen, ich freue mich darauf .... auf das Du Datenbankstrukturen, die ich vielleicht mal entwickle, nicht reparieren musst ;-)


Top
 Profile  
 
 Post subject:
PostPosted: Sun Nov 27, 2005 5:24 am 
Newbie

Joined: Thu Aug 11, 2005 8:47 am
Posts: 6
christian wrote:
Das ist aus einem Grund nicht unueblich: fehlendes Wissen der Verantwortlichen.

Da sollte man schon ein bisschen differenzierter drauf Blicken. Ist gibt durchaus Anwendungen, bei denen man sich solche Maßnahmen vorstellen kann. Ich denke da so Richtung Data Warehousing und "read only" Datenbanken.
In einer "normalen" Applikation würde ich mit Sicherheit auch darauf verzichten, da ,wie du schon angedeutet hast, die Kosten für den Erhalt der Integrität den Performanzgewinn übertreffen werden. Meine Arbeit ist aber stark theoretisch angesiedelt. Eine "richtige" Anwendung liegt zwar dahinter oder ist der Anlass für die Untersuchung, doch soll ich auch über den Tellerrand hinaus blicken. Von der Idee, Denormalisierung umzusetzen bin ich im übrigen auch nicht begeistert, der Vollständigkeit halber möchte ich es aber dennoch zumindest erwähnt haben.
Danke aber für die Hinweise und den Link, werde ich sicherlich gut für die Bewertung des Ansatzes gebrauchen können :).
Nochmals Danke und Viele Grüße
Uli


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 11 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.