Functions are the unit of composition Created, stored, passed around for use by higher order functions, e.g. reduce. ! Prefer to use pure functions Those with no side-effects or I/O. Easier to reason about, test, and compose. Functional programming
Prefer to pass unadorned data through mostly pure functions, ! rather than creating typed instances and mutating in place via methods. ! Then, both the data and the logic are easier to compose and test! TL;DR
Storage Datomic’s architecture Consistent writes to storage Indexing Reads only while transacting Abstracted, can use any of: Internal: In memory, on disk with transactor External: SQL, Riak, DynamoDB, and more Transactor Only 1 process
Storage Peer Up to 30 procs Abstracted, can use any of: Internal: In memory, on disk with transactor External: SQL, Riak, DynamoDB, and more Reads from storage Inside your JVM app’s process Transparently cache from storage in local memory to satisfy reads Datomic’s architecture Consistent writes to storage Indexing Reads only while transacting Transactor Only 1 process
Datomic’s data model [entity attr value] ! ! Entities have attributes with values. Each EAV combination is a ‘datom’. Entities typically have many datoms.
Datomic’s data model [entity attr value tx] ! [123 :name “Robert” 456] [123 :likes “coffee” 456] [456 :tx-timestamp “2014-02-06”] Each datom refers to the transaction that created it. Transactions are also entities!
Datomic’s data model Schema defines only how attribute’s values behave. ! Required: Name, data type, cardinality (one or many). Optional: indexed, unique, and more. ! Datomic does not proscribe how you combine attributes on entities!
Cape Town Clojure User Group Meet 1 or 2 Thursday evenings a month Next meet: 6-9pm,14 February 2014 Venue: Codebridge in Claremont @clj_ug_ct ! Talk notes: http://is.gd/imm_db