Angeregt durch die Diskussion auf dem Open-Spaces zum Thema schemalose Datenbanken, werden wir heute bereits die Vorabversion unserer StupidDB als open-source releasen.

Die StupidDB entstand bei uns aus der Notwendigkeit, immer wieder Objekte und Files schnell und einfach zu speichern, dies serverlos und trotzdem skalierbar und hochverfügbar vorzuhalten. Die StupidDB lässt sich am besten wie folgt beschreiben:

StupidDB ist ein einfaches Objektspeicherungs-Framework auf dem Filesystem. Vergleichbar mit dem WebCache kann man in der StupidDB jegliches Objekt ablegen, welches kosteneffizient auf dem Filesystem gespeichert wird. Geladen werden können Objekte und Binärdaten mit einem eindeutigen Key und einer Partition. Den echten Speicherort auf der Festplatte ermittelt StupidDB selbst. Durch Replikation des Filesystems z.B. per Windows-DFS ist zudem eine einfache Hochverfügbarkeit und Skalierbarkeit der Datenbasis herzustellen.

Angeregt durch einen Blogeintrag von tilllate.com letztes Jahr, entstand bereits vor einem Jahr die erste Version von StupidDB, welches bis zum Blogeintrag nur aus einem Konzept bestand. Leo Büttiker hat zwar ein leicht anderes Konzept als unsere Implementierung, in den Kernpunkten ähnelt sich aber das Design. StupidDB bekam durch diesen Blogpost damals jedoch seinen Namen.

Für folgende Anwendungsszenarien sehen wir StupidDB als geeignet:

  • Userdaten wie Fotos und Mediadaten, die eine Datenbank nur unnötig aufblähen
  • temporäre Daten
  • Statusdaten
  • Versionierung von Daten

Als Vorteile gegenüber z.B. MogileFS, CouchDB zählt für uns vor allem, dass kein zentraler Server für die Datenbank benötigt wird, sondern nur ein Share im Netz. Die Implementierung ist dadurch enorm vereinfacht. Mit weiteren Windows-Board-Mitteln kann man danach das ganze System um Hochverfügbarkeit und Skalierbarkeit einfach ausbauen.

Die Nutzung selbst ist denkbar einfach. Folgendes Mitarbeiter-Objekt möchte ich speichern.

65 public class Mitarbeiter

66 {

67 public int Id { get; set; }

68 public string Name { get; set; }

69 public string Vorname { get; set; }

70 public string Ort { get; set; }

71 public string Plz { get; set; }

72

73 public string VollerName

74 {

75 get { return string.Format(“{0} {1}”, Vorname, Name); }

76 }

77 }

Dazu nutzt man die Put-Methode der StupidDB.

20 IStupidDB stupidDB = new StupidDB(“test”);

21 Mitarbeiter mitarbeiter = new Mitarbeiter

22 {

23 Id = 1,

24 Name = “Christian”,

25 Vorname = “Thomas”,

26 Ort = “Rosenheim”,

27 Plz = “83026”

28 };

29 stupidDB.Put( “TestPartition”, “EinMitarbeiter”, mitarbeiter );

Um das gleiche Objekt wieder zu lesen, nutzt man mal eine Get Methode. Die Parameter sind Partition und Key:

32 Mitarbeiter mitarbeiterAusgelesen =

33 (Mitarbeiter)stupidDB.GetObject(

34 “TestPartition”,

35 “EinMitarbeiter”,

36 typeof(Mitarbeiter)

37 );

38 if (mitarbeiterAusgelesen != null)

39 {

40 Console.WriteLine(“Name des Mitarbeiters: {0}”,

41 mitarbeiterAusgelesen.VollerName);

42 }

Die StupidDB selbst wird über die app.config definiert.

3 <configuration>

4 <configSections>

5 <section name=stupidDB type=Aztec.StupidDB.DBConfigCollection, Aztec.StupidDB, Version=1.0.0.0, Culture=neutral allowLocation=true allowDefinition=Everywhere/>

6 </configSections>

7 <stupidDB>

8 <DB name=test root=temp\test tiefe=3 versionierung=false />

9 </stupidDB>

10 </configuration>

Wer sich den aktuellen Code einmal ansehen möchte, kann dies gerne unter folgendem Link ansehen:
https://stupiddb.svn.sourceforge.net/svnroot/stupiddb/trunk

kick it on dotnet-kicks.de

7 Responses to “StupidDB – object-persistence-framework”
  1. Doku says:

    Coole Sache, gibt es dazu eine Doku der Funktionen wie .Backup
    und der möglichen werte, wie Tiefe, Versionierung etc?

    Vielen Dank.

  2. Es gibt aktuell noch keine Doku, im Code wird einiges erklaert jedoch sicher nicht ausreichend.

    In der aktuellen Ausgabe der dotnetpro gibt es jedoch einen Artikel zu StupidDB, dort erklaere ich die Parameter noch einmal genauer. Auch das Thema Tiefe, Versionierung usw. http://www.dotnetpro.de/CurrentIssue.aspx

  3. UweD says:

    Scheint ja wirklich toll zu sein. Leider findet man im Web noch nicht allzuviel darüber. Der Artikel in der dotnetpro sagt einiges, aber zu dem Pfad kann ich nirgends etwas finden.
    Wenn ich root=“temp\test“ angebe, wo liegt das dann physisch?

  4. Hallo, Uwe,

    man kann bei root einfach einen absoluten Pfad angeben, z.B. c:\temp\stupiddb\

    Ohne der Angabe eines Pfades wird die StupidDB im Ausfuehrungsverzeichnis angelegt.

    Gruss
    Stefan

  5. Uwe says:

    Hallo,
    ich bin nun nicht so firm in C#. Gibt es Beispiel für IStupidDB.Dir ?

    Danke
    Uwe

  6. Hallo, Uwe,

    hier ein kleines Beispiel für die Verwendung von IStupidDB.Dir in C#:

    IStupidDB sdb = new StupidDB(“meinDbName”);
    string partition = “Beispielpartition”;
    string key = “Beispielkey”;
    // Speichern des strings “Beispiel” unter Key “Beispielkey” in Partition “Beispielpartition”
    sdb.Put(partition, key, “Beispiel”);
    // Auflisten aller Keys in Partition “Beispielpartition”
    List listKeys = sdb.Dir(partition);

    Mit den zurückgelieferten Keys können dann die Objekte via GetObject ausgelesen werden.
    Ich hoffe das beantwortet deine Frage.

    Gruß
    Andreas

  7. Uwe says:

    Hallo Andreas,
    nein, nicht ganz!
    Laut Doc gibt es
    Dir – Listet alle Schlüssel einer Partition) und
    Dir – Liefert ein IDictionary aller Schlüssel mit zugehörigem Objekt .

    Mit geht es um das 2. Dir.

    Uwe

  8.  
Leave a Reply