Laden...

Welche Datenbank nehmen?

Erstellt von sven007 vor 2 Jahren Letzter Beitrag vor 2 Jahren 348 Views
S
sven007 Themenstarter:in
12 Beiträge seit 2021
vor 2 Jahren
Welche Datenbank nehmen?

Hallo miteinander,
ich plane ein kleines Projekt in C# umzusetzen. Dabei handelt es sich um eine Aufgabenliste, auf die mehrere Kollegen gemeinsam zugreifen. Bisher teilen diese sich ein Filesystem, jedoch keinen Datenbankserver. Wie würdet Ihr hier vorgehen? Welche Möglichkeiten gibt es? Könnte man bspw. auf Access zugreifen? Oder gibt es ein anderes Format, welches die Einrichtung eines weiteren Servers nicht erforderlich und dennoch den parallelen Zugriff mehrerer möglich macht?

Grüße
Sven

16.806 Beiträge seit 2008
vor 2 Jahren

Solche Themen gab es ungefähr schon 4982374 mal hier im Forum - einfach mal die Forensuche verwenden; dafür ist sie da.
Ansonsten einfach mal 10 Sekunden googlen (https://www.google.com/search?q=.net+local+database oder Google Suche nach ".net portable database") oder einen kurzen Blick in die MS Docs, dann findest Du direkt Hinweise auf Sqlite und Co.

Dabei direkt der Hinweis, dass Access keine echte Datenbank ist und für so ein Fall null geeignet ist.

2.078 Beiträge seit 2012
vor 2 Jahren

Also wenn Du "Access" mit "Datenbank" in Verbindung bringst, wirst Du hier die eine oder andere allergische Reaktion beobachten können 😉
Access ist keine Datenbank! Man kann es dafür missbrauchen, wird aber über kurz oder lang Probleme damit bereiten.

Wenn Du eine dateibasierte Datenbank haben willst, dann such explizit danach. SQLite ist z.B. ein populärer Vertreter.
Das hat aber den Nachteil, dass Du eine Datei hast, die von verschiedenen Prozessen genutzt werden kann und SQLite dafür keine Mechanismen anbietet.

Wenn mehrere Nutzer gleichzeitig arbeiten können sollen, bleibt dir also nur ein eigenständiger Datenbank-Server oder ein permanent laufender Server-Dienst (z.B. REST-API), der von den Clients genutzt wird und intern die Daten in irgendeiner Form speichert. Beachte aber, dass es auch ein Risiko ist, einen Datenbank-Server frei im Netzwerk erreichbar zu haben, davor kann so ein Server-Dienst schützen.

Oder Du bleibst beim Dateisystem, musst dann aber klug mit den konkurrierenden Dateizugriffen umgehen können.
Oder Du machst es wie z.B. LibreOffice und legst eine temporäre Datei daneben, die signalisiert: Wird gerade genutzt.
Das ginge auch mit SQLite, allerdings betrifft das dann nicht nur diese eine Datei, sondern die ganze Datenbank und alle Operationen darauf.

T
2.219 Beiträge seit 2008
vor 2 Jahren

Wieso willst du den einen weiteren Server für die Datenbank einrichten?
Die Datenbank ist im Endeffekt auch nur ein Programm, was auf einem Rechner läuft.
Dafür muss man bei kleinen Projekten keine dedizierte Hardware nur für die DB hinstellen.

Hier kannst du einfach einen zentralen Rechner nehmen, der dann die Datenbank und weitere Dienste stellt.
Aktuell hast du ja schon einen zentralen Fileserver.
Wenn dieser eine Kiste in eurem Zugriff ist und ihr dort Software installieren könnt, dann würde ich das auch direkt darauf machen.
In dem Fall könnt ihr auch eine freie Datenbank wie MariaDB oder PostgreSQL nehmen.
Diese kosten euch nichts und sind auch relativ leicht aufzusetzen.
Installer für Windows gibt es ebenfalls.

Aktuell klingt das Konzept wie eine Desktop Anwendung ala Winforms/WPF, die einfach auf eine Datei auf einer Freigabe zugreift.
Auch dort dürftet ihr bei gleichzeitgen Zugriffe schon Probleme bekommen und viel mit try/catch arbeiten.
Würde isch nur sinnvoll durch eine Datenbank oder einen vorgeschalteten Service lösen lassen.

Wie auch schon angesprochen wäre sonst nur ohne Datenbank Server eine embedded DB mit den gleichen Problemen wie reiner Dateizugriff über Freigabe möglich.
Dadurch würdet ihr das Problem aber nur von A nach B verschieben und nicht lösen.
Entweder eine Datenbank aufsetzen oder alternativ einen Service bauen, der die Zugriffe koordiniert und auch die nötigen Daten liefert/speichert.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

S
sven007 Themenstarter:in
12 Beiträge seit 2021
vor 2 Jahren

Also wenn Du "Access" mit "Datenbank" in Verbindung bringst, wirst Du hier die eine oder andere allergische Reaktion beobachten können 😉

Schon passiert. 😉
Im Moment liegen die Daten halt im Access, daher war das naheliegend. Von SQLite habe ich gelesen, aber das bring mir ja nichts bei parallelen Zugriffen.
Die Suche hier habe ich in der Tat genutzt. Gebt mal "lokale datenbank" oder "lokale + datenbank" in das Suchfeld ein und sagt mir, wie viele Treffer Ihr findet. Ich bekomme keine.
Vielleicht ist das mit dem Dateisystem gar keine schlechte Idee. Ich werde die mal verfolgen.

Wenn aber noch jemand einen Tipp hat, so nehme ich den gerne. 😉

Danke und Grüße

S
sven007 Themenstarter:in
12 Beiträge seit 2021
vor 2 Jahren

Wieso willst du den einen weiteren Server für die Datenbank einrichten?

Gerade das will ich ja nicht. 😉

Wenn dieser eine Kiste in eurem Zugriff ist und ihr dort Software installieren könnt, dann würde ich das auch direkt darauf machen.

Da liegt ja das Problem. Es handelt sich um eine ziemlich geschlossene Infrastruktur eines Großunternehmens und ich darf da nicht wirklich viel. Immerhin habe ich eine VS2019-Lizenz bekommen. 🙂

Die bisherige Lösung liegt deswegen auch im Access. Allerdings befürchte ich hier irgendwann Performance-Probleme zu sehen und habe nicht die Möglichkeit an Automatisierungen, die mir vorschweben. Bei C# hatte ich aus anderen Gründen mal tiefer reingeschnuppert und deswegen hier einen Ansatz gesehen.

16.806 Beiträge seit 2008
vor 2 Jahren

Im Moment liegen die Daten halt im Access, daher war das naheliegend. Von SQLite habe ich gelesen, aber das bring mir ja nichts bei parallelen Zugriffen.

Access erst recht nicht, weil mit einer sehr hohen Wahrscheinlichkeit die Access Datei bei parallelen Zugriffen kaputt geht.

SQLite unterstützt parallele Reads, aber keine parallelen Prozess-übergreifenden Writes (weil das eben auf das Dateisystem erfolgt und der Mittelsmann aka DB Server für ein Locking fehlt).
Ebenso ist ein Read nicht möglich, wenn ein Write erfolgt. Das Stichwort ist hier Rollback Journal Mode, siehe SQlite Doku unter Locking.
Das übernimmt aber der Treiber für Dich.

Willst Du echte parallele Writes, dann geht das nur über einen Datenbankserver (wobei auch jeder ACID-konforme DB Server entsprechend bei Writes lockt).

S
sven007 Themenstarter:in
12 Beiträge seit 2021
vor 2 Jahren

SQLite unterstützt parallele Reads, aber keine parallelen Writes (weil das eben auf das Dateisystem erfolgt).

Ah, danke. Das war mir so nicht klar. Parallel muss in der Tat nur gelesen werden. Durch das Sperren der Bearbeitung und einem Hinweis im UI könnte man sich da in Tat behelfen...
Dieses Tutorial scheint ein ganz guter Anfang zu sein. Kann mir noch jemand den Unterschied der Verwendung von SQLite als "in memory engine" und als "local file based database engine" erklären?

2.078 Beiträge seit 2012
vor 2 Jahren

Datenbank liegt im RAM vs. irgendwo als Datei

16.806 Beiträge seit 2008
vor 2 Jahren

Du kannst Sqlite so verwenden, dass Daten auf die Disk geschrieben werden (local file) oder aber nur im Speicher gehalten werden (in memory).
Ersteres ist persistentes Speichern, zweites zB. nur für Caching oder Tests - Daten gehen verloren, sobald der Prozess zuende ist.

S
sven007 Themenstarter:in
12 Beiträge seit 2021
vor 2 Jahren

Vielen Dank! Ich nehme die persistente Variante. 😉