myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
   » Plugin für Firefox
   » Plugin für IE7
   » Gadget für Vista
» Regeln
» Wie poste ich richtig?
» Datenschutzerklärung
» wbb-FAQ

Mitglieder
» Liste / Suche
» Stadt / Anleitung dazu
» Wer ist wo online?

Angebote
» ASP.NET Webspace
» Bücher
» Zeitschriften
   » dot.net magazin
» Accessoires

Ressourcen
» .NET-Glossar
» guide to C#
» openbook: Visual C#
» openbook: OO
» .NET BlogBook
» MSDN Webcasts
» dotnetjob.de
» Search.Net

Team
» Kontakt
» Übersicht
» Wir über uns
» Bankverbindung
» Impressum

» Unsere MiniCity
MiniCity
» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Rund um die Programmierung » Macht ein DataSet zum schnellen Flitern von Buisness-Objekten Sinn?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Macht ein DataSet zum schnellen Flitern von Buisness-Objekten Sinn?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Froggie Froggie ist männlich
myCSharp.de-Mitglied

Dabei seit: 04.08.2007
Beiträge: 314
Entwicklungsumgebung: MS Visual Studio 2005/2010 Pro


Froggie ist offline

Macht ein DataSet zum schnellen Flitern von Buisness-Objekten Sinn?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ausgangssituation:
Ich habe mehrere (verschiedene) Businessobjekte, die in Listen (List<T>) "gesammelt" werden. Teilweise stehen die Objekte in Beziehung zueinander (z.B. Person und Buchung).
Nun musste ich ein "Filtersystem" implementieren, d.h. ich wähle Person aus und sehe alle Buchungen dazu. Realisiert habe ich das ganze, indem ich die Liste der Buchungen filtere (stimmt die Nummerr der ausgewählten Person mit der Nummer der in der Buchung hinterlegten Person überein).
Dies ist aber für meinen Geschmack recht unübersichtlich und auch nicht sonderlich perfomant (bei >1.000 Personen und >500.000 Buchungen).

Meine "neuen" Gedanken:
Kann man soetwas nicht besser und schneller mit DataSets lösen?
Eins vorne weg: mit DataSets habe ich noch nie gearbeitet.
Meine Vorstellung eines DataSets (oder besser so wie ich das verstanden habe) ist folgende:
Ein DataSet besteht aus mehreren DataTables und die DataTables wiederum aus mehreren DataRows und eine DataRow entspricht dabei genau einem meiner Businessobjekte. Dann kann man wiederum die Tabellen in Beziehung setzen (ganz wie bei einer Datenbank also). Außerdem habe ich gelesen, dass man DataSets vergleichsweise einfach und performant filtern und sortieren kann.

weitere Anmerkungen:
Ich habe keine direkte Verbindung zur DB, sondern zu einem Application Server (JBoss). Von diesem kann ich meine Businessobjekte nur in Arrays bekommen. Ich müsste also die DataTables irgendwie selber befüllen, aber bis jetzt habe ich nur gesehen wie man das mit einem ...Adapter automatisch machen lässt.

Ist ein DataSet für meine Zwecke eine bessere Wahl als die vielen Listen?

Wie sieht es eigentlich mit dem Speicherverbrauch eines DataSets im Vergleich zu Listen aus? Ich habe gelesen/gehört, dass DataSets ziemlich viel Speicher benötigen, aber dafür sehr performant seien.

Vielen Dank schon mal im Voraus!
26.05.2009 11:01 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
jaensen jaensen ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-2657.png


Dabei seit: 15.12.2006
Beiträge: 2.717
Entwicklungsumgebung: VS 2012
Herkunft: München


jaensen ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hmm... besser als die Listen allemal?
Aber trotzdem würde ich dir nicht raten die Zuordnungen (bei >1.000 Personen und >500.000 Buchungen) auf dem Client zu machen sondern da auf dem Server schon vorarbeit zu leisten.

Wenn deine Relationen simpel sind ist eventuell auch ein Dictionary für dich geeignet und wenn das befüllen des DataSet/Dictionary (was relativ einfach ist wenn man in die Doku guckt) länger dauert als die zuordnung zu machen und du die Daten danach wieder wegwirfst würde ich auch davon abraten.

Zum Speicherverbrauch kann ich da leider nicht viel zu sagen, habe das noch nie gemessen.

Ein klares: It depends!
26.05.2009 13:30 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
FZelle
myCSharp.de-Poweruser/ Experte

Dabei seit: 23.04.2004
Beiträge: 8.525


FZelle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Auf keinen fall sollte man DataSets verwenden, wnen man sowieso Businessobjekte benutzt.

Mach doch das selbe, was eine DataTable auch macht, benutze einen View.
Wenn Du im netz mal nach CollectionView suchst, findest du schon alles was Du brauchst.
26.05.2009 17:55 Beiträge des Benutzers | zu Buddylist hinzufügen
jaensen jaensen ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-2657.png


Dabei seit: 15.12.2006
Beiträge: 2.717
Entwicklungsumgebung: VS 2012
Herkunft: München


jaensen ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Auf die gefahr hin das ich mich jetzt bis auf die Knochen blamieren könnte: Warum sollte man da keine Geschäftsobjekte reinpacken? Ist doch im Endeffekt auch nur eine Collection..
26.05.2009 18:18 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
JAck30lena JAck30lena ist männlich
myCSharp.de-Team (Admin)

images/avatars/avatar-2653.jpg


Dabei seit: 01.10.2006
Beiträge: 11.393
Entwicklungsumgebung: Visual Studio 05/08/10 Prof.


JAck30lena ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

also ich finde, das er in seinem fall mit einem dataset besser beraten wäre. die beziehungen sind eindeutig tabellarischer art und wenn seine BO´s nciht wirklich funktionen aufweisen (vergleich, werteberechnung und was weis ich noch), dann würde ich aus den informationen auf jeden fall ein dataset basteln. dann hat er es auch leichter das in einem datagridview z.b. anzuzeigen usw.
26.05.2009 18:30 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
jaensen jaensen ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-2657.png


Dabei seit: 15.12.2006
Beiträge: 2.717
Entwicklungsumgebung: VS 2012
Herkunft: München


jaensen ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hmm... jetzt haben wir hier schon drei verschiedene Meinungen.. Also ich würde das Objekt so belassen wie es ist und z.B. nur einen Key in eine Spalte daneben legen so dass ich dann quasi "Joinen" kann. Das würde auch mit einen Dictionary gehen allerdings geht das dann wieder nicht so schön wenn man mehrere Kriterien hätte.

Im Endeffekt würde ich das DataSet (eher die DataTables) bzw. dessen Views einfach zum sortieren und zuordnen nutzen.
26.05.2009 18:36 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Florian Reischl Florian Reischl ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-2880.jpg


Dabei seit: 16.10.2007
Beiträge: 1.559
Entwicklungsumgebung: Visual Studio * | SQL Server *
Herkunft: München


Florian Reischl ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Well, well, well - also mein Senf zu dem Thema...

Zitat von Froggie:
(bei >1.000 Personen und >500.000 Buchungen).

geschockt Du schickst/ziehst 501,000 Datensätze zum Client um die dann in Listen zu verheiraten? Wie jaensen schon gesagt hat, lass sowas die Datenbank (den App-Server) vorfiltern. Heute sind Fat-Clients zwar Standard aber du belastest damit ungemein den I/O Traffic der Datenbank und das Netzwerk.

Zitat:
Kann man soetwas nicht besser und schneller mit DataSets lösen?

Klar. Das Filtern ist hier um ein vielfaches schneller, weil die DataTable (im DS) darauf optimiert ist.

Zitat:
Wie sieht es eigentlich mit dem Speicherverbrauch eines DataSets im Vergleich zu Listen aus? Ich habe gelesen/gehört, dass DataSets ziemlich viel Speicher benötigen, aber dafür sehr performant seien.

Zweimal korrekt. Der Speicherverbrauch von DataTables deutlich höher als der einer Liste. Eine liste ist intern einfach ein statisches Array mit deinen Items. Eine DataTable ist ein Red-Black-Tree. Dieser ist zwar extrem performant für Suchen kostet aber natürlich seinen Preis. Hier könntest du bei 500,000 Items einen Unterschied im Client merken.

Zitat:
Ein DataSet besteht aus mehreren DataTables und die DataTables wiederum aus mehreren DataRows und eine DataRow entspricht dabei genau einem meiner Businessobjekte. Dann kann man wiederum die Tabellen in Beziehung setzen (ganz wie bei einer Datenbank also). Außerdem habe ich gelesen, dass man DataSets vergleichsweise einfach und performant filtern und sortieren kann.

Okay, jetzt wird's endgültig eine Grundsatzdiskussion cool
Eine Datenbank ist eine Datenbank, ein Business-Layer ist ein Business-Layer und ein Client ist ein Client. Die Tabellen einer Datenbank sind nicht zwingend 1:1 mit Business-Objekten (Geschäftsobjekten Augenzwinkern ) zu vergleichen. Ein paar einfache Beispiele:

1.)
(Beispiel aus einem recht aktuellen Thread hier auf der Seite)
Sagen wir wir bauen eine Medien-Bibliothek welche CDs, Bücher und DVDs verwaltet.

Hierbei macht es datenbankseitig Sinn eine Haupttabelle "Media" zu benutzen welche für alle Medien geltende Informationen (Title, SubTittle, PublicationDate, ...) zu verwenden. Es macht jedoch keinen Sinn alle möglichen Felder aller Medien-Typen in diese Tabelle zu stecken. Das zerstört alle Skalierungsmöglichkeiten. Dafür hat man dann spezielle Tabellen "MediaBook", "MediaCD", ... . Diese Tabellen beinhalten Attribute welche spezifisch für dieses Medium gelten.

Client-seitig macht es jedoch keinen Sinn eine Klasse Media zu haben welche dann über Properties "MediaBook" oder "MediaCD" mal hat und mal nicht. Man verwendet eine Klasse "Media" als Basis und erbt von dieser alle anderen Media-Typen ab. Dabei ist es recht egal woher diese Daten in der Datenbank kommen.

Dafür baut man dann beispielsweise Prozeduren die Sets von Haupt-Informationen (gefiltert) zurückgeben (usp_GetMediaByMyCriteria). Diese geben den allgemein gültigen Rumpf der Objekte plus den Medien-Typ zurück. Damit kann der Business-Layer auch direkt die richtigen Objekte erzeugen.

2.)
Sehr beliebt:
Tabelle "PersonAddress". Die hat dann gerne Spalten Name1 bis Name10, Email1 bis Email15, ... . Die wenigsten Personen haben mehr als zwei Namen oder mehr als 3 Email-Adressen. Aber man muss natürlich auch in der Lage sein Scheich irgendwen mit 15 Namen (wenn’s reicht) speichern zu können. Außerdem will sich auch der Internet-Junkie mit Email-Adressen bei so ziemlich jedem öffentlichen Provider dieser Welt nicht beschnitten fühlen.

Datenbankseitig baut man eine Tabelle mit den absoluten Standard-Feldern, mehr nicht. Dazu entweder (wenn man beim Speichern sehr flexibel sein will) eine XML Spalte welche dann als Property-Bag fungiert oder ein EAV Modell. Letzteres ist zwar deutlich umständlicher zu pflegen, aber wesentlich performanter wenn man nach Name12 oder TelefonNummer8 wirklich suchen will.

Gerade ein EAV Design ist Client-seitig aber in Betrachtung des daraus resultierenden Klassenmodells ein Unding.

Hierfür kann man jetzt Prozeduren bauen welche einmal die allgemein gültigen Adressinformationen zurückliefen und zusätzliche welche dann wirklich alles oder spezielles zurückgeben. Diese Informationen benötigt man in den meisten Applikationen an ca. 2 von 100 Stellen.

(Mein) Fazit zu Datenbanken:
Eine Datenbank ist mit einem (Web-)Service zu vergleichen. Bedeutet, sie liefert Daten in einer Form zurück welche (ungefähr) meiner Business-Logik entsprechen. Wo diese Daten jedoch im Backend gespeichert sind/waren/werden ist im Client egal.

Zitat:
DataRow entspricht dabei genau einem meiner Businessobjekte

Man kann Business-Objekte schon über DataTables/DataRows abbilden. Das hat aber nicht immer nur Vorteile. Ich persönlich ziehe hier eigene Objekte vor. Dabei bin ich flexibler und der Mehraufwand am Anfang rechnet sich eigentlich recht bald. Das Argument mit der "Suchmöglichkeit" ist auf jeden Fall zutreffend. Die DataTable bietet ein sehr schönes Interface um auch recht komplexe User-Suchen zu realisieren. Dafür kann man, wenn man faul ist wie ich großes Grinsen , ein/zwei Methoden basteln welche die eigenen Objekte mal schnell in eine DataTable stecken.
Mit zu 100% über DataSets/DataTables realisierten Business-Objekten kann man halt Probleme mit sehr komplexen Strukturen bekommen; oder schlich an Grenzen stoßen

So, das war das Wort zum Sonntag fröhlich
Flo
26.05.2009 19:47 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
FZelle
myCSharp.de-Poweruser/ Experte

Dabei seit: 23.04.2004
Beiträge: 8.525


FZelle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@jaensen:
Weil es nicht wirklich sinnvoll ist fertige Businessobjekte in ein/e DataSet/DataTable
zu transformieren, und so jegliche anhängende Businesslogig zu verlieren.

Es hat meist einen Grund warum man mit Businessobjekten arbeitet ( ORMapper z.b. ).
Und das dann für die Anzeige umzufriemeln, obwohl man eigentlich nur einen View,
der explizit für Businessobjekte gedacht ist, dazwischen schalten muss ist nicht zielführend.

Mit so einem View ist auch gleich das sortieren, Filtern und sonstiges ganz einfach möglich.

Wenn der View dann noch das IBindingListView Interface implementiert, kann
auch noch jedes std. Control damit umgehen.
 http://codebetter.com/blogs/brendan.tomp...3/18/60065.aspx

Aber zugegeben, das mit 500.000 Buchungen zu versuchen ist nicht wirklich sinnvoll.
Da sollte man anfangen zu überlegen, was man da tut.
26.05.2009 20:50 Beiträge des Benutzers | zu Buddylist hinzufügen
Florian Reischl Florian Reischl ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-2880.jpg


Dabei seit: 16.10.2007
Beiträge: 1.559
Entwicklungsumgebung: Visual Studio * | SQL Server *
Herkunft: München


Florian Reischl ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@FZelle

Bist du eigentlich schon irgendwann mal über eine ordentliche (entsprechend dem DataView) Implementierung von IBindingListView.Filter gestolpert? Das meinte ich mit "zu faul zum selber filtern".

Grüße
Flo
26.05.2009 20:54 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
jaensen jaensen ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-2657.png


Dabei seit: 15.12.2006
Beiträge: 2.717
Entwicklungsumgebung: VS 2012
Herkunft: München


jaensen ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ja, das schon, deswegen schrieb ich ja auch noch:

Zitat:
Also ich würde das Objekt so belassen wie es ist und z.B. nur einen Key in eine Spalte daneben legen so dass ich dann quasi "Joinen" kann.

Also nicht das objekt in seine Einzelteile zerlegen und in die Spalten zu quetschen sondern die DataTable wirklich nur als "reguläre" Collection zu missbrauchen.
DataRelation, Constraints und das ganze Zeugl finde ich sollte man da auch weglassen.

[EDIT] Natürlich ist das auch nur ein hack aber für die meisten Fälle durchaus praktikabel und meiner Meinung nach zu verschmerzen...
O.k. redundanzen gibt es dann auch noch aber im Maßstab immer noch zu verschmerzen...

Fazit von mir: Nicht besonders schön aber auf jeden Fall nützlich.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von jaensen am 26.05.2009 21:05.

26.05.2009 20:54 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
FZelle
myCSharp.de-Poweruser/ Experte

Dabei seit: 23.04.2004
Beiträge: 8.525


FZelle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@Florian Reischl:
Ich benutze meist eine erweiterung des Collectionviews, oder das
BindingListView von  http://blw.sourceforge.net/
26.05.2009 21:41 Beiträge des Benutzers | zu Buddylist hinzufügen
Florian Reischl Florian Reischl ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-2880.jpg


Dabei seit: 16.10.2007
Beiträge: 1.559
Entwicklungsumgebung: Visual Studio * | SQL Server *
Herkunft: München


Florian Reischl ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Danke Dir!
26.05.2009 21:54 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
LastGentleman LastGentleman ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-1696.jpg


Dabei seit: 13.03.2005
Beiträge: 1.272
Entwicklungsumgebung: VS 2012 Pro, MS Access
Herkunft: Österreich


LastGentleman ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Finde die Klasse echt super.

Wenn es interessiert es gibt einen Screencast dazu
 http://blw.sourceforge.net/demo.html
27.05.2009 17:06 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 4 Jahre.
Der letzte Beitrag ist älter als 4 Jahre.
Antwort erstellen


© Copyright 2003-2013 myCSharp.de-Team. Alle Rechte vorbehalten. 19.06.2013 21:13