UUID/GUID - Architektur

SideKick

Benutzer
Beiträge
6
Hallo

Ich muss ein Programm zur Bauteileverwaltung für 200 Mittarbeiter Programmieren.

Ich habe:
  • 2 Standorte, mit einem VPN verbunden
  • Die Möglichkeit weiter Standort hinzuzufügen soll in der Architektur implementiert sein
  • Evtl. kommt auch ein Standort ohne VPN aber mit Internet-Verbindung hinzu
  • Oracle-Datenbanken
  • Die größte Tabelle wird ca. 50 Spalten haben.
  • C#.NET
Anforderungen:
  • Die Möglichkeit zeitversetzt Daten in die gleiche Tabelle zu schreiben soll gegeben sein. Die Daten sollen an beiden (evtl. mehrere) Standorte verfügbar sein.
  • Derzeit besteht jedoch nur die Anforderung an einem Standort, die Daten zu erzeugen.
  • Ich denke das ich Daten von anderen Standorden als referenzierenden Tabelle (Nur Lesen) benötige
  • Die Architektur soll bei weiteren Anforderungen nicht zu klein gewählt sein.
    • Ich habe schon oft die Erfahrung gemacht das ich meine zu klein gebaute Architektur sehr mühsam erweitern musste
    • Ich möchte auf keinen Fall die Architektur verändern müssen wenn weiter Anforderungen gestellt werden.
  • Ich möchte keine Natürlichen Schlüssel einsetzen!
Gedanke zum Ablauf:
  1. Der Benutzer legt einen neuen Datensatz an
  2. Das Programm erzeugt eine UUID für diesen Datensatz
  3. Der Datensatz wird vom Benutzer gefüllt
  4. Weitere Datensätze können erzeugt und gefüllt werden
  5. Der Benutzer Speichert die Daten in der Oracle Datenbank. (Die UUID-Spalte darf keine Doppelten Werte aufnehmen)
  6. Falls es tatsächlich einen Doppelten Wert geben sollte, ersetzt das Programm einfach die UUID durch einen anderen.
Gendanken:
  • Soll die UUID / GUID die Software oder die Datenbank generieren?

Probleme? / Fragen:
  • Verwendung von CURVAL und NEXTVAL nicht möglich. Kann ich darauf verzichten ?
  • Wie funktioniert eine Interaktion wenn z.B. eine Niederlassung neue Daten schickt ?
  • Ist es Sinnvoll bei referenzierenden Tabelle die UUID als Fremdschlüssel zu verwenden ?
Vielen Dank im Voraus

Gruß Karl
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.848
Hallo

Ich muss ein Programm zur Bauteileverwaltung für 200 Mittarbeiter Programmieren.

Ich habe:
  • 2 Standorte, mit einem VPN verbunden
  • Die Möglichkeit weiter Standort hinzuzufügen soll in der Architektur implementiert sein
  • Evtl. kommt auch ein Standort ohne VPN aber mit Internet-Verbindung hinzu
  • Oracle-Datenbanken
  • Die größte Tabelle wird ca. 50 Spalten haben.
  • C#.NET

Du hast VPN und Internet, aber nicht verläßlich, oder? Bei Ausfall der Verbindung willst Du noch immer Offline arbeiten und auch neue Daten eingeben, die bei der nächsten Verbindung synchronisiert werden sollen? So daß auch bei einem nächsten Ausfall der Verbindung die Daten im aktuellen Stand verfügbar sind?

Phuuuuhh...

Gedanke zum Ablauf:
  1. Der Benutzer legt einen neuen Datensatz an
  2. Das Programm erzeugt eine UUID für diesen Datensatz
  3. Der Datensatz wird vom Benutzer gefüllt
  4. Weitere Datensätze können erzeugt und gefüllt werden
  5. Der Benutzer Speichert die Daten in der Oracle Datenbank. (Die UUID-Spalte darf keine Doppelten Werte aufnehmen)
  6. Falls es tatsächlich einen Doppelten Wert geben sollte, ersetzt das Programm einfach die UUID durch einen anderen.

Mit UUID zu arbeiten scheint auch mir der einzig gangbare Weg.

Gendanken:
  • Soll die UUID / GUID die Software oder die Datenbank generieren?
Probleme? / Fragen:
  • Verwendung von CURVAL und NEXTVAL nicht möglich. Kann ich darauf verzichten ?
  • Wie funktioniert eine Interaktion wenn z.B. eine Niederlassung neue Daten schickt ?
  • Ist es Sinnvoll bei referenzierenden Tabelle die UUID als Fremdschlüssel zu verwenden ?
Vielen Dank im Voraus

Gruß Karl


Wer die UUID erzeugt ist letztlich egal, vermulich kann aber Oraggle das selber (vielleicht analog zu http://www.postgresql.org/docs/9.2/interactive/uuid-ossp.html )
Der größere Part ist aber:

  • zu erkennen, ob man grad On- oder Offline ist
  • die Synchronisation der Daten hochzu
  • die Synchronisation der Daten runterzu
Beim Synchronisieren prüfen, ob das auch geklappt hat - denn es könnte ja mittendrin die Verbindung wegfliegen...

Ob Du ohne currval() / nextval() hinkommst kann ich nicht sagen, notfalls je Standort eigene Sequencen nehmen oder eigene Nummernkreise. Und wenn Du in neuen Daten referentielle Integrität brauchst dann wirst wohl die UUID nehmen müssen/können, denn was anderes steht Dir nicht zur Verfügung.

Aber vielleicht prüfst doch noch mal die Anforderungen durch, ob all der Aufwand sein muß. Man kann es vielleicht nicht so einfach vergleichen, aber z.B. Kunden von uns arbeiten mit GPS-Boxen, die regelmäßig Daten in einer zentralen Datenbank speichern. Falls die Boxen mal Offline sind, dann puffern sie die Daten und schicken sie später. Hier besteht natürlich nur die Notwendigkeit, Daten von der Box in die DB zu bringen, nicht andersrum, daher geht das auch Offline ohne Probleme (und die Boxen sind voneinander unabhängig!)

Ansonsten wünsch ich Dir viel Glück und Ausdauer - das wirst Du brauchen...
 

ukulele

Datenbank-Guru
Beiträge
4.702
UUIDs sind prinzipiell immer eindeutig. Die Warscheinlichkeit das du eine doppelte erzeugen kannst ist dermaßen gering das ich auf eine Kontrolle verzichten würde.
 

SideKick

Benutzer
Beiträge
6
Hallo, vielen Dank für die Antworten. :)

Du hast VPN und Internet, aber nicht verläßlich, oder? Bei Ausfall der Verbindung willst Du noch immer Offline arbeiten und auch neue Daten eingeben, die bei der nächsten Verbindung synchronisiert werden sollen? So daß auch bei einem nächsten Ausfall der Verbindung die Daten im aktuellen Stand verfügbar sind?


Ja, genau das ist das was ich mir ausgedacht habe.
Eine VPN – Verbindung ist nie immer 100%ig. Zudem habe ich die Erfahrung gemacht das viele Datenbank Abfragen über das VPN auch zu kurze Wartezeiten führen können. Ich habe schon ein Programm in einer Niederlassung das direkt über VPN mit einem Oracle – Server in unserem Haus (Hauptniederlassung) interagiert. Bei dieser Applikation musste ich die das Programm so umschreiben das es weniger Abfragen macht. Es erfüllt nun seinen Dienst zur vollsten Zufriedenheit. Dieses Programm muss jedoch nicht so viel leisten wie das Programm das ich jetzt erstellen muss.

Mit UUID zu arbeiten scheint auch mir der einzig gangbare Weg.

Danke, diese Aussage hat mir auch weiter geholfen.

  • zu erkennen, ob man grad On- oder Offline ist
  • die Synchronisation der Daten hochzu
  • die Synchronisation der Daten runterzu
Beim Synchronisieren prüfen, ob das auch geklappt hat - denn es könnte ja mittendrin die Verbindung wegfliegen...

Aber vielleicht prüfst doch noch mal die Anforderungen durch, ob all der Aufwand sein muß. Man kann es vielleicht nicht so einfach vergleichen, aber z.B. Kunden von uns arbeiten mit GPS-Boxen, die regelmäßig Daten in einer zentralen Datenbank speichern. Falls die Boxen mal Offline sind, dann puffern sie die Daten und schicken sie später. Hier besteht natürlich nur die Notwendigkeit, Daten von der Box in die DB zu bringen, nicht andersrum, daher geht das auch Offline ohne Probleme (und die Boxen sind voneinander unabhängig!)


Ich dachte mir die Benutzer arbeiten auf ihren lokalen Oracle Server mit dem Baugruppen-Programm.

Das ist schnell und funktioniert auch wenn die Verbindung langsam oder ganz weg ist.

Jede Nebenstelle hat ihre eigenen Projekte. Eine andere Nebenstelle soll keine Veränderungen vornehmen können (Nur lese Zugriff).

Die Synchronisation soll ein separates Programm (Synchronisation-Programm) erledigen.

Das kann meines Wissens? nur funktionieren wenn eine Nebenstelle der Master der jeweiligen Projekt-Daten ist.

Den Master / Die Nebenstelle (Erzeuger des Datensatz) würde ich in einer separaten Spalte eintragen.

Das Baugruppen-Programm soll seine Daten in die Lokale Datenbank und zusätzlich die geänderten Daten in eine XML-Datei (Keine Ahnung?) scheiben

Das Synchronisation -Programm nimmt sich die XML-Dateien und schreibt sie in die Oracle – Datenbank der anderen Nebenstellen

Wenn der Vorgang nicht erfolgreich (z.B. Online) war, werden die Daten einfach noch einmal geschickt (Puffer)

Ich denke dass man das auch mit einer Online-Verbindung ohne VPN machen (Nebenstelle in Vietnam) kann? (Diese Anforderung existiert jedoch noch nicht)

Die XML-Dateien werden anschließend Archiviert

Jede Nebenstelle kann nur seine Daten / Projekt verändern

Ich werde selbst verständlich die Anforderungen noch einmal mit der Fachdomäne durch gehen.

Ich könnte mir vorstellen dass man das mit ASP.NET besser verwirklichen könnte. Ich habe jedoch noch keine Erfahrung mit dieser Technik

Zudem muss ich eine komfortable GUI als Alternative zu Excel-Dateien anbieten

Schönen Gruß
Karl
 
Werbung:

SideKick

Benutzer
Beiträge
6
Hallo, noch mal was zur UUID

Ob Du ohne currval() / nextval() hinkommst kann ich nicht sagen, notfalls je Standort eigene Sequencen nehmen oder eigene Nummernkreise. Und wenn Du in neuen Daten referentielle Integrität brauchst dann wirst wohl die UUID nehmen müssen/können, denn was anderes steht Dir nicht zur Verfügung.


Bei dem Einsatz von eigene Sequencen oder eigene Nummernkreise pro Standort habe ich keine Erfahrung. Ich denke auch dass, das einen zusätzlichen Aufwand bedeuten würde?

Hmm, die Datenbank ist klein und Performance spiel keine Rolle! Ich könnte ja einfach die UUID zusätzlich einsetzen?

Hierbei könnte ich curval() und nextval() bei Bedarf einsetzen.

Da ich z.B. auch eine Versionierung implementieren muss werde ich die referentielle Integrität benötigen. Zudem habe ich mehrere Unter-Tabellen aus denen ich Werte (z.B. Benennung, Standort) hole.

Den Fremdschlüssel würde ich dann auf die Spalte UUID setzen? … oder ?
 
Oben