{"id":908,"date":"2013-04-04T01:03:54","date_gmt":"2013-04-04T01:03:54","guid":{"rendered":"http:\/\/garysieling.com\/blog\/?p=908"},"modified":"2013-04-04T01:03:54","modified_gmt":"2013-04-04T01:03:54","slug":"philly-ete-database-as-a-value-summary","status":"publish","type":"post","link":"https:\/\/www.garysieling.com\/blog\/philly-ete-database-as-a-value-summary\/","title":{"rendered":"Philly ETE &#8211; Database as a Value"},"content":{"rendered":"<p>This was the first time I&#8217;ve seen Rich Hickey&#8217;s talk on <a href=\"http:\/\/www.datomic.com\/\">Datomic<\/a>, which lent great clarity to the product. As implemented, Datomic functions as an immutable database for philosophical reasons, although in practice it doesn&#8217;t manage it&#8217;s own storage, and may eventually support deletions to satisfy legal and compliance issues around privacy.<\/p>\n<p>This database technology aims to solve common problems encountered in relational database systems: inability to reason about the current state of data, concurrency issues, challenges of viewing data as of a given time, mismatched metaphors between code and data, and various frustrating design patterns. Making data immutable and adding a time dimension to data allows a number of great simplifications, and produces an index resembling git history (although unlike git, you can&#8217;t rewrite history).<\/p>\n<p>There are a number of possible implementations &#8211; naive approaches would copy data or build append-logs (as is typical in <a href=\"http:\/\/oldblog.antirez.com\/post\/redis-persistence-demystified.html\">database rewrite logs<\/a>), but the Datomic structures bear study, as they are all based on wide, short trees. Because data nodes are immutable, the contents of a tree won&#8217;t change, but only have new data added. This lets the db track novelty, and arranged as they have it currently, it appears that you can easily traverse the history as a range scan. Each tree-node has a series of pointers to other tree locations, based on various pre-indexed ways to traverse the tree.<\/p>\n<p>Architecturally, this can have many readers, which don&#8217;t require coordination (a query would specify the database\/db version it queries against), but a single writer.<\/p>\n<p>Data elements are designed to resemble facts (e.g. :noun :verb :object), so one might think of this as resembling a cell or row in a traditional database. Because these are immutable, they can also be cached anywhere, or cached split across machines, so a database could have arbitrary subsets of data in memory &#8211; query results are a merge-join of memory and disk storage. As I understood it, data is read into memory as segments (pages) like traditional databases.<\/p>\n<p>This is designed to take a functional approach to database programming, so instead of running a query inside a database, you run a function on a database, e.g. f(db) -&gt; results. This has great potential &#8211; ease of mocking data, running hypothetical inserts to see the result, passing custom code in database queries. Notably, this is not necessarily intended to work well for very large data (click streams) or non-functional uses of a database (i.e. anything that uses a db as a global variable, such as a counter).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This was the first time I&#8217;ve seen Rich Hickey&#8217;s talk on Datomic, which lent great clarity to the product. As implemented, Datomic functions as an immutable database for philosophical reasons, although in practice it doesn&#8217;t manage it&#8217;s own storage, and may eventually support deletions to satisfy legal and compliance issues around privacy. This database technology &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/www.garysieling.com\/blog\/philly-ete-database-as-a-value-summary\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Philly ETE &#8211; Database as a Value&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"footnotes":""},"categories":[6,15,25],"tags":[85,157,162,392,429,440],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.9 - aioseo.com -->\n\t<meta name=\"description\" content=\"This was the first time I&#039;ve seen Rich Hickey&#039;s talk on Datomic, which lent great clarity to the product. As implemented, Datomic functions as an immutable database for philosophical reasons, although in practice it doesn&#039;t manage it&#039;s own storage, and may eventually support deletions to satisfy legal and compliance issues around privacy. This database technology\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"gary\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/www.garysieling.com\/blog\/philly-ete-database-as-a-value-summary\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.9\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Gary Sieling - Software Engineer\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Philly ETE \u2013 Database as a Value - Gary Sieling\" \/>\n\t\t<meta property=\"og:description\" content=\"This was the first time I&#039;ve seen Rich Hickey&#039;s talk on Datomic, which lent great clarity to the product. As implemented, Datomic functions as an immutable database for philosophical reasons, although in practice it doesn&#039;t manage it&#039;s own storage, and may eventually support deletions to satisfy legal and compliance issues around privacy. This database technology\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.garysieling.com\/blog\/philly-ete-database-as-a-value-summary\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2013-04-04T01:03:54+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2013-04-04T01:03:54+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Philly ETE \u2013 Database as a Value - Gary Sieling\" \/>\n\t\t<meta name=\"twitter:description\" content=\"This was the first time I&#039;ve seen Rich Hickey&#039;s talk on Datomic, which lent great clarity to the product. As implemented, Datomic functions as an immutable database for philosophical reasons, although in practice it doesn&#039;t manage it&#039;s own storage, and may eventually support deletions to satisfy legal and compliance issues around privacy. This database technology\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/philly-ete-database-as-a-value-summary\\\/#blogposting\",\"name\":\"Philly ETE \\u2013 Database as a Value - Gary Sieling\",\"headline\":\"Philly ETE &#8211; Database as a Value\",\"author\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/author\\\/gary\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/#organization\"},\"datePublished\":\"2013-04-04T01:03:54+00:00\",\"dateModified\":\"2013-04-04T01:03:54+00:00\",\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/philly-ete-database-as-a-value-summary\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/philly-ete-database-as-a-value-summary\\\/#webpage\"},\"articleSection\":\"Data Science, Meetups, SQL Performance Tuning, big data, database, datomic, nosql, philly ete, programming techniques\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/philly-ete-database-as-a-value-summary\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.garysieling.com\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/category\\\/data-science\\\/#listItem\",\"name\":\"Data Science\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/category\\\/data-science\\\/#listItem\",\"position\":2,\"name\":\"Data Science\",\"item\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/category\\\/data-science\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/philly-ete-database-as-a-value-summary\\\/#listItem\",\"name\":\"Philly ETE &#8211; Database as a Value\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/philly-ete-database-as-a-value-summary\\\/#listItem\",\"position\":3,\"name\":\"Philly ETE &#8211; Database as a Value\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/category\\\/data-science\\\/#listItem\",\"name\":\"Data Science\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/#organization\",\"name\":\"Gary Sieling\",\"description\":\"Software Engineer\",\"url\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/author\\\/gary\\\/#author\",\"url\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/author\\\/gary\\\/\",\"name\":\"gary\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/philly-ete-database-as-a-value-summary\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0be925276d848ffe98a6a9dc8cf33e67?s=96&d=identicon&r=g\",\"width\":96,\"height\":96,\"caption\":\"gary\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/philly-ete-database-as-a-value-summary\\\/#webpage\",\"url\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/philly-ete-database-as-a-value-summary\\\/\",\"name\":\"Philly ETE \\u2013 Database as a Value - Gary Sieling\",\"description\":\"This was the first time I've seen Rich Hickey's talk on Datomic, which lent great clarity to the product. As implemented, Datomic functions as an immutable database for philosophical reasons, although in practice it doesn't manage it's own storage, and may eventually support deletions to satisfy legal and compliance issues around privacy. This database technology\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/philly-ete-database-as-a-value-summary\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/author\\\/gary\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/author\\\/gary\\\/#author\"},\"datePublished\":\"2013-04-04T01:03:54+00:00\",\"dateModified\":\"2013-04-04T01:03:54+00:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/\",\"name\":\"Gary Sieling\",\"description\":\"Software Engineer\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Philly ETE \u2013 Database as a Value - Gary Sieling","description":"This was the first time I've seen Rich Hickey's talk on Datomic, which lent great clarity to the product. As implemented, Datomic functions as an immutable database for philosophical reasons, although in practice it doesn't manage it's own storage, and may eventually support deletions to satisfy legal and compliance issues around privacy. This database technology","canonical_url":"https:\/\/www.garysieling.com\/blog\/philly-ete-database-as-a-value-summary\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/www.garysieling.com\/blog\/philly-ete-database-as-a-value-summary\/#blogposting","name":"Philly ETE \u2013 Database as a Value - Gary Sieling","headline":"Philly ETE &#8211; Database as a Value","author":{"@id":"https:\/\/www.garysieling.com\/blog\/author\/gary\/#author"},"publisher":{"@id":"https:\/\/www.garysieling.com\/blog\/#organization"},"datePublished":"2013-04-04T01:03:54+00:00","dateModified":"2013-04-04T01:03:54+00:00","inLanguage":"en-US","mainEntityOfPage":{"@id":"https:\/\/www.garysieling.com\/blog\/philly-ete-database-as-a-value-summary\/#webpage"},"isPartOf":{"@id":"https:\/\/www.garysieling.com\/blog\/philly-ete-database-as-a-value-summary\/#webpage"},"articleSection":"Data Science, Meetups, SQL Performance Tuning, big data, database, datomic, nosql, philly ete, programming techniques"},{"@type":"BreadcrumbList","@id":"https:\/\/www.garysieling.com\/blog\/philly-ete-database-as-a-value-summary\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog#listItem","position":1,"name":"Home","item":"https:\/\/www.garysieling.com\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog\/category\/data-science\/#listItem","name":"Data Science"}},{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog\/category\/data-science\/#listItem","position":2,"name":"Data Science","item":"https:\/\/www.garysieling.com\/blog\/category\/data-science\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog\/philly-ete-database-as-a-value-summary\/#listItem","name":"Philly ETE &#8211; Database as a Value"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog\/philly-ete-database-as-a-value-summary\/#listItem","position":3,"name":"Philly ETE &#8211; Database as a Value","previousItem":{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog\/category\/data-science\/#listItem","name":"Data Science"}}]},{"@type":"Organization","@id":"https:\/\/www.garysieling.com\/blog\/#organization","name":"Gary Sieling","description":"Software Engineer","url":"https:\/\/www.garysieling.com\/blog\/"},{"@type":"Person","@id":"https:\/\/www.garysieling.com\/blog\/author\/gary\/#author","url":"https:\/\/www.garysieling.com\/blog\/author\/gary\/","name":"gary","image":{"@type":"ImageObject","@id":"https:\/\/www.garysieling.com\/blog\/philly-ete-database-as-a-value-summary\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/0be925276d848ffe98a6a9dc8cf33e67?s=96&d=identicon&r=g","width":96,"height":96,"caption":"gary"}},{"@type":"WebPage","@id":"https:\/\/www.garysieling.com\/blog\/philly-ete-database-as-a-value-summary\/#webpage","url":"https:\/\/www.garysieling.com\/blog\/philly-ete-database-as-a-value-summary\/","name":"Philly ETE \u2013 Database as a Value - Gary Sieling","description":"This was the first time I've seen Rich Hickey's talk on Datomic, which lent great clarity to the product. As implemented, Datomic functions as an immutable database for philosophical reasons, although in practice it doesn't manage it's own storage, and may eventually support deletions to satisfy legal and compliance issues around privacy. This database technology","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/www.garysieling.com\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/www.garysieling.com\/blog\/philly-ete-database-as-a-value-summary\/#breadcrumblist"},"author":{"@id":"https:\/\/www.garysieling.com\/blog\/author\/gary\/#author"},"creator":{"@id":"https:\/\/www.garysieling.com\/blog\/author\/gary\/#author"},"datePublished":"2013-04-04T01:03:54+00:00","dateModified":"2013-04-04T01:03:54+00:00"},{"@type":"WebSite","@id":"https:\/\/www.garysieling.com\/blog\/#website","url":"https:\/\/www.garysieling.com\/blog\/","name":"Gary Sieling","description":"Software Engineer","inLanguage":"en-US","publisher":{"@id":"https:\/\/www.garysieling.com\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"Gary Sieling - Software Engineer","og:type":"article","og:title":"Philly ETE \u2013 Database as a Value - Gary Sieling","og:description":"This was the first time I've seen Rich Hickey's talk on Datomic, which lent great clarity to the product. As implemented, Datomic functions as an immutable database for philosophical reasons, although in practice it doesn't manage it's own storage, and may eventually support deletions to satisfy legal and compliance issues around privacy. This database technology","og:url":"https:\/\/www.garysieling.com\/blog\/philly-ete-database-as-a-value-summary\/","article:published_time":"2013-04-04T01:03:54+00:00","article:modified_time":"2013-04-04T01:03:54+00:00","twitter:card":"summary_large_image","twitter:title":"Philly ETE \u2013 Database as a Value - Gary Sieling","twitter:description":"This was the first time I've seen Rich Hickey's talk on Datomic, which lent great clarity to the product. As implemented, Datomic functions as an immutable database for philosophical reasons, although in practice it doesn't manage it's own storage, and may eventually support deletions to satisfy legal and compliance issues around privacy. This database technology"},"aioseo_meta_data":{"post_id":"908","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"limit_modified_date":false,"created":"2023-02-04 16:11:45","updated":"2026-07-06 00:52:35","ai":null,"breadcrumb_settings":null,"seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.garysieling.com\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.garysieling.com\/blog\/category\/data-science\/\" title=\"Data Science\">Data Science<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tPhilly ETE \u2013 Database as a Value\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/www.garysieling.com\/blog"},{"label":"Data Science","link":"https:\/\/www.garysieling.com\/blog\/category\/data-science\/"},{"label":"Philly ETE &#8211; Database as a Value","link":"https:\/\/www.garysieling.com\/blog\/philly-ete-database-as-a-value-summary\/"}],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/posts\/908"}],"collection":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/comments?post=908"}],"version-history":[{"count":0,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/posts\/908\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/media?parent=908"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/categories?post=908"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/tags?post=908"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}