wie löse ich es, sinnvoll ein eine Off- und eine Online-Datenbank miteinander zu verknüpfen?

  • Hallo,

    zuerst mal: bin ich sehr sehr froh, das dieses Forum wieder online ist!!! Hier hab' ich fast alle meine Tipps, Inspirationen und Antworten bekommen, um mein Projekt zu verwirklichen (es geht um eine Pilzsporengrößenstatistik und ab jetzt auch um eine DB dahinter)

    Aber jetzt zu meiner Frage: Ich habe die Daten vieler beschriebener Pilze. Bisher noch nicht in einer DB, sondern als txt-files, aber wenn, wie löse ich am besten die Problematik, einerseits eine Online- und andererseits eine OfflineDB, die sich auf Wunsch mit der OnlineDB updatet zu managen? Für die Online-Variante habe ich schon den Webspace inkl. 2 Datenbanken gekauft. Schlummert schon seit einem Jahr so rum. Für die Offlinevariante wollte ich gerne Autoit und SQlite verwenden. Ich möchte jetzt nicht um Programmierungshilfe bitten, sondern um Tipps zum Umgang mit der Problematik.
    In dem Moment, wo die DBs sich synchronisieren, muß ich mir wahrscheinlich etwas über Client Server Anwendungen durchlesen, aber was gibt es sonst womöglich noch zu beachten? Mit DBs bin der fast totale newbie und eigentlich auch schon viel zu alt für die Problematik. Aber es wird kein komerzielles Projekt und deshalb hoffe ich auf Tipps.

    VG in die Runde und ich nehme an, im Gegensatz zu mir wusstet ihr alle, dass der Server wieder aufgesetzt wird....

    Einmal editiert, zuletzt von Trubadour (26. Oktober 2013 um 01:35)

  • Grundsetzlich hört sich das für mich nicht so problematisch an. Ich denke im großen und ganzen brauchst du außer einigen Tabellen nicht viel.

    Was für eine Datenbank nutzt du online? Und habe ich das richtig verstanden, das beide Datenbanken sich synchronisieren sollen?

    Nun gut auf meine bisherigen überlegungen folgend mein Vorschlag zur Lösung:

    - Entweder baust du dir ein kleines Tool das du Daten jeweils nur 1x eingeben musst und dieses Tool diese Daten in beide DBs haut.
    - Wenn du sagst du brauchst ein Skript zum synchronisieren würde ich mir zunächst die Frage stellen was an Daten hast du, haben beide DBs die Funktionen die du brauchst, oder nimmst du im Netz eine die vll. mehr Funktionen hat die du nutzen wirst als deine SQLite-DB?

    Jedenfalls würde ich somit Daten immer nur auf eine Datenbank schieben, und die zweite ausschließlich via Algorithmus mit Daten füllen.

    - Da ist dann wieder die Frage ob du es einfach machst (ohne Constraints etc. pp) und vll. nur Select, Insert, Update, Delete Statements brauchst, die hat jede gängige DB und dann wäre es ein aus-/einlesen.
    - Eine weitere Überlegung wäre hier ein Skript (2 Zeilen) mit einem dump zu arbeiten. Musst halt schauen ob das beide können und dann machst du einen dump aller tabellen (tabellen, nicht datenbanken - sofern du zwei unterschiedliche DBs nimmst) (ist nur eine Idee, weiß nicht ob das immer so einfach geht, habe noch nicht sehr viel Erfahrung damit, nutze es derzeit unter zwei MySQL DBs öfter).

    ---

    Darf ich mal fragen was du damit grundsetzlich machen möchtest? Wird es eine Art Wiki zu Pilzen oder was stellst du dir für das Projekt vor? Und warum gibt es eigentlich eine Offline und eine Online DB? Gibt es dafür spezielle Gründe?

    So Far

    Grüße Yaerox

    Grüne Hölle

    • Offizieller Beitrag

    Synchronisieren ist ein heißes Eisen. Die meisten DBs die ich kenne (z.B. eMail-Accounts) synchronisieren nur in eine Richtung. Das ist natürlich völlig sinnfrei, wenn Daten auch offline verändert werden.
    Hier musst du selbst festlegen, wass möglich sein darf.
    - Daten sollen on UND off bearbeitet werden können
    Das ist eigentlich das Worst-Szenario. Derselbe Datensatz wurde On- und Offline verändert. Wie willst du nun synchronisieren?
    Wenn Daten hinzukommen ist das unproblematisch, einfach beides zusammenschmeissen. Aber wenn z.B. ein Wert (z.B. typischer Durchmesser) online auf 12 und offline auf 10 gesetzt wird, muß eine Richtlinie greifen: Wer hat Vorrang.
    Wenn nur du offline ändern kannst und sagst: Ich bin Chef, ich hab recht, ist die Synchronisationsrichtung klar. Off überschreibt On.
    Das ist eigentlich das Wesentliche hierbei: Klarheit darüber welche Angaben "richtiger" :D sind.

  • Hi,

    ich hatte letztens so ein Teil gebaut, aber nur in einer Richtung.

    Und zwar werden die kompletten Daten von nem MySQL gelesen, in einer txt gespeichert (hoffen wir mal, auf nicht zuviele Daten ;)) und anschließend eine Listview befüllt.
    Wenn dann keine Verbindung besteht, werden die Daten aus der txt verwendet.

    Im Prinzip sollte es ein leichtes sein, die bearbeitete txt mit der vom MySQL zu vergleichen (Größe) und dann jeweils die kleinere zu überschreiben, bzw die Daten aus der größeren hochzuladen.

    So würde ich das jedenfalls lösen, schätz ich :)

    Gruß,
    x0r

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • Hallo,

    erst mal herzlichen Dank für die Antworten.

    ich werde nochmal präziser

    Ich habe ein Prog geschrieben, dass Pilzsporengrößenmessungen (ein wichtiges Bestimmungsmerkmal bei Pilzen) statistisch berechnet und aufbereitet. Also Mittelwert +- Konfidenzintervall. Nun können und sollten aber auch Ausreisser der aktuellen Messreihe nicht mit in Berechnung einfliessen. Gleichzeitig wird ein Normalverteilungstest durchgeführt und dieses Ergebnis fließt auch mit in den Datensatz.. Das läuft alles über das Programm beim User und funzt grob alles, aber wohin jetzt mit dem Datensatz. Bisher habe ich Ordner erstellt, in denen die Messwerte, das Ergebnis und ggf. Kommentare Bilder etc. zum untersuchten Pilz gespeichert werden.

    Zum statistischen Vergleich benötigt man aber jetzt die Datensätze weiterer Messungen, eigene oder fremde. Und die würde ich gerne in einer DB vorhalten, welche auch ruhig offline (wenn ich z.B. irgendwo in Schweden bin) sein darf. So viele neue Datensätze fallen da eh nicht an, bei vielleicht mal bis 100 Hobbymykologen, die damit arbeiten und ab und zu mal am Wochenende einen Pilz vermessen. Und ob die alle ihre Daten dann hochladen möchten? Naja, wenn nicht, kommen sie auch nicht an die Datensätze anderer... ;)
    Als Grundlage für die Zuordnung der Datensätze zu einem Pilz gibt es eine Internetdatenbank, deren Datensatznummer man heutzutage auch in neuen Artbeschreibungen mit anführt und die ich als Grundlage zum zuordnen der Datensätze mit anbieten werde.
    Hier der datensatz unseres Zuchtchampignos aus dem Geschäft:
    https://autoit.de/Mycobank
    Die Nummer des Datensatzes ( MycoBank # :292246) für diesen Pilz ist sozusagen eindeutig und hätte ich Sporen dieses Pilzes vermessen, dann wäre der Datensatz unter dieser Nummer gespeichert.

    Wenn man die Pilzsporen-Datensätze mit der Pilzsporen-OnlineDB synchronisiert, sollte (wie ich hier irgendwo letztens gelesen habe) der User (der sich legitimieren muß) mit in den Datensatz übernommen werden, um Spam wieder loszuwerden. Genauso kann es sein, dass schlecht geeichte Mikroskope zu (immer) zu kleinen oder zu großen Messergebnissen führen würden. Auch dies könnte man durch den Bezug zum User erkennen.

    Also die OnlineDB zum Synchronisieren der Datensätze, die Clients? im Programm zur statistischen Auswertung.

    Die online DB wäre MySQL und für Autoit gibt es ja eine SQlite UDF.

    Achja, BugFix : wegen Worstcase Ich wollte die Datensätze nicht mehr verändern, sondern nur vorhalten. Es geht hinterher nur noch um Vergleiche und ggf. eine Aufteilung der Datensätze zu 2 verschiedenen Arten oder Varietäten etc. Da das aber sehr selten sein wird, werde ich dass dann händisch machen oder dem User erlauben, der die Datensätze eingestellt hat.

    Insgesamt soll die DB auf Dauer die Bestimmungsarbeit erleichtern und womöglich interessante neue Fragen aufwerfen.

    Ja, DB ist für mich ein komplexes Thema, aber das war die Statistik auch und da bin jetzt auch relativ auf Scheibe.

    Also nochmal ein dickes Dankeschön für Eure grundsätzlichen Überlegungen. Mir ist einiges klarer geworden und wenn es doch mal wieder hakt, gibt es ja hier ein geballtes Wissen :thumbup:

    VG, Jens

  • Ich seh grad kein Problem darin - vll. sind meine Überlegungen auch zu einfach gestrikt für dein Vorhaben, so bitte teile mir das mit.

    1. SQL-Datenbank einrichten (Tabelle ABC mit den Spalten A, B, C)
    2. Client programmieren (z.B.: 1 GUI mit einer Listview (Spalten A|B|C) und unter der Listview(zum darstellen der Informationen) 3 Labels mit 3 Inputs (A, B, C) und einem Knopf. Drückst du auf senden wird ein Eintrag auf der DB gemacht und die Information A, B, C in der jeweiligen Spalte der Tabelle eingefügt ### 1 "Hochladen" Button: Verbindung zu der Datenbank auf deinem Webserver aufgbauen, nacheinander alle Datensätze zeilenweise aus deiner lokalen DB holen, und in ein neues INSERT-Statement anpassen und die Informationen auf deiner DB im Netz einfügen. 1 "Sync" Button: Selbe Spiel wie beim hochladen nur umgekehrt)

    Dinge wie Mehrfachzugriff verschiedener DB-Nutzer auf eine DB, sowie Primary Keys etc. hab ich mal weggelassen, das passt du dir so an wie du das brauchst ;)

    Grüße Yaerox

    Grüne Hölle

  • Hallo YaeroxXO,

    Wenn ich mich damit gut auskennen würde, sähe ich wohl auch kein Problem. Danke nochmal für die aufgelistete Standard-Vorgehensweise. Ich nehme an, du hast es auf den Punkt gebracht und ich werde mich da ausgibig mit auseinandersetzen. Auch mit den anderen Antworten und Tipps. Und Dank der vielen Beispiele in der Hilfe und beispielprogs hier im Forum (puh! ich bin immer noch sehr froh, dass es wieder online ist) bin ich bisher bei meinem Projekt selten hängengeblieben. Es hat halt nur teilweise sehr lange gedauert, bis ich verstanden habe, wie und was da zu einzelnen Problemchen geproggt wurde. GDIplus ist da so'n Beispiel. Aber es hält das Hirn fit, sich mit Programmieren zu beschäftigen.

    VG; Jens

  • Mal eine Frage zu dem Host wo das ganze statt finden soll.

    Hast du überhaupt einen externen Datenbankzugriff zum befüllen oder läuft das über ein CMS-System ala Typo3/Joomla ect. was dir dann die Einträge in die Datenbank schreibt ?

    Bzw. Liegt deine Webseite auf einem v-Server (dein virtueller Server alleine) oder liegt deine Webseite auf einem shared-Hosting (mehrere Kunden/Webseiten auf dem selben Server in der Regel zwischen 100 und 300 Domains)

    Falls dein Webseite auf einem shared-Host liegt, wirst du wohl kaum externen Datenbankzugriff haben da die Datenbank dann local auf dem Server mit Pfad localhost liegt.
    Das kannst du prüfen wenn du mal eine phpinfo.php anlegst mit folgendem Inhalt.

    Zitat

    <?php
    phpinfo();
    ?>

    Du kriegst dann ja alle Infos vom Server welche PHP-Version und auch den Pfad zur mySQL-Datenbank.

  • Hallo Autolaser,


    dafür müßte ich die DB dann wohl zuerst anlegen, was ich bis heute leider noch nicht getan habe. Dein Tipp scheint mir aber sehr wichtig zu sein. Ich muß das prüfen. Darüber hatte ich mir gar keine Gedanken gemacht. Was es alles zu beachten gibt....

    Edit:

    Habe direkt nachgeschaut und Hiostname ist localhost

    Dann funzt das gar nicht, was ich vorhabe? Oder kann ich das irgendwie von der Weboberfläche weiterleiten?
    Benötigt man dann einen eigenen echten Server?


    Vielen Dank an dieser Stelle!

    Einmal editiert, zuletzt von Trubadour (24. Oktober 2013 um 20:59)

  • Du kannst auch ein einfaches PHP-Skript erstellen, welches von deinem AutoIt-Skript aufgerufen wird und das die Einträge in die DB vornimmt.
    So musst du z.B. auch nicht dein DB-Passwort in dein AutoIt-Skript ;)

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • hallo zusammen,

    ich habe keinen externen Datenbankzugriff und somit ist meine idee erstmal hinfällig. Sehr schade. Das hatte ich als Laie nicht beachtet. Ich muß schauen, wieviel Geld ich wirklich bereit bin, in ein NonProfit Projekt zu stecken. Es gibt anscheinend ab dem Buseness-Packet einen SSH Tunnel zur Datenbank.Nur das kostet alles viel mehr.. :(
    Und dann muß das Passwort (der SSH-Zugang) ja auch in Autoit geproggt sein und da ist der Mißbrauch womöglich wirklich vorprogrammiert.

    Jetzt erst recht danke für die Tipps! Ich hätte mir sonst viel Arbeit für die Katz gemacht!

  • Also das direkte befüllen der Datenbank von extern geht dann definitiv nicht.

    Das ist aber eigentlich normal bei shared-hosting-systemen, da man sonst unter umständen und über Umwege Zugriff auf die ganze Datenbank vom Server hat.

    Stell dir deine Datenbank einfach als ein Schrank mit vielen Schubladen und dein Schrank steht in einer Wohnung in einem Hochhaus mit 300 Wohnungen .
    Mit entsprechenden Hacks, falls die Server-Systeme nicht mit entsprechenden Sicherheitspatches gesichert sind, könntest du alle Schränke und Schubladen im gesamten Hochhaus befüllen/manipulieren.

    Dir dürfte somit nur der Weg wie von Pain Tain genannt bleiben.
    Das wird auf jeden Fall eine Fummelarbeit ;)

    PainTain, doch die Logindaten müssen schon übergeben werden auch bei localhost-Datenbanken.
    Das ist das gleiche Prinzip als wenn ein CMS-System wie Joomla die Datenbank befüllt, dazu wird ebenfalls im CMS-Backend der Datenbankuser und das Passwort hinterlegt.

  • Also das direkte befüllen der Datenbank von extern geht dann definitiv nicht.

    Das ist aber eigentlich normal bei shared-hosting-systemen, da man sonst unter umständen und über Umwege Zugriff auf die ganze Datenbank vom Server hat.

    Stell dir deine Datenbank einfach als ein Schrank mit vielen Schubladen und dein Schrank steht in einer Wohnung in einem Hochhaus mit 300 Wohnungen .
    Mit entsprechenden Hacks, falls die Server-Systeme nicht mit entsprechenden Sicherheitspatches gesichert sind, könntest du alle Schränke und Schubladen im gesamten Hochhaus befüllen/manipulieren.

    Dir dürfte somit nur der Weg wie von Pain Tain genannt bleiben.
    Das wird auf jeden Fall eine Fummelarbeit ;)

    PainTain, doch die Logindaten müssen schon übergeben werden auch bei localhost-Datenbanken.
    Das ist das gleiche Prinzip als wenn ein CMS-System wie Joomla die Datenbank befüllt, dazu wird ebenfalls im CMS-Backend der Datenbankuser und das Passwort hinterlegt.


    Ich meinte damit, dass er die Login-Daten nicht unverschlüsselt etc. in sein AutoIt-Skript schreiben müsste, sondern dass diese im PHP-Skript z.B. hardcoded sein können.

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • hallo nochmal,

    ich habe anscheinend 200 ftp Zugänge. Vielleicht könnte ich darüber txt Dateien von einzelnen Clients einspielen und ausgeben. Nur geht das ja alles leider nicht so mal nebenbei ohne das der User kaum Verzögerungen bemerkt.
    Ach, war nur so eine Idee.
    Mysql.au3 werde ich mir auf jeden Fall mal genauer schauen. Wußte ich gar nichts von. Habe bisher nur sqlite-Beispiele gelesen

    Bis denne und Danke, das ihr dabei geblieben seid.!

  • Ich hätte vielleicht 2 Ideen wie man es lösen kann (vll. nicht die tollsetn aber funktionieren könnte es)...

    1.) Mach es doch einfach Webbasiert. Sprich eine normale Homepage wie es bereits welche gibt auf der man die Daten eintragen kann. Wenn du sagst du möchtest unbeding immer eine 1:1 Kopie der Daten offline, dann mach doch einen Button "Export-Data" bei dem folgend ein User sich alle Daten gezippt via E-Mail schicken kann oder einfach runterladen kann. Je nachdem könnte man das auch so machen, das dieses Skript sich die Daten holt und entweder jedesmal eine Offline-DB erstellt die dann runtergeladen werden kann, oder ein SQL.dmp oder (primitiv) normale Dateien.

    Je nach Lösungsweg wird der Client mit AutoIt geproggt.

    2.) Arbeiten mit FTP. Du machst einfach nur quasi einen Link auf deinen FTP Server als "HomePage" (wen man möchte kannste grafisch ja ne ganze HP bauen) allerdings weiß ich nicht wie man das gut lösen kann von wegen schreib/lese rechte.

    Ich könnte mir vorstellen jeder registrierte Benutzer/anonyme Benutzer darf hochladen und runterladen aber nicht löschen. Da aber löschen und hochladen glaub ich beides als schreibender Zugriff zählt müsstest da dann mal schauen.

    Nebenbei würde ich mir evtl. n Backup-Script schreiben egal bei welcher Variante um Daten zu sichern, wenn andere mit darauf zugreifen...muss ja nur mal jemand das Ding ausversehen zerschiessen je nachdem wie viele Rechte jedermann hat.

    Grüße Yaerox

    Grüne Hölle