{"id":620,"date":"2009-09-21T21:49:11","date_gmt":"2009-09-21T20:49:11","guid":{"rendered":"http:\/\/www.gamlor.info\/wordpress\/?p=620"},"modified":"2021-03-11T09:44:58","modified_gmt":"2021-03-11T08:44:58","slug":"db4o-the-basics","status":"publish","type":"post","link":"https:\/\/www.gamlor.info\/wordpress\/2009\/09\/db4o-the-basics\/","title":{"rendered":"db4o, The Basics"},"content":{"rendered":"<p>With this post I start a little series about <a href=\"http:\/\/www.db4o.com\/\">db4o<\/a>, an object database. Why? Because I think object databases are a quite unknown technology. Normally when developers talk about databases they mean a relational database. Yes, relational databases are awesome and well known. But there are lots of alternatives out there! Sadly, lots of developer never even look at alternatives. For example graph-databases like <a href=\"http:\/\/neo4j.org\/\">Neo4J<\/a>, document-database like <a href=\"http:\/\/couchdb.apache.org\/\">CouchDB<\/a> or a object-database like <a href=\"http:\/\/db4o.com\/\">db4o<\/a>.<\/p>\n<p>(All posts of this series: <a href=\"?p=620\">the basics<\/a>, <a href=\"?p=637\">activation<\/a>, <a href=\"?p=654\">object-identity<\/a>, <a href=\"?p=671\">transactions<\/a>, <a href=\"?p=695\">persistent classes<\/a>, <a href=\"?p=733\">single container concurrency<\/a>, <a href=\"?p=744\">Queries in Java, C# 2.0<\/a>, <a href=\"?p=779\">client-server concurrency<\/a>, <a href=\"?p=840\">transparent persistence<\/a>, <a href=\"?p=949\">adhoc query tools<\/a>)<\/p>\n<p>I will stick to the .NET 3.5 version of db4o. Although db4o supports different Java-, .NET and Mono-versions.<\/p>\n<h3>The Database-Schema<\/h3>\n<p><a href=\"https:\/\/www.gamlor.info\/wordpress\/wp-content\/uploads\/db4o-plan.png\"><\/a><\/p>\n<p><a href=\"https:\/\/www.gamlor.info\/wordpress\/wp-content\/uploads\/db4o-plan.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-625 alignnone\" title=\"db4o-plan\" src=\"https:\/\/www.gamlor.info\/wordpress\/wp-content\/uploads\/db4o-plan.png\" alt=\"db4o-plan\" width=\"360\" height=\"276\" srcset=\"https:\/\/www.gamlor.info\/wordpress\/wp-content\/uploads\/db4o-plan.png 400w, https:\/\/www.gamlor.info\/wordpress\/wp-content\/uploads\/db4o-plan-300x230.png 300w\" sizes=\"(max-width: 360px) 100vw, 360px\" \/><\/a><\/p>\n<p>In db4o your plain old C#-classes are actually the database-schema. So for our first steps we just use two object, people and pets:<\/p>\n<pre class=\"csharpcode\"><span class=\"kwrd\">public<\/span> <span class=\"kwrd\">class<\/span> Pet\r\n{\r\n    <span class=\"kwrd\">public<\/span> Pet(<span class=\"kwrd\">string<\/span> name)\r\n    {\r\n        Name = name;\r\n    }\r\n\r\n    <span class=\"kwrd\">string<\/span> Name { get; set; }\r\n}<\/pre>\n<pre class=\"csharpcode\">\u00a0<\/pre>\n<pre class=\"csharpcode\"><span class=\"kwrd\">public<\/span> <span class=\"kwrd\">class<\/span> Person\r\n{\r\n    <span class=\"kwrd\">private<\/span> IEnumerable&lt;Pet&gt; _ownsPets;\r\n\r\n    <span class=\"kwrd\">public<\/span> <span class=\"kwrd\">string<\/span> FirstName { get; set; }\r\n    <span class=\"kwrd\">public<\/span> <span class=\"kwrd\">string<\/span> SirName { get; set; }\r\n    <span class=\"kwrd\">public<\/span> <span class=\"kwrd\">bool<\/span> IsMarried { get; set; }\r\n\r\n    <span class=\"kwrd\">public<\/span> IEnumerable&lt;Pet&gt; Owns\r\n    {\r\n        get { <span class=\"kwrd\">return<\/span> _ownsPets; }\r\n        set { _ownsPets = <span class=\"kwrd\">value<\/span>.ToArray(); }\r\n    }\r\n}<\/pre>\n<h3>Store Some Objects<\/h3>\n<p><a href=\"https:\/\/www.gamlor.info\/wordpress\/wp-content\/uploads\/db4o-store.png\"><\/a><\/p>\n<p><a href=\"https:\/\/www.gamlor.info\/wordpress\/wp-content\/uploads\/db4o-store.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-626 alignnone\" title=\"db4o-store\" src=\"https:\/\/www.gamlor.info\/wordpress\/wp-content\/uploads\/db4o-store.png\" alt=\"db4o-store\" width=\"360\" height=\"283\" srcset=\"https:\/\/www.gamlor.info\/wordpress\/wp-content\/uploads\/db4o-store.png 400w, https:\/\/www.gamlor.info\/wordpress\/wp-content\/uploads\/db4o-store-300x235.png 300w\" sizes=\"(max-width: 360px) 100vw, 360px\" \/><\/a><\/p>\n<p>Ok, this is a really simple task in db4o. Basically you create classes which represent your domain. Then you open a db4o-ObjectContainer and store them. Done!<\/p>\n<pre class=\"csharpcode\">var config = Db4oEmbedded.NewConfiguration();\r\n<span class=\"kwrd\">using<\/span> (var db = Db4oEmbedded.OpenFile(config, <span class=\"str\">\"database.db4o\"<\/span>))\r\n{\r\n    var myself = <span class=\"kwrd\">new<\/span> Person\r\n                     {\r\n                         FirstName = <span class=\"str\">\"Roman\"<\/span>,\r\n                         SirName = <span class=\"str\">\"Stoffel\"<\/span>,\r\n                         Owns = <span class=\"kwrd\">new<\/span>[]\r\n                                    {\r\n                                        <span class=\"kwrd\">new<\/span> Pet(<span class=\"str\">\"Findus\"<\/span>),\r\n                                        <span class=\"kwrd\">new<\/span> Pet(<span class=\"str\">\"Garfield\"<\/span>),\r\n                                    }\r\n                     };\r\n    db.Store(myself);\r\n}<\/pre>\n<h3>Get Objects Back<\/h3>\n<p><a href=\"https:\/\/www.gamlor.info\/wordpress\/wp-content\/uploads\/db4o-query.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-628 alignnone\" title=\"db4o-query\" src=\"https:\/\/www.gamlor.info\/wordpress\/wp-content\/uploads\/db4o-query.png\" alt=\"db4o-query\" width=\"360\" height=\"240\" srcset=\"https:\/\/www.gamlor.info\/wordpress\/wp-content\/uploads\/db4o-query.png 400w, https:\/\/www.gamlor.info\/wordpress\/wp-content\/uploads\/db4o-query-300x200.png 300w\" sizes=\"(max-width: 360px) 100vw, 360px\" \/><\/a><\/p>\n<p>Well storing was easy. But how do I get the objects back? Well what comes to mind immediately? LINQ! So queries are easy too!<\/p>\n<pre class=\"csharpcode\"><span class=\"kwrd\">using<\/span> (var db = Db4oEmbedded.OpenFile(config, <span class=\"str\">\"database.db4o\"<\/span>))\r\n{\r\n    var persons = from Person p <span class=\"kwrd\">in<\/span> db\r\n                  <span class=\"kwrd\">where<\/span> p.SirName.Contains(<span class=\"str\">\"Stoffel\"<\/span>)\r\n                  select p;\r\n    <span class=\"kwrd\">foreach<\/span> (var aPerson <span class=\"kwrd\">in<\/span> persons)\r\n    {<\/pre>\n<pre class=\"csharpcode\">        Console.Out.WriteLine(aPerson.FirstName);\r\n    }\r\n}<\/pre>\n<h3>Update Objects<\/h3>\n<p><a href=\"https:\/\/www.gamlor.info\/wordpress\/wp-content\/uploads\/db4o-update.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-627 alignnone\" title=\"db4o-update\" src=\"https:\/\/www.gamlor.info\/wordpress\/wp-content\/uploads\/db4o-update.png\" alt=\"db4o-update\" width=\"360\" height=\"288\" srcset=\"https:\/\/www.gamlor.info\/wordpress\/wp-content\/uploads\/db4o-update.png 400w, https:\/\/www.gamlor.info\/wordpress\/wp-content\/uploads\/db4o-update-300x240.png 300w\" sizes=\"(max-width: 360px) 100vw, 360px\" \/><\/a><\/p>\n<p>Isn\u2019t that difficult as well.<\/p>\n<pre class=\"csharpcode\">var config = Db4oEmbedded.NewConfiguration();\r\n<span class=\"kwrd\">using<\/span> (var db = Db4oEmbedded.OpenFile(config, <span class=\"str\">\"database.db4o\"<\/span>))\r\n{\r\n    var persons = from Person p <span class=\"kwrd\">in<\/span> db\r\n                  <span class=\"kwrd\">where<\/span> p.SirName.Contains(<span class=\"str\">\"Stoffel\"<\/span>)\r\n                  select p;\r\n    <span class=\"kwrd\">foreach<\/span> (var aPerson <span class=\"kwrd\">in<\/span> persons)\r\n    {\r\n        aPerson.IsMarried = <span class=\"kwrd\">true<\/span>;\r\n        db.Store(aPerson);\r\n    }\r\n}<\/pre>\n<h3>Deleting Objects<\/h3>\n<p><a href=\"https:\/\/www.gamlor.info\/wordpress\/wp-content\/uploads\/db4o-delete.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-629 alignnone\" title=\"db4o-delete\" src=\"https:\/\/www.gamlor.info\/wordpress\/wp-content\/uploads\/db4o-delete.png\" alt=\"db4o-delete\" width=\"360\" height=\"275\" srcset=\"https:\/\/www.gamlor.info\/wordpress\/wp-content\/uploads\/db4o-delete.png 400w, https:\/\/www.gamlor.info\/wordpress\/wp-content\/uploads\/db4o-delete-300x229.png 300w\" sizes=\"(max-width: 360px) 100vw, 360px\" \/><\/a><\/p>\n<p>Ok, ok it\u2019s getting to boring:<\/p>\n<pre class=\"csharpcode\">db.Delete(aPerson);<\/pre>\n<h3>Next time<\/h3>\n<p>Well, this wasn\u2019t difficult so far. Next time I\u2019ll dive into a very important concept in db4o, the activation- and update-depth.<\/p>\n<p>\u00a0Example-Source-Code: <a href=\"https:\/\/www.gamlor.info\/wordpress\/wp-content\/uploads\/Person.cs\">Person.cs<\/a>\u00a0<a href=\"https:\/\/www.gamlor.info\/wordpress\/wp-content\/uploads\/Pet.cs\">Pet.cs<\/a>\u00a0<a href=\"https:\/\/www.gamlor.info\/wordpress\/wp-content\/uploads\/Program.cs\">Program.cs<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>With this post I start a little series about db4o, an object database. Why? Because I think object databases are a quite unknown technology. Normally when developers talk about databases&hellip; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_links_to":"","_links_to_target":""},"categories":[150],"tags":[21,100],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.gamlor.info\/wordpress\/wp-json\/wp\/v2\/posts\/620"}],"collection":[{"href":"https:\/\/www.gamlor.info\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gamlor.info\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gamlor.info\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gamlor.info\/wordpress\/wp-json\/wp\/v2\/comments?post=620"}],"version-history":[{"count":10,"href":"https:\/\/www.gamlor.info\/wordpress\/wp-json\/wp\/v2\/posts\/620\/revisions"}],"predecessor-version":[{"id":3839,"href":"https:\/\/www.gamlor.info\/wordpress\/wp-json\/wp\/v2\/posts\/620\/revisions\/3839"}],"wp:attachment":[{"href":"https:\/\/www.gamlor.info\/wordpress\/wp-json\/wp\/v2\/media?parent=620"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gamlor.info\/wordpress\/wp-json\/wp\/v2\/categories?post=620"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gamlor.info\/wordpress\/wp-json\/wp\/v2\/tags?post=620"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}