Neu: Auslagerung der Artikelbeschreibungen wg Datenbankgröße
Verfasst: 01.03.2006, 00:00
Hallo Forum,
ich hätte für die Professional-Version einen neuen Vorschlag zur Auslagerung von Artikelbeschreibungen per ODBC auf eine beliebige externe Datenbank, die keine Größenbeschränkungen kennt! Grund für die Entwicklung ist ja das bekannte Problem mit der maximalen Datenbankgröße von 2GB in Access, das damit zwar nicht endgülitg ausgehebelt aber auf eine längere Zeit erledigt ist, solange bis die BayWotch-Datenbank trotz Auslagerung der Artikelbeschreibungen an ihre Grenzen stößt - und das kann zumindestens bei mir noch eine ganze lange Weile dauern. :-)
Diese Lösung verwende ich nun schon einige Zeit und bin heilfroh das ständige Datengeschiebe und die Datenbankwechsel hinter mir zu haben, denn das war einfach nur noch nervig! Das Entwickeln hat einiges an Zeit gekostet und das Ergebnis stellt sich als durchaus performant heraus, im Gegensatz zu anderen Lösungen, die mir als erstes eingefallen sind.
Dazu verwende ich konkret den MS-SQL-Server und erkläre Euch jetzt mal kurz die Einrichtung, die auf anderen Datenbanklösungen entsprechend angewandt werden muß:
- In der externen Datenbank auf dem SQL Server muß eine Tabelle "tblAuslagerung" mit den Feldern "Artikelnummer" (indiziert, float), "Artikelbeschreibung" (ntext) und einem "Flag" (bit, Standard = 0) angelegt werden.
- Diese Tabelle wird in der baywotch.db4 über ODBC verknüpft angelegt und heißt bei mir "tblAuction+".
- Desweiteren wird eine neue Tabelle "tblOption+" in der baywotch.db4 angelegt. Sie enthält nur 1 Feld mit Datumswert, was erstmal leer bleiben kann.
Nun folgt die Auslagerung der Artikelbeschreibungen:
- Mit der Abfrage UPDATE [tblOption+] SET [tblOption+].Datum = DMin("ends","tblAuction","(((tblAuction.finished)=False) AND ((tblAuction.folder_id)<>1 And (tblAuction.folder_id)<>2)) OR (((tblAuction.saved)=False) AND ((tblAuction.folder_id)<>1 And (tblAuction.folder_id)<>2)) OR (((tblAuction.completed_data)=False) AND ((tblAuction.folder_id)<>1 And (tblAuction.folder_id)<>2))"); wird der genaue Zeitpunkt (Ende) der ersten nicht beendeten oder nicht abgeglichenen Auktion bestimmt. D.h. alle zeitlich davor beendeten Auktionen haben eine gespeicherte Artikelbeschreibung und sollten künftig idealerweise nicht mehr abgeglichen werden. Diese Abfrage trägt also genau diesen Zeitpunkt in die "tblOption+" ein und damit ist das Datum bis zu dem alle Artikelbeschreibungen ausgelagert werden können, festgelegt.
- Mit der Abfrage INSERT INTO [tblAuction+] ( Artikelnummer, Artikelbeschreibung ) SELECT tblAuction.article_no, tblAuction.article_desc FROM tblAuction WHERE (((tblAuction.article_desc)<>"" And (tblAuction.article_desc) Is Not Null) AND ((tblAuction.ends)<(SELECT [tblOption+].Datum FROM [tblOption+];)) AND ((tblAuction.folder_id)<>1 And (tblAuction.folder_id)<>2)) ORDER BY tblAuction.article_no; werden nun alle Artikel mit Artikelbeschreibung vor dem gespeicherten Zeitpunkt ausgelagert (Artikelnummer & Artikelbeschreibung).
- Mit der Abfrage UPDATE tblAuction SET tblAuction.article_desc = "" WHERE (((tblAuction.article_desc)<>"" And (tblAuction.article_desc) Is Not Null) AND ((tblAuction.ends)<(SELECT [tblOption+].Datum FROM [tblOption+];)) AND ((tblAuction.folder_id)<>1 And (tblAuction.folder_id)<>2)); werden nun bei allen Artikeln mit Artikelbeschreibung vor dem gespeicherten Zeitpunkt die Artikelbeschreibungen gelöscht und die Datenbank ist frei zum Verkleinern.
Erfolgt danach ein Abgleich von Auktionen, so daß die früheste nicht beendete oder nicht abgeglichene Auktion eine spätere wird, wird sich auch bei erneuter Ausführung der Abfragen das Datum in der Tabelle "tblOption+" ändern und damit können wieder neue Artikelbeschreibungen ausgelagert werden.
Die FolderIDs 1 und 2 entsprechen dabei den Ordnern "Papierkorb" und "Ignorieren" - und die sollten meiner Meinung nach nicht angefaßt werden, aber das kann ja jeder selbst entscheiden inwieweit er überhaupt diese Ordner nutzt.
Nun zur Funktionalität im 'laufenden Betrieb' bei Anzeige von Artikeln nach einer ausgeführten Suche:
- Erfolgt in BayWotch eine Suche werden die Suchergebnisse immer über das Flag "search_result" markiert und genau diese Markierung verwende ich nun bei der Ausführung der Abfrage UPDATE [tblAuction+] INNER JOIN tblAuction ON [tblAuction+].Artikelnummer = tblAuction.article_no SET tblAuction.article_desc = [tblAuction+].Artikelbeschreibung, [tblAuction+].Flag = True WHERE (((tblAuction.search_result)=True) AND ((tblAuction.ends)<(SELECT [tblOption+].Datum FROM [tblOption+];))); zum temporären Zurückholen der Artikelbeschreibungen mit gleichzeitiger Markierung dieser zurückgeholten Beschreibungen in der Tabelle mit den ausgelagerten Daten.
- Irgendwann danach können die geholten Artikelbeschreibungen mit der Abfrage UPDATE tblAuction INNER JOIN [tblAuction+] ON tblAuction.article_no = [tblAuction+].Artikelnummer SET [tblAuction+].Flag = False, tblAuction.article_desc = "" WHERE ((([tblAuction+].Flag)=True)); wieder gelöscht werden, was auch nicht jedesmal sondern durchaus irgendwann ausgeführt werden kann, denn die betroffenen Artikel werden durch das Flag ja nicht vergessen (nur die BayWotch-DB schwillt wieder an). Nur spätestens vor einer erneuten Auslagerung von Beschreibungen muß diese Abfrage ausgeführt werden, denn sonst handelt man sich einen Fehler ein.
Dabei werden anhand des gespeicherten Datums nur die Artikel vor dem Zeitpunkt berücksichtigt und alles danach (und gleich) wird nicht angefaßt!
So, das wär's eigentlich schon zu dem Ganzen. Man kann sich nun in Access (VBA) oder VB eine kleine Anwendung schreiben, die die Abfragen zu einem entsprechendem Zeitpunkt ausführt. Idealerweise wäre natürlich eine Integration in BayWotch und vielleicht - nach Ausreifung dieser Lösung - wird das vielleicht auch einmal möglich sein und von Elmar vorgenommen werden, denn ihm habe ich diese Lösung schon vorgestellt. Aber es gibt noch viele Umstände zu beachten, die, wenn Ihr das mal testet und vielleicht auch benutzt, erst im laufenden Betrieb entdeckt werden können.
So ist es z.B. noch ein 'Problem' wenn Artikel ohne Artikelbeschreibung (weil ausgelagert) erneut abgeglichen werden. Beim nächsten Auslagern würde ein Fehler auftreten. Oder ein ausgelagerter Artikel wird aus der BayWotch-Datenbank endgültig entfernt - dann gäbe es einen verweisten Eintrag in der ausgelagerten Tabelle. Oder ein schon älterer Artikel läßt sich wie bei Artikel 7213766961 nicht abgleichen und damit bleibt das Grenzdatum an dieser Stelle 'hängen'.
Daher würde ich mir wünschen wenn Ihr das mal testet und mir Eure Erfahrungen und Ideen mitteilt. Sicherheitshalber würde ich aber - je nach Wichtigkeit der Daten - ein Backup machen, denn bei den ersten Versuchen damit sind mir leider ein paar Artikelbeschreibungen verlorengegangen... :-(
Und - was dem aufmerksamen Leser nicht entgangen sein sollte - eine Suche ist in den Artikelbeschreibungen aller Artikel vor dem Datum in "tblOption+" nicht mehr direkt möglich. Außer man sucht erstmal ohne, lädt die Beschreibungen nach, und dann sind sie ja für eine Weile drin. Bei einer späteren Implementierung in BayWotch würde das Ganze aber durchaus wieder ganz anders aussehen...
Und, was haltet Ihr davon?
Sven
ich hätte für die Professional-Version einen neuen Vorschlag zur Auslagerung von Artikelbeschreibungen per ODBC auf eine beliebige externe Datenbank, die keine Größenbeschränkungen kennt! Grund für die Entwicklung ist ja das bekannte Problem mit der maximalen Datenbankgröße von 2GB in Access, das damit zwar nicht endgülitg ausgehebelt aber auf eine längere Zeit erledigt ist, solange bis die BayWotch-Datenbank trotz Auslagerung der Artikelbeschreibungen an ihre Grenzen stößt - und das kann zumindestens bei mir noch eine ganze lange Weile dauern. :-)
Diese Lösung verwende ich nun schon einige Zeit und bin heilfroh das ständige Datengeschiebe und die Datenbankwechsel hinter mir zu haben, denn das war einfach nur noch nervig! Das Entwickeln hat einiges an Zeit gekostet und das Ergebnis stellt sich als durchaus performant heraus, im Gegensatz zu anderen Lösungen, die mir als erstes eingefallen sind.
Dazu verwende ich konkret den MS-SQL-Server und erkläre Euch jetzt mal kurz die Einrichtung, die auf anderen Datenbanklösungen entsprechend angewandt werden muß:
- In der externen Datenbank auf dem SQL Server muß eine Tabelle "tblAuslagerung" mit den Feldern "Artikelnummer" (indiziert, float), "Artikelbeschreibung" (ntext) und einem "Flag" (bit, Standard = 0) angelegt werden.
- Diese Tabelle wird in der baywotch.db4 über ODBC verknüpft angelegt und heißt bei mir "tblAuction+".
- Desweiteren wird eine neue Tabelle "tblOption+" in der baywotch.db4 angelegt. Sie enthält nur 1 Feld mit Datumswert, was erstmal leer bleiben kann.
Nun folgt die Auslagerung der Artikelbeschreibungen:
- Mit der Abfrage UPDATE [tblOption+] SET [tblOption+].Datum = DMin("ends","tblAuction","(((tblAuction.finished)=False) AND ((tblAuction.folder_id)<>1 And (tblAuction.folder_id)<>2)) OR (((tblAuction.saved)=False) AND ((tblAuction.folder_id)<>1 And (tblAuction.folder_id)<>2)) OR (((tblAuction.completed_data)=False) AND ((tblAuction.folder_id)<>1 And (tblAuction.folder_id)<>2))"); wird der genaue Zeitpunkt (Ende) der ersten nicht beendeten oder nicht abgeglichenen Auktion bestimmt. D.h. alle zeitlich davor beendeten Auktionen haben eine gespeicherte Artikelbeschreibung und sollten künftig idealerweise nicht mehr abgeglichen werden. Diese Abfrage trägt also genau diesen Zeitpunkt in die "tblOption+" ein und damit ist das Datum bis zu dem alle Artikelbeschreibungen ausgelagert werden können, festgelegt.
- Mit der Abfrage INSERT INTO [tblAuction+] ( Artikelnummer, Artikelbeschreibung ) SELECT tblAuction.article_no, tblAuction.article_desc FROM tblAuction WHERE (((tblAuction.article_desc)<>"" And (tblAuction.article_desc) Is Not Null) AND ((tblAuction.ends)<(SELECT [tblOption+].Datum FROM [tblOption+];)) AND ((tblAuction.folder_id)<>1 And (tblAuction.folder_id)<>2)) ORDER BY tblAuction.article_no; werden nun alle Artikel mit Artikelbeschreibung vor dem gespeicherten Zeitpunkt ausgelagert (Artikelnummer & Artikelbeschreibung).
- Mit der Abfrage UPDATE tblAuction SET tblAuction.article_desc = "" WHERE (((tblAuction.article_desc)<>"" And (tblAuction.article_desc) Is Not Null) AND ((tblAuction.ends)<(SELECT [tblOption+].Datum FROM [tblOption+];)) AND ((tblAuction.folder_id)<>1 And (tblAuction.folder_id)<>2)); werden nun bei allen Artikeln mit Artikelbeschreibung vor dem gespeicherten Zeitpunkt die Artikelbeschreibungen gelöscht und die Datenbank ist frei zum Verkleinern.
Erfolgt danach ein Abgleich von Auktionen, so daß die früheste nicht beendete oder nicht abgeglichene Auktion eine spätere wird, wird sich auch bei erneuter Ausführung der Abfragen das Datum in der Tabelle "tblOption+" ändern und damit können wieder neue Artikelbeschreibungen ausgelagert werden.
Die FolderIDs 1 und 2 entsprechen dabei den Ordnern "Papierkorb" und "Ignorieren" - und die sollten meiner Meinung nach nicht angefaßt werden, aber das kann ja jeder selbst entscheiden inwieweit er überhaupt diese Ordner nutzt.
Nun zur Funktionalität im 'laufenden Betrieb' bei Anzeige von Artikeln nach einer ausgeführten Suche:
- Erfolgt in BayWotch eine Suche werden die Suchergebnisse immer über das Flag "search_result" markiert und genau diese Markierung verwende ich nun bei der Ausführung der Abfrage UPDATE [tblAuction+] INNER JOIN tblAuction ON [tblAuction+].Artikelnummer = tblAuction.article_no SET tblAuction.article_desc = [tblAuction+].Artikelbeschreibung, [tblAuction+].Flag = True WHERE (((tblAuction.search_result)=True) AND ((tblAuction.ends)<(SELECT [tblOption+].Datum FROM [tblOption+];))); zum temporären Zurückholen der Artikelbeschreibungen mit gleichzeitiger Markierung dieser zurückgeholten Beschreibungen in der Tabelle mit den ausgelagerten Daten.
- Irgendwann danach können die geholten Artikelbeschreibungen mit der Abfrage UPDATE tblAuction INNER JOIN [tblAuction+] ON tblAuction.article_no = [tblAuction+].Artikelnummer SET [tblAuction+].Flag = False, tblAuction.article_desc = "" WHERE ((([tblAuction+].Flag)=True)); wieder gelöscht werden, was auch nicht jedesmal sondern durchaus irgendwann ausgeführt werden kann, denn die betroffenen Artikel werden durch das Flag ja nicht vergessen (nur die BayWotch-DB schwillt wieder an). Nur spätestens vor einer erneuten Auslagerung von Beschreibungen muß diese Abfrage ausgeführt werden, denn sonst handelt man sich einen Fehler ein.
Dabei werden anhand des gespeicherten Datums nur die Artikel vor dem Zeitpunkt berücksichtigt und alles danach (und gleich) wird nicht angefaßt!
So, das wär's eigentlich schon zu dem Ganzen. Man kann sich nun in Access (VBA) oder VB eine kleine Anwendung schreiben, die die Abfragen zu einem entsprechendem Zeitpunkt ausführt. Idealerweise wäre natürlich eine Integration in BayWotch und vielleicht - nach Ausreifung dieser Lösung - wird das vielleicht auch einmal möglich sein und von Elmar vorgenommen werden, denn ihm habe ich diese Lösung schon vorgestellt. Aber es gibt noch viele Umstände zu beachten, die, wenn Ihr das mal testet und vielleicht auch benutzt, erst im laufenden Betrieb entdeckt werden können.
So ist es z.B. noch ein 'Problem' wenn Artikel ohne Artikelbeschreibung (weil ausgelagert) erneut abgeglichen werden. Beim nächsten Auslagern würde ein Fehler auftreten. Oder ein ausgelagerter Artikel wird aus der BayWotch-Datenbank endgültig entfernt - dann gäbe es einen verweisten Eintrag in der ausgelagerten Tabelle. Oder ein schon älterer Artikel läßt sich wie bei Artikel 7213766961 nicht abgleichen und damit bleibt das Grenzdatum an dieser Stelle 'hängen'.
Daher würde ich mir wünschen wenn Ihr das mal testet und mir Eure Erfahrungen und Ideen mitteilt. Sicherheitshalber würde ich aber - je nach Wichtigkeit der Daten - ein Backup machen, denn bei den ersten Versuchen damit sind mir leider ein paar Artikelbeschreibungen verlorengegangen... :-(
Und - was dem aufmerksamen Leser nicht entgangen sein sollte - eine Suche ist in den Artikelbeschreibungen aller Artikel vor dem Datum in "tblOption+" nicht mehr direkt möglich. Außer man sucht erstmal ohne, lädt die Beschreibungen nach, und dann sind sie ja für eine Weile drin. Bei einer späteren Implementierung in BayWotch würde das Ganze aber durchaus wieder ganz anders aussehen...
Und, was haltet Ihr davon?
Sven