Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Datomic Spotlight
Search
Amitay Horwitz
August 24, 2017
Programming
130
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Datomic Spotlight
Amitay Horwitz
August 24, 2017
Transcript
50 slides
DATOMIC @amitayh THE FUNCTIONAL DATABASE
FULL DISCLOSURE ⚠
ABOUT DATOMIC • Developed by Cognitect • Initial release 2012
• Designed by Rich Hickey (author of the Clojure programming language) • Used by Facebook, Netflix, more…
FACTS ✅
FACTS • “Abraham Lincoln is the president of the United
States”
FACTS • “Abraham Lincoln is the president of the United
States” • “Abraham Lincoln was elected president of the United States on March 4, 1861”
FACTS • Abraham Lincoln • Position • President • March
4, 1861 Entity Attribute Value Timestamp
FACT = DATOM Entity Attribute Value Tx Operation
FACT = DATOM Entity Attribute Value Tx Operation 1033 :first-name
"Abraham" 260 add 1033 :last-name "Lincoln" 260 add 1033 :position "Lawyer" 277 add
FACT = DATOM Entity Attribute Value Tx Operation 1033 :first-name
"Abraham" 260 add 1033 :last-name "Lincoln" 260 add 1033 :position "Lawyer" 277 add 1033 :position "President" 522 add
FACT = DATOM Entity Attribute Value Tx Operation 1033 :first-name
"Abraham" 260 add 1033 :last-name "Lincoln" 260 add 1033 :position "Lawyer" 277 add 1033 :position "President" 522 add 1033 :position "President" 881 retract
FACT BASED MODEL Facts Facts Facts Facts Facts Facts Facts
Facts Time Facts Facts Time
GIT Facts Facts Facts Facts Objects Facts Facts Objects Time
Facts Objects Time
A DATABASE • A collection of datoms • At a
specific point in time • An immutable value
DATABASE AS A VALUE • Same as 42 is a
value • Safe to share, easy to reason about • Functions that take a database as an argument, or return a database
TIME BUILT IN • Get the database value as of,
or since, a point in time • See how the database would have looked like as if certain transactions took place • Reactive transaction reports
QUERIES
DATALOG • Equivalent to relational model + recursion • Declarative,
expressive and powerful • Pattern matching style • No more string concatenation!
EXAMPLE DATABASE Entity Attribute Value 42 :email
[email protected]
43 :email
[email protected]
42 :orders 107 42 :orders 141
DATA PATTERN Constrains the results returned, binds variables: [?customer :email
?email] Attribute Value Entity
DATA PATTERN Constrains the results returned, binds variables: [?customer :email
?email] Constant Variable Variable
Entity Attribute Value 42 :email
[email protected]
43 :email
[email protected]
42
:orders 107 42 :orders 141 “Find all customers with emails” [?customer :email ?email]
Entity Attribute Value 42 :email
[email protected]
43 :email
[email protected]
42
:orders 107 42 :orders 141 “Find a particular customer’s email” [42 :email ?email]
Entity Attribute Value 42 :email
[email protected]
43 :email
[email protected]
42
:orders 107 42 :orders 141 “What attributes does 42 have?” [42 ?attribute]
Entity Attribute Value 42 :email
[email protected]
43 :email
[email protected]
42
:orders 107 42 :orders 141 “What attributes and values does 42 have?” [42 ?attribute ?value]
WHERE CLAUSE [:find ?customer :where [?customer :email]] Data pattern
FIND CLAUSE [:find ?customer :where [?customer :email]]
IMPLICIT JOIN [:find ?customer :where [?customer :email] [?customer :orders]] “Find
all the customers who have placed orders”
PREDICATES [:find ?item :where [?item :item/price ?price] [(< 50 ?price)]]
“Find the expensive items”
CALLING FUNCTIONS [:find ?customer ?product :where [?customer :ship-address ?addr] [?adde
:zip ?zip] [?product :product/weight ?weight] [?product :product/price ?price] [(Shipping/estimate ?zip ?weight) ?ship-cost] [(<= ?price ?ship-cost)]] “Find me the customer/product combinations where the shipping cost dominates the product cost”
ARCHITECTURE
DATABASE ROLES • Queries • Transactions • Consistency • Storage
BREAK DOWN
DATOMIC COMPONENTS Peer library Transactor Storage
PEER LIBRARY Transactor Storage Peer library Your app • Embedded
in your app • Executed queries locally
Peer library Your app cache PEER LIBRARY Transactor Storage •
Reads data from storage • Caches locally
Peer library Your app cache Peer library Your app cache
Peer library Your app cache SCALE HORIZONTALLY Transactor Storage
TRANSACTOR Transactor Storage Peer library Your app • Standalone service
• Scales vertically
Transactor TRANSACTOR Transactor Storage Peer library Your app • Standalone
service • Scales vertically • Hot standby for failover
Transactor TRANSACTOR Storage Peer library Your app • Coordinates writes
• Guarantees ACID transactions (isolation level “serializable”)
Storage Transactor TRANSACTOR Peer library Your app • Writes transaction
log to storage • Generates indices
Peer library Your app cache Peer library Your app cache
Peer library Your app cache Storage Transactor TRANSACTOR • Broadcasts live updates
STORAGE Transactor Storage Peer library Your app • Provided as
a service • Many different backends
LOCAL STORAGE Transactor Storage Peer library Your app • Memory
• Filesystem • Great for testing!
NEARBY STORAGE Transactor Storage Peer library Your app • SQL
database (any JDBC)
DISTRIBUTED STORAGE ☁ Transactor Storage Peer library Your app •
DynamoDB • Riak • CouchBase • Cassandra • …
Peer library Your app cache Peer library Your app cache
Peer library Your app cache SHARED MEMCACHED Transactor Storage Memcached
EVENT SOURCING? • Datomic is lower level - facts vs
events • Annotate transactions! • Querying already built in • Listen on transaction queue to build reactive systems
Q&A
RESOURCES • http://www.datomic.com/ • Intro to Datomic by Rich Hickey
- http://wix.to/b8CQABU • The Value of Values by Rich Hickey - http://wix.to/D8CRABU • Datomic Datalog - http://wix.to/cMCQABU
More Decks by Amitay Horwitz
See All by Amitay Horwitz
Transducers
amitayh
0
72
Building event sourced systems with Kafka Streams
amitayh
1
1.2k
Event Sourcing with Kafka Streams
amitayh
1
1.2k
TDD For The Curious
amitayh
0
310
Other Decks in Programming
See All in Programming
Claude Code ハーネスDeep Dive – 君はどこまで制御する? -
takateeen_knj
6
5.7k
[Kotlin Fest 2026] eBPF Tracing for Kotlin
takehaya
1
130
まずはコードより業務と向き合う:テーブル解体のためにPdMを呼んだ話
sakawe_ee
0
230
當我們開始不讀 Code - AI Agent 時代,Code Review 與 Clean Code 還剩下什麼?
jame2408
1
370
Distance field of Julia set
kinakomoti321
0
320
선언형 햅틱 라이브러리 진동을 소개합니다
l2hyunwoo
1
310
AIが生成したコードは読むべきか?抽象化設計とコードの品質保証 / abstraction-design-and-quality
minodriven
16
9.1k
コード生成時代のAPI定義を支えるRequest Spec移行
pvcresin
0
100
PyConTW 2026 - AI Coding 不只是工具升級, 區域醫院醫療資訊系統協作開發與資訊團隊轉型實踐
cclai999
0
250
そのデザイントークン、Flutterでも同じ見た目になりますか?
nakamizu
0
350
Coding with AI: How to trust the storyteller (AWS Community Day Adria, Ljubljana 2026)
slobodan
0
150
Rails初心者がパスキーを実装してみて大変だったこと
ktombow
0
190
Featured
See All Featured
Are puppies a ranking factor?
jonoalderson
2
4.2k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
31k
Accessibility Awareness
sabderemane
1
300
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
Speed Design
sergeychernyshev
33
2.2k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.9k
How to make the Groovebox
asonas
2
2.6k
A Soul's Torment
seathinner
9
3.9k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.7k
Large-scale JavaScript Application Architecture
addyosmani
516
110k
Believing is Seeing
oripsolob
1
280