Client/Server - Datenbank/Dateizugriff - wie macht mans ?



  • Hallo zusammen,

    ich versuche mich an einem Programm das uns anfallende Personalangelegenheiten erleichtern soll. Das ganze soll dann bspw. eine Mitarbeiterdatenbank enthalten, Dienstpläne automatisch erstellen etc.

    Ziel ist es die Anwendung später auf mehreren Rechnern in unserem Firmennetzwerk laufen zu haben - auch wenn ich soetwas bisher nicht gemacht habe. Mir stellen sich aber gerade ein paar Fragen wie man soetwas realisiert:

    Bisher speichere ich bspw. meine "Mitarbeiter" in einer lokalen XML Datei. Was aber passiert wenn mehrere "Clients" gleichzeitig auf eine solche Datei zugreifen und Änderungen vornehmen ?

    Wie wird soetwas sinnvoll aufgebaut ? Das alle Clients auf ein und die selbe Datei zugreifen fühlt sich nicht richtig an.

    Für ein paar Ratschläge wäre ich echt dankbar ...



  • Hi.

    Eine XML-Datei ist für die Zwecke nicht geeignet, dafür brauchst Du mindestens eine Datenbank.
    Eine einfache Datei kennt keinen Transaktionsbegriff und beim Zugriff von mehreren Clients ist es nur eine Frage der Zeit, bis es knallt. Datenbanken sind da schon zuverlässiger, denn elementare Aktionen werden (je nach Transaktionslevel) synchronisiert abgearbeitet.

    Nun kommt es darauf an welche Operationen Du genau implementieren willst und ob der Transaktionsschutz des Datenbanksystems dafür ausreicht. Wenn mehrere Clients jeweils mehrere Operationen ausführen, kann es trotzdem zu Inkonsistenzen kommen. Beispiel: Client A fügt einen Datensatz ein, Client B löscht ihn, Client A modifiziert später den nicht mehr existenten Datensatz der nur noch im lokalen Speicher von A vorliegt. Genügt es für Deine Zwecke solche Fälle lokal bei den Clients abzufangen und entsprechende Exceptions zu behandeln?

    Ansonsten wäre der nächste Schritt eine Middleware zu entwickeln, die der Datenbank vorgeschaltet ist und als eigenständiger Softwareserver fungiert. Die Clients nehmen nur noch Kontakt mit der Middleware auf und sprechen nicht direkt die Datenbank an.
    In der .NET-Welt ist die WCF (Windows Communication Foundation) zur Zeit das Framework, um solche verteilten Systeme zu realisieren. Das erfordert einige Einarbeitungszeit. Wirklich schwer ist die WCF nicht, aber man muss sich eben mit den vielfältigen Möglichkeiten vertraut machen.



  • Ja genau das meinte ich.

    Beim Beispiel Mitarbeiter sollen die üblichen Operationen wie hinzufügen etc. ausgeführt werden. Allerdings gehe ich davon aus, das in den seltensten Fällen zwei Clients einen Mitarbeiter bearbeiten würden - wenn dieser erstmal angelegt ist.

    Anders sieht dies aus - wenn ich in Richtung Dienstplan gehe. Das System soll hier auf Basis einer Schichtrotation einen Dienstplan erstellen - welcher allen Clients zur Bearbeitung zur Verfügung steht. Bearbeiten zwei oder mehr Clients diesen Dientsplan - muss ich damit ja irgendwie umgehen.

    Muss es wirklich eine Datenbank sein - wenn man von vielleicht 8 Clients ausgeht ? Oder gibt es noch einen anderen Weg ? Und wenn ein Datenbanksystem - welches wäre am sinnvollsten und mit wenig aufwand zu Implementieren.



  • Ich würde schon eine Datenbank verwenden und wahrscheinlich auch einen Application Server dazwischenschalten, der die Business Logik implementiert/erzwingt.



  • shaun1981 schrieb:

    Muss es wirklich eine Datenbank sein - wenn man von vielleicht 8 Clients ausgeht ? Oder gibt es noch einen anderen Weg ? Und wenn ein Datenbanksystem - welches wäre am sinnvollsten und mit wenig aufwand zu Implementieren.

    Nun, eine einfache Datei wird früher oder später für Probleme sorgen. Wenn Du und Dein Auftraggeber mit instabiler Software leben können muss es keine Datenbank sein. 😉 Immer wenn es mehr als ein Client ist, muss man solche Probleme berücksichtigen und sollte nicht einfach unsynchronisiert auf simple Textdateien zugreifen.

    Welches Datenbanksystem Du verwendest ist eigentlich egal. Die Unterschiede auf Codeseite sind nicht sehr groß, manchmal sogar nur ein Connectionstring der geändert werden müsste. Prinzipiell ist es sinnvoll ein ORM-Framework (Object Relational Mapper) wie das MS Entity Framework oder NHibernate zu verwenden. Macht das Leben einfacher wenn man relationale Datensätze in Objekte übersetzt bekommt. Aber naja, am Anfang vielleicht kein Muss.

    Und wie gesagt, ob zusätzlich noch ein von Dir entwickelter Softwareserver notwendig ist, hängt von den genauen Umständen ab. Evtl. ist der Aufwand für das Projekt etwas größer als Du vielleicht vermutet hast.



  • shaun1981 schrieb:

    Muss es wirklich eine Datenbank sein - wenn man von vielleicht 8 Clients ausgeht ? Oder gibt es noch einen anderen Weg ?

    Es gibt immer einen anderen Weg. Die Frage ist nur was Sinn macht.
    Man kann z.B. mit Lock-Files arbeiten. Also wenn ein Client 'was bearbeiten will, dann legt er ein File im selben Verzeichnis wie das XML File an, mit Share="deny all", und hält dieses offen bis er seine Modifikation abgeschlossen hat.
    Ist aber ein ziemliches gebastel, und man kann dabei viel falsch machen.
    => Datenbank ist besser

    Und wenn ein Datenbanksystem - welches wäre am sinnvollsten und mit wenig aufwand zu Implementieren.

    Eine mMn. gute Möglichkeit wäre SQL Server Express. Zugriff über ADO .NET oder das Entity-Framework.


Log in to reply