<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Datenbank</title>
        <link>http://andreas.bloggingon.net/category/100.aspx</link>
        <description>Datenbank</description>
        <language>de</language>
        <copyright>EuphoriasChild</copyright>
        <managingEditor>euphoriaschild@hotmail.com</managingEditor>
        <generator>Subtext Version 1.9.5.177</generator>
        <item>
            <title>Nested Views</title>
            <link>http://andreas.bloggingon.net/archive/2005/12/15/nested-views.aspx</link>
            <description>&lt;p&gt;&lt;/p&gt;Mir ist gerade aufgefallen, dass viele einen Trick zur Beschleunigung von Abfragen nicht kennen.&lt;br /&gt;
&lt;br /&gt;
Wenn ich zum Beispiel alle Mitarbeiter der Firma Northwind haben will,
die mehr als 60 Bestellungen haben, mache ich eine Unterabfrage:&lt;br /&gt;
&lt;br /&gt;
&lt;font face="Courier New"&gt;SELECT *&lt;br /&gt;
FROM   dbo.Employees&lt;br /&gt;
WHERE  EmployeeID IN&lt;br /&gt;
(&lt;br /&gt;
    SELECT   EmployeeID&lt;br /&gt;
    FROM     dbo.Orders&lt;br /&gt;
    GROUP BY EmployeeID&lt;br /&gt;
    HAVING   COUNT(OrderID) &amp;gt; 60&lt;br /&gt;
)&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
Diese Art der Abfrage ist jedoch langsamer, als wenn ich zu einem
einfachen Kniff greife. Ich definiere eine Abfrage direkt im Query und
binde sie mit INNER JOIN ein:&lt;br /&gt;
&lt;br /&gt;
&lt;font face="Courier New"&gt;SELECT *&lt;br /&gt;
FROM   dbo.Employees&lt;br /&gt;
INNER JOIN&lt;br /&gt;
(&lt;br /&gt;
    SELECT   EmployeeID&lt;br /&gt;
    FROM     dbo.Orders&lt;br /&gt;
    GROUP BY EmployeeID&lt;br /&gt;
    HAVING   (COUNT(OrderID) &amp;gt; 60)&lt;br /&gt;
) OverSixtyOrders&lt;br /&gt;
ON Employees.EmployeeID = OverSixtyOrders.EmployeeID&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
So umgebaut, ist die Abfrage um einiges schneller. Bislang Eingesetzt
und getestet habe ich das bei SQL Server 2000 und der Jet Engine
(Access)&lt;br /&gt;
&lt;img src="http://andreas.bloggingon.net/aggbug/478.aspx" width="1" height="1" /&gt;</description>
            <guid>http://andreas.bloggingon.net/archive/2005/12/15/nested-views.aspx</guid>
            <pubDate>Thu, 15 Dec 2005 11:48:38 GMT</pubDate>
            <wfw:comment>http://andreas.bloggingon.net/comments/478.aspx</wfw:comment>
            <comments>http://andreas.bloggingon.net/archive/2005/12/15/nested-views.aspx#feedback</comments>
            <wfw:commentRss>http://andreas.bloggingon.net/comments/commentRss/478.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Glaubenskriege sind ja in Mode</title>
            <link>http://andreas.bloggingon.net/archive/2004/12/15/glaubenskriege-sind-ja-in-mode.aspx</link>
            <description>&lt;p&gt;Man stelle sich vor, man bekommt soviel Zeit wie man braucht von
seinem Arbeitgeber, auch finanzielle Mittel für externe Berater stehen
gegebenfalls bereit. Das alles, um die Frage zu klären, auf welcher
Architektur eine geplante und (mittlerweile) sehr komplexe Anwendung
aufbaut, die eine frühere 2 Tier Anwendung Datenbankanwendung beerbt.
Natürlich bekommt man ein paar Rahmenbedinungen, zum Beispiel das man
von der, ja arbeitenden, Datenbankbasierten Lösung hin zu einer
Objektorientierten Lösung will, da man mit der bestehenden Lösung an
typische Grenzen stösst. So sind Ergänzungen oder Detailsänderungen oft
unnötig aufwändig. Natürlich gibt es noch mehr Rahmenbedinungen, welche
die Anforderungen an eine Architektur recht genau definieren.&lt;/p&gt;
&lt;p&gt;Alles in allem sollte man glücklich sein eine solche Aufgabe zu
erhalten? Weit gefehlt. Erster Anlauf ist der Austausch mit dem
mitverantwortlichen Kollegen. Schon hier stehen die Meinungen
gegeneinander.&lt;/p&gt;
&lt;p&gt;Der eine sieht die Lösung in den RAD (Rapid Application Development)
Features von Visual Studio und würde am liebsten einfach mit Typed
Datasets maskenzentriert arbeiten.&lt;/p&gt;
&lt;p&gt;Der andere sieht die Lösung in einer stärkeren Betonung der Businessschicht, wo er Datenbankzugriffe direkt ausformulieren will.&lt;/p&gt;
&lt;p&gt;Ich will hier nicht näher auf die Vor- und Nachteile eingehen, die
beide Ansätze haben - schon gar nicht auf die in Bezug auf das konkrete
Projekt. Der Punkt war, da es hier nur 2 Parteien gab und von den
Individuen her keine Annäherung stattfand, gab es eine lähmende
Patt-Situation. Langsam schleicht sich so der erste Frust ein. Die
einzige Lösung bestand darin, eine bessere Lösung zu finden, die beide
Seiten (und die Führung) überzeugen könnte. Also fragt man in einem
grösserem Kreis herum. Man fängt an, Artikel über mögliche
Architekturen zu lesen (z.B. &lt;a href="http://msdn.microsoft.com/architecture/"&gt;hier&lt;/a&gt;).
Und schnell steigt die Frustrierung - soviele Leute man fragt, soviele
Antworten erhält man. Oft kann man an der Antwort sehr genau ablesen
wer aus welcher Ecke kommt. Wer Hauptsächlich mit Microsoft .Net
Lösungen erarbeitet hat, neigt zu weniger Objektorientierung(OO) und zu
mehr Rapid Application Development mit Typed Datasets, umgekehrt sind
viele Entwickler mit einem breitgefächerterem Backround der OO sehr
zugeneigt. Das Spektrum reichte von Vertretern der reinen Datenbank,
die alle Business Logic in Triggern und Stored Procedures sehen, bis
hin zu Lösungen, welche die Datenbank komplett maskieren und
abstrahieren (Persistent Framework), wie &lt;a href="http://www.mertner.com/mm/gentle/"&gt;Gentle.Net&lt;/a&gt;.
Die Sache wird jedoch so richtig Haarig, wenn man bemerkt wie die
einzelnen Entwickler und Architekten jeweils Ihre Architektur
behandeln. Sie ist oft genug das einzig Wahre, alles andere ist längst
veraltet und wer das einsetzt denkt nicht nach und kann das vermutlich
auch garnicht. Die vorbereiteten Artikel kennen meist nur verteilte
Anwendung im sogenannten Enterprise-Umfeld (wir haben nach wie vor eine
Desktopanwendung mit einer zentralen Datenbank) und konzentrieren sich
grosspurig auf die Kommunikation der einzelnen Schichten. Welcher
hausbauende Architekt konzentriert sich eigentlich auf den Mörtel statt
auf den Aufbau des Hauses und die Einteilung der Räumlichkeiten? &lt;br /&gt;Allerdings war in der Quersumme ein Tipp immer wieder herauszuhören - Codegeneratoren wie &lt;a href="%20http://www.mygenerationsoftware.com"&gt;MyGeneration&lt;/a&gt;, &lt;a href="http://www.microsoft.com/france/msdn/technologies/outils/olymars/default.asp"&gt;OlyMars&lt;/a&gt; oder &lt;a href="http://www.ericjsmith.net/codesmith/"&gt;Codesmith&lt;/a&gt;
einzusetzen. Obwohl sie natürlich beliebigen Code erzeugen können,
kommt jeder dieser Generatoren seinerseits mit einem Architekturmodell
für die unteren Schichten. In "&lt;a href="http://www.mygenerationsoftware.com/dOOdads/dOOdads.aspx"&gt;dOOdads&lt;/a&gt;"
von MyGeneration fanden unsere beiden Streithähne vom Anfang nun
eigentlich eine Lösung, mit der beide Parteien leben konnten. Die
Geschichte geht noch weiter - und der Frustlevel stieg bei dem ein oder
anderen in gefährliche Höhen, unvermeidlich durch die Einbeziehung
eines Consultants, doch genug davon. Letztlich hat sich gezeigt, es
handelt sich um einen Religionskrieg der genauso geführt wird wie die
frage nach dem besten Betriebssystem - und man kommt zu keiner Lösung.&lt;/p&gt;&lt;img src="http://andreas.bloggingon.net/aggbug/510.aspx" width="1" height="1" /&gt;</description>
            <guid>http://andreas.bloggingon.net/archive/2004/12/15/glaubenskriege-sind-ja-in-mode.aspx</guid>
            <pubDate>Wed, 15 Dec 2004 10:45:47 GMT</pubDate>
            <wfw:comment>http://andreas.bloggingon.net/comments/510.aspx</wfw:comment>
            <comments>http://andreas.bloggingon.net/archive/2004/12/15/glaubenskriege-sind-ja-in-mode.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://andreas.bloggingon.net/comments/commentRss/510.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>