Im Offline/Portablen Modus sollte es möglich sein, dass man Filme hinzufügen, bearbeiten und löschen kann. Portable ist so etwas ähnliches wie öffline. Nur, dass die Daten dann nicht im Userverzeichnis gespeichert werden sondern in dem Verzeichnis wo sich auch die Anwendung befindet.
Dafür benötigt die Offline-Datenbank eine zusätzliche Tabelle in der Änderungen an den Filmen gespeichert werden. Also neu hinzugefügt Filme etc.
- Filme hinzufügen: Dabei wird die interne ID des Filmes vermerkt. Beim Synchronisieren muss diese ID in jedem fall neu vergeben werden, damit die IDs keine unnötigen Lücken bekommen oder sogar doppelt vorhanden sind. Doppelte Einträge sind sehr leicht zu produzieren, wenn in der Live und der Offlinedatenbank jeweils ein Film hinzugefügt wurde. Damit würde der letzte von beiden Filme den Ersten überschreiben.
Die ID des Offlinefilmes muss dann aber auch an die angepasst werden die der Livefilm hat. - Filme löschen: Hier muss markiert werden welche Filme gelöscht wurde. Diese Filme werden dann in der Live Datenbank in den Papierkorb verschoben. Dabei sollte der Client aber darauf achten, dass Filme die direkt vorher hinzugefügt wurden nicht erst in der Livedatenbank erstellt werden nur um dann gelöscht zu werden. Diese sollten stillschweigend unter den Tisch fallen.
- Filme bearbeiten: Das sollte eigentlich alles über den Changed Timestamp geregelt werden können. Wobei es da natürlich auch sein kann, dass einige Änderungen verlohren gehen können. Und zwar, wenn beide Filme geändert wurden. Da müsste man vielleicht überlegen, ob man eine Feldweise Synchronisierung vornimmt. Bzw für den Anfang wäre auch eine Warnung, dass beide Filme geändert wurden sinnvoll und ausreichend. Wie oft wird so etwas schon passsieren. Die Liste "Mal wieder anschauen" könnte wohl das größte Konfliktpotential bieten.
Kommentare
Ist irgendwie ziemlich genau
Ist irgendwie ziemlich genau das gleiche wie #197 - Offlinedatenbank in Online synchronisieren (Geschlossen / Doppelt) , wobei es aber auch ein paar mehr technische Details enthält.
Verknüpfte Filmsammlungen
Speziell in Bezug auf die portable Anwendung ist das Konzept mit den Offlinedatenbanken wohl nicht mehr haltbar. Bei der portablen Version sollte nicht zu erst versucht werden die Online Datenbank zu öffnen und nach einem Timeout die Offline Variante. Hierbei muss die Filmsammlung sofort geöffnet werden und im Hintergrund synchronisiert werden. Was wohl auch für eine Synchronisation mit PCs nicht total unsinnig wäre. Entsprechend muss etwas Neues her.
Es muss möglich sein eine "verknüpfte Filmsammlung" erstellen zu können. Beim Anlegen einer solchen muss eine echte Filmsammlung ausgewählt werden. Die Information mit welcher Filmsammlung sie verknüpft wurde muss innerhalb einer Tabelle der Filmsammlung abgelegt werden. Wird diese Sammlung geöffnet, dann verhält sie sich wie jede andere Filmsammlung auch nur, dass im Hintergrund das Synchronisieren angeworfen wird. Bei diesem werden ...
Bei der Erstanlegung wäre es wohl auch sinnvoll, wenn der komplette Inhalt der Datenbank erst einmal in die Neue kopiert würde. Auf der anderen Seite könnte man aber auch im Hintergrund synchronisieren und hätte schon die Möglichkeit und könnte neue Film anlegen etc. Denn das Synchronisieren dauert ja mitunter eine ganze Weile.
Um sinnvoll synchronisieren
Um sinnvoll synchronisieren zu können müssen alle Änderungen in einer Journaltabelle abgelegt werden. Das betrifft allerdings alle Datenbanken. Sowohl die Lokale als auch die im Netzwerk. Hierbei sollte es wohl ausreichen, wenn bei den Filmen nur vermerkt wird, dass ein Film verändert wurde. Eine detailierte Auflistung der Felder die verändert wurde ist wohl nicht nötig. Aber vielleicht kann man das ja einschränken in dem man den Modus mit ablegt mit dem der Film gespeichert wurde.
Zusätzlich dazu benötigt die lokale Datenbank noch 2 Werte die den Synchronisationstand angeben. Und zwar geben diese den jeweiligen Stand in der Journaltabelle an. Alle Änderungen die anschließend gemacht wurden, wurden noch nicht synchronisiert.
Außerdem benötigen alle Datenbanken eine GUID. Um sicherstellen zu können, dass eine Datenbank nicht mit einer Anderen verknüpft wurde. So könnte man auch ein späteres neu verknüpfen wieder realisieren.
Ideal wäre es auch, wenn
Ideal wäre es auch, wenn Änderungen an der lokale Datenbank direkt in die Echte geschrieben werden und wenn Änderungen an der Echten recht schnell in die Lokale übertragen würden. Das wird technisch aber wohl nicht so einfach möglich sein. Entsprechend muss es ausreichen, wenn in regelmäßigen Abständen synchronisiert wird.
Problem dabei ist natürlich auch, dass beim gleichzeitigen Hinzufügen von 2 Computern die Nummern innerhalb der Sammlungen nicht mehr gleichzeitig erhöht werden. Da beide davon ausgehen immer einen aktuellen Stand zu haben könnte es sein, dass Nummern doppelt vergeben werden.
Ein weiteres Problem könnte
Ein weiteres Problem könnte auch beim Hinzufügen von 2+ Filmen bestehen, wenn in der echten Datenbank bereits ein neuer Film hinzugefügt wurde. Denn beim Hinzufügen der lokalen Filme müsste die ID der lokalen Filme angepasst werden. Da die ID in der echten Datenbank aber nur hochgezählt wird bekommt der erste Fiilm die ID des zweiten lokalen Film. Was bedeuten würde, dass dieser Film kurzzeitig doppelt vorhanden wäre und sich somit mit dem zweiten neuen Film beißen würde. Möglichkeit wäre vielleicht das alles in einer großen Transaktion zu kappseln. Würde aber bedeuten, dass der Sync immer komplett durchlaufen muss. Was ich nicht ganz so gut finde.
Eventuell könnte es sein,
Eventuell könnte es sein, dass man den Filmen keine ID mehr verpassen kann die fortlaufend erhöht werden sondern, dass man GUIDs verwendet. Aber GUIDs erwarten, dass die Strukturen umfangreich verändert werden. Abgesehen von dem deutlich erhöhten Speicherverbrauch in den gesammten Tabellen. Eine Möglichkeit wäre da, dass man die GUIDs in einen 64Bit Wert verwandelt und diese als neuen Filmnummer verwendet. Damit dürften Kollisionen recht start ausgeschlossen sein.
Beim Synchronisieren müsste man dann schauen, ob die Nummer in der zwischenzeit schon mal vergeben wurde. Also ob der Film in beiden Journalen als neu erstelle gekennzeichnet wurde.
Eventuell muss hier gar
Eventuell muss hier gar nichts so Extremes gemacht werden. Vielleicht reicht es ja auch schon aus, wenn beim Synchronisieren von neuen Filmen überprüft wird wie groß der Autoinc wert in der Hauptdatenbank ist. Ist die portable FilmID größer als der Autoinc so kann die ID direkt übernommen werden. Ist der Autoinc größer so muss die ID neu vergeben werden, da hier womöglich ein neuer Film zur Hauptdatenbank hinzugefügt wurde. Wird eine neue ID vergeben, dann muss diese größer sein als beide Autoinc Werte. Die ID in der lokalen Datenbank müsste dann allerdings komplett geändert werden.
Der Vorteil gegenüber einer zufälligen Id. Kein Datenbankupdate nötig. Gelöschte ID bleiben für immer gelöscht, da der AutoInc nicht kleiner wird.
(Kein Betreff)