Bestmögliche Speicherung von Datensätzen?


  • Mod

    Hallo

    wenn du die Daten mittel SQL laden tust dann hast du sie doch so wie du sie brauchst

    zB kopiert du alle Daten in die neue DB statt speichern loescht du dir nicht angewaehlten Daten

    MfG
    Klaus



  • Ok dann muss ich ein bisschen weiter ausholen.
    Ich hole die Daten nicht wirklich aus einer Datenbank sondern
    bekomme sie per HTML Quelltext.
    Das bedeutet ich rufe eine Seite im Internet ab, davon
    bekomm ich dann einen Quelltext der z.B. folgendermaßen aussieht:

    Thomas...Maier...Holzweg 12...Westheim!!!Ingried...Schmidt...Tonweg 1...Dortmund

    und so weiter. Das bedeutet ich hab jetzt eine Klasse die diesen Text auswertet/ausplittet, also gibt es 4 Variablen:
    Vornamem, Name, Strasse, Ort
    Als Trennzeichen ist "..." festgelegt, als Trennzeichen zum nächsten Datensatz ist "!!!" festgelegt. So nun muss ich die Daten also Trennen und dann in den Variablen ablegen damit ich sie dem User anzeigen kann bzw. in die nächste Datenbank speichern kann(die dann aber wirklich eine SQL Datenbank ist). Wollte igendlich euch das verfahren ersparen wie ich die Daten bekomm aber evt. ist es jetzt ersichtlich warum ich erstmal die ganzen Datensätze speichern muss um sie dann weiterverarbeiten zu können. Würde ich dass nicht machen müsste ich jedesmal von vorne den kompletten text aufsplitten und analysieren.
    So ich hoffe ihr könnt mir ein paar Tipps geben.

    MFG

    Maruu



  • Ich würde das jetzt mal ganz einfach so machen:
    Ne Klasse Datensatz erstellen, die den Namen, Adresse etc. als Felder enthält, da das ja scheinbar statisch bzw. immer vorhanden ist.
    Dann ganze viele Objekte erstellen (aus den Daten halt) und die in nen Vector hängen.

    Falls es für sowas eine bessere Lösung gibt, wäre ich sehr daran interessiert, da ich Daten die so ähnlich aufgebaut sind bisher immer so gespeichert haben 😉



  • Hallo Maruu,

    wäre es nicht trotzdem einfacher, die Daten aus dem HTML zuerst in eine temporäre Tabelle zu schreiben und diese dann so weit als möglich aufzubereiten und dann satzweise dem User zu präsentieren und in die endgültige Tabelle zu schreiben?

    Wenn nicht: Wieso hast Du 2 Klassen definiert? Eine sollte doch reichen. Daten auf einen Rutsch aus dem HTML einlesen. Notwendige Änderungen vornehmen, den User auswählen lassen, alle nicht ausgewählten Objekte löschen und die restlichen speichern. Ich würde die Verkettung als Teil der Klasse machen (also innerhalb der Klasse Zeiger auf nächstes Objekt, vielleicht auch Zeiger auf vorhergehendes Objekt) und die Sortierung bereits beim Einfügen in die Liste durchführen. Auch würde ich die Aufbereitung der Daten so früh wie möglich durchführen. Außerdem würde ich nur die Objekte erzeugen, die wirklich benötigt werden, also nicht auf Verdacht schon mal Objekte anlegen, obwohl noch gar nicht bekannt ist, wieviele benötigt werden.



  • Jo so hab ich mir das auch gedacht, das ich innerhalb der Klasse bzw. des Objektes dann ne Verkettete Liste mit den einzelnen Variablen mach.
    Das Thema das ich die Daten erst in ne Tabelle Schreiben soll ist ein bisschen problematisch da es sich um ein Produktivsystem handelt wo halt nicht einfach so mal zwischendurch die Daten rein können und dann halt wieder gelöscht/verändert werden. Zum Thema 2 warum 2 Klassen:
    Ich finde es einfach übersichtlicher 2 Klassen zu benutzen, da man so ganz genau trennen kann wer für was verandwortlich ist. Außerdem will ich evt. den Code später in DLL´s auslagern um leichter Updates beim User durchführen zu können.
    Nun hab ich noch ne Frage, ich realisiere die Variablen als Verkettete Liste in meinem Objekt. So und mach eine Basisiklasse die nur die Variablen beinhaltet. Außerdem schreib ich vor die Variablen static so das alle Objekte auf die gleichen Variablen zugreifen. Nun Ererbe ich diese Basisiklasse mit meinen 2 Klassen also Daten aus dem HTML Code holen und Daten in DB schreiben. Greifen dann diese Beiden Klassen auch jeweils auf die gleichen Variablen zu??? Weil dann hätte ich kein Problem mit dem Übergeben der Verketteten Listen also den Variablen???

    MFG

    Maruu



  • Maruu schrieb:

    Ich finde es einfach übersichtlicher 2 Klassen zu benutzen

    Widerspricht aber dem ++ in C++, schließlich ist das doch einer der Kernpunkte in C++: Objektorientiertes Programmieren. Was Du da vorhast, klingt eher nach einem Mischmasch zwischen (strukturiertem) C und (objektorientiertem) C++.

    Maruu schrieb:

    ...die Daten erst in ne Tabelle Schreiben soll ist ein bisschen problematisch da es sich um ein Produktivsystem handelt...

    Ich sehe da zwar kein Problem, eine temporäre Tabelle zu erzeugen und anschließend wieder zu löschen...

    Maruu schrieb:

    Nun hab ich noch ne Frage, ich realisiere die Variablen als Verkettete Liste in meinem Objekt. So und mach eine Basisiklasse die nur die Variablen beinhaltet. Außerdem schreib ich vor die Variablen static so das alle Objekte auf die gleichen Variablen zugreifen. Nun Ererbe ich diese Basisiklasse mit meinen 2 Klassen also Daten aus dem HTML Code holen und Daten in DB schreiben. Greifen dann diese Beiden Klassen auch jeweils auf die gleichen Variablen zu??? Weil dann hätte ich kein Problem mit dem Übergeben der Verketteten Listen also den Variablen???

    Das mußt Du mir näher erklären. Versteh ich so nicht.



  • Also das mit der temporären Tabelle ist leider nicht möglich da ich keinne zuätzliche Tabelle erstellen kann, es ist eine feste Tabellenstruktur in der ich nix ändern kann und auch keine Rechte dazu hab.

    So zum anderen Thema ich erkläre es nochmal.

    Ich hab mir gedacht ich erstelle eine Basisklasse die folgende Variablen im geschützten Bereich enthält:

    static char * Name
    static char * Vorname
    static char * Ort
    static char * PLZ
    ...

    So ansonsten enthält die nix, keine Methoden garnix. Nun hab ich 2 weitere Klassen und denen vererbe ich die Basisiklasse so das die 2 weiteren Klassen auch die ganzen Variablen wie oben haben und dann halt noch ihre eigenen Variablen und Methoden.
    Nun ist die Frage, wenn ich vobn jeder der 2 Klassen, die von der Basisklasse geerbt haben, ein Objekt erstelle also z.B.
    Klasse_1 Objekt1;
    Klasse_2 Objekt2;

    greifen die dann intern auf die gleichen Variablen zu, also wenn Objekt1 irgendwas in die Variable Name schreibt, kann das Objekt2 dann auch auslesen???
    Das static vor den Variablen macht ja normalerweiße das alle Objekte auf die gleichen Variablen zugreifen, nur gilt das noch wenn diese vererbt wurden??

    MFG

    Maruu



  • Maruu schrieb:

    Das static vor den Variablen macht ja normalerweiße das alle Objekte auf die gleichen Variablen zugreifen, nur gilt das noch wenn diese vererbt wurden??

    Wenn dem so wäre, könntest Du nur einen einzigen Datensatz definieren und in allen Objekten wären die gleichen Daten enthalten und eine Änderung an einem Objekt würden alle anderen Objekte gleich mit ändern. Wenn ich Dich diesmal richtig verstanden habe.



  • genau so hab ichd as gemeint, dann müsste ich nämlich die Variablen von einem Objekt nicht in das andere Objekt übergeben, nur weiß ich nicht ob das auch noch nach der Vererbung in unterschiedlichen klassen gilt.
    Weisst du das??

    MFG

    Maruu



  • Das "static" bedeutet, das für alle Objekte die Variable die gleiche ist. Das heißt:

    Ich habe eine Klasse Auto. Darin ist eine Variable static int count. Bei jedem Aufruf des Konstruktors wird dieses count jetzt um eines erhöht.

    Wenn ich nun 2 Autos erstelle:

    Auto* auto1 = new Auto();
    Auto* auto2 = new Auto();
    

    und abfrage

    auto1->count;
    auto2->count;
    

    Liefert mir das beide male "2"! Heißt, das static erzeugt eine Klassevariable und keine Objektvariable.

    greifen die dann intern auf die gleichen Variablen zu, also wenn Objekt1 irgendwas in die Variable Name schreibt, kann das Objekt2 dann auch auslesen???

    Sollte eigendlich klappen. Nur mit dem Nachteil, das es egal ist, wieviele Objekte du hast, du kannst immer nur einmal Name, etc. speichern. Es wird ja immer in der Klasse (nicht dem Objekt) gespeichert und die Klasse gibts nur einmal.



  • ja nun ist es aber so das es ja 2 verschiedene Klassen sind. Sozusagen eine Basisklasse Auto mit den Variablen:
    Tempo
    Farbe

    und dann die 2 Klassen LKW und SPORTWAGEN die jeweils die 2 Variablen von Auto erben.

    und wenn ich nun ein Objekt von LKW und eins von SPORTWAGEN erstellen dann sind das ja eigendlich 2 verschiedene Klassen oder beziehen die sich dann auf die Klasse Auto wenns um die Variablen Tempo und Farbe geht??

    MFG

    Maruu



  • Probier's doch einfach aus. Ich weiß es auch nicht. ABER die Verwendung von static widerspricht Deiner Aussage, dass Du alle 'Datensätze' zwischenspeichern willst. Du kannst so nur noch einen Datensatz haben!



  • Ja, laut meinem Verständnis von Vererbung sollte es egal sein, ob du LKW->Farbe oder Auto->Farbe oder Sportwagen->Farbe sagst. Es sollte sich dann immer auf Auto beziehen.

    Aber wie schon so oft gefragt: Was bringt dir das?
    Du kannst jetzt viele viele Autos erstellen, die aber alle die gleiche Farbe haben. Das ist doch unsinn. Du willst doch viele viele Autos mit verschiedener Farbe haben.



  • So jetzt bin ich wieder zurück von der Arbeit.
    Also naja ich hab da ein bisschen rumgedacht aber wahrscheinlich
    ist es nicht
    die beste Lösung. und zwar wollte ich innnerhalb des Objektes eine Verkettete Liste anlegen also z.B. so:
    static int * PLZ
    static int * PLZnext

    usw. anstatt eine Verkettete Liste mit Objekten zu machen die jeweils die ganzen Variablen enthalten. Naja wird wohl besser sein eine Verkettete Liste mit Objekten zu machen anstatt die Verkettete Liste im Objekt anzulegen oder??

    MFG

    Maruu



  • Ein großes fettes JA. 😉

    EDIT: Das heißt unter der Voraussetzung, dass die Datensätze komplett in einer Tabelle landen. Wenn es sich um mehrere Zieltabellen (eigene Tabelle für PLZ/Ort, z.B.) könnte man diese Strukturen 'nachbauen'. Ob sich solch ein Aufwand lohnt sei mal dahingestellt. Normalerweise ist es weniger Aufwand, dies beim Speichern eines Datensatzes zu realisieren.



  • aber mal nur so, wo ist da der Vorteil??
    Weil wenn ich jedes mal ein Objekt neu erstelle um weitere Daten zu speichern dann muss er ja für die ganzen methoden und co auch wieder Speicher reservieren oder??
    Ist das dann ned unnötig Platz verbraucht??

    MFG

    Maruu



  • Nein, Methoden werden nicht 'dupliziert'. Die sind für alle Objekte nur einmal vorhanden. Nur die Datenvariablen werden für jedes Objekt erzeugt. Und wenn Du hier nur Zeiger verwendest, die Du zur Laufzeit mit dynamisch erzeugten Objekten belebst, hast Du den Speicherverbrauch minimiert (wenn auch auf Kosten von etwas Geschwindigkeit). Da es sich bei Deinen Daten um AnsiStrings handelt, würde ich mir allerdings nicht die Mühe machen, diese dynamisch zu erzeugen. Wenn das so viele Datensätze sind, dass Du befürchtest, der Speicher könnte nicht reichen, solltest Du vielleicht doch nach einer Möglichkeit suchen, immer nur einen 'Datensatz' einzulesen und diesen direkt zu speichern.



  • Aha, naja ich befürchte eigendlich nicht das der SPeicher nicht reicht (ist das jetzt ne doppelte Verneinung gewesen*g*), hat mich nur mal so interessiert.
    Dann werd ich wohl ne Verkettete Liste mit Objekten machen. Danke ihr habt mir sehr geholfen.

    Gruß

    Maruu


Anmelden zum Antworten