JavaScript in the Database
Frank Celler & Lucas Dohmen
www.arangodb.org (c) f.celler@triagens.de
Samstag, 1. Juni 13
The NoSQL Movement
www.arangodb.org (c) f.celler@triagens.de
Samstag, 1. Juni 13
CAP
www.arangodb.org (c) f.celler@triagens.de
ACID
BASE
Samstag, 1. Juni 13
www.arangodb.org (c) f.celler@triagens.de
nosql.eventbrite.com
distributed structured
data storage
Samstag, 1. Juni 13
Your Entities
A Person has a
Name, first and last
one or more addresses, emails,
telephone
a list of hobbies, skills, tags
www.arangodb.org (c) f.celler@triagens.de
Samstag, 1. Juni 13
Relational World
www.arangodb.org (c) f.celler@triagens.de
PersonPersonPerson
AddressAddressAddress
HobbyHobbyHobby
emailemailemail
n-to-mn-to-mn-to-m
n-to-mn-to-mn-to-m
n-to-mn-to-mn-to-m
Samstag, 1. Juni 13
Use Aggregates
Do not Normalize
www.arangodb.org (c) f.celler@triagens.de
{ name: { first: „Frank“, last: „Celler“ },
address: { home: { street: „...“, city: „...“ } },
email: { work: „frank@celler.de“ },
hobbies: [ „C++“, „MRuby“, „JavaScript“ ] }
Samstag, 1. Juni 13
Document Databases
documents can be
as simple as key/value maps
or as complex as lists containing embedded
sub-documents
or anything in between
representated in JSON
Schema-less
www.arangodb.org (c) f.celler@triagens.de
Samstag, 1. Juni 13
www.arangodb.org (c) f.celler@triagens.de 9
Samstag, 1. Juni 13
www.arangodb.org (c) f.celler@triagens.de 10
Analytic Processing DBsTransaction Processing DBs
Managing the evolving state of an IT system
Map/Reduce
Graphs
Extensibility
Key/Value
Column-
Stores
Complex
Queries
Structured
Data
Massively
Distributed
Documents
Samstag, 1. Juni 13
Property Graphs
www.arangodb.org (c) f.celler@triagens.de
Type: inproceeding
Title: Finite Size Effects
Type: proceeding
Title: Neural Modeling
Type: person
Name: Anthony C. C. Coolen
Label: written
Label: published
Pages: 99-120
Type: person
Name: Snchez-Andrs
Label: edited
Just Documents
Samstag, 1. Juni 13
Multi-Model Databases
www.arangodb.org (c) f.celler@triagens.de
vertices and edges are documents
query them using geo-index, full-text,
SQL-like queries
relations are expressed as graphs
traverse them using graph algorithms
Samstag, 1. Juni 13
ArangoDB.explain()
www.arangodb.org (c) f.celler@triagens.de
{
"type": "NoSQL database",
"model": [ "document", "graph", "key-value" ],
"openSource": true,
"license“: "apache",
"version": 1.3,
"builtWith": [ "C", "C++", "js" ],
"Javascript": [ "client side", "server side" ],
"uses": [ "V8" ]
}
Samstag, 1. Juni 13
Why Use JavaScript?
www.arangodb.org (c) f.celler@triagens.de
Samstag, 1. Juni 13
JavaScript Everywhere
in the Browser
Application-Layer (Node.JS)
Database
www.arangodb.org (c) f.celler@triagens.de
Samstag, 1. Juni 13
Why is Node not enough?
www.arangodb.org (c) f.celler@triagens.de
Samstag, 1. Juni 13
JavaScript in a Database
MVC in the Browser and/or NODE.JS
Script-Language in the DB for
transactions as functions
graph traversal
no-backend, just API
www.arangodb.org (c) f.celler@triagens.de
Samstag, 1. Juni 13
db._create("accounts");
db.accounts.save({ _key: "john", amount: 423 });
db.accounts.save({ _key: "fred", amount: 197 });
db._executeTransaction({
collections: {
write: "accounts"
},
params: {
user1: "fred",
user2: "john",
amount: 10
},
action: function (params) {
var db = require("internal").db;
var account1 = db.accounts.document(params['user1']);
var account2 = db.accounts.document(params['user2']);
var amount = params['amount'];
if (account1.amount < amount) {
throw "account of user '" + user1 + "' does not have enough money!";
}
db.accounts.update(account1, { amount : account1.amount - amount });
db.accounts.update(account2, { amount : account2.amount + amount });
/* will commit the transaction and return the value true */
return true;
}
});
www.arangodb.org (c) f.celler@triagens.de
Transactions
Samstag, 1. Juni 13
db._executeTransaction({
collections: {
write: "accounts"
},
params: {
user1: "fred",
user2: "john",
amount: 10
},
action: function (params) {
var db = require("internal").db;
var account1 = db.accounts.document(params['user1']);
var account2 = db.accounts.document(params['user2']);
var amount = params['amount'];
if (account1.amount < amount) {
throw "account of user '" + user1 + "' does not have enough money!";
}
db.accounts.update(account1, { amount : account1.amount - amount });
db.accounts.update(account2, { amount : account2.amount + amount });
www.arangodb.org (c) f.celler@triagens.de
Transactions
Samstag, 1. Juni 13
function traverse (graph, start, depth, maxlen) {
var config = {
datasource: traversal.collectionDatasourceFactory(graph._edges),
strategy: Traverser.BREADTH_FIRST,
expander: traversal.anyExpander,
filter: traversal.maxDepthFilter,
maxDepth: depth,
uniqueness: { edges: Traverser.UNIQUE_GLOBAL, vertices: Traverser.UNIQUE_NONE },
visitor: coauthorVisitor(maxlen)
};
var traverser = new Traverser(config);
var result = { positions: {}, vertices: [], links: [], minYear: 0, maxYear: 0 };
var first = graph._vertices.firstExample({ name: start });
if (first !== null) {
traverser.traverse(result, first);
}
return {
start: start,
depth: depth,
minYear: result.minYear,
maxYear: result.maxYear,
vertices: result.vertices,
links: result.links };
}
www.arangodb.org (c) f.celler@triagens.de
Graph Traversal
Samstag, 1. Juni 13
function traverse (graph, start, depth, maxlen) {
var config = {
datasource: traversal.collectionDatasourceFactory(graph._edges),
strategy: Traverser.BREADTH_FIRST,
expander: traversal.anyExpander,
filter: traversal.maxDepthFilter,
maxDepth: depth,
uniqueness: { edges: Traverser.UNIQUE_GLOBAL,
vertices: Traverser.UNIQUE_NONE },
visitor: coauthorVisitor(maxlen)
};
www.arangodb.org (c) f.celler@triagens.de
Graph Traversal
Samstag, 1. Juni 13
No Back-End?
www.arangodb.org (c) f.celler@triagens.de
Samstag, 1. Juni 13
To Be Continued ... Now
Fork me on github
Google Group: ArangoDB
Twitter: @fceller & @arangodb
www.arangodb.org
www.arangodb.org (c) f.celler@triagens.de
Stay in Touch:
Samstag, 1. Juni 13

Hotcode 2013: Javascript in a database (Part 1)

  • 1.
    JavaScript in theDatabase Frank Celler & Lucas Dohmen www.arangodb.org (c) f.celler@triagens.de Samstag, 1. Juni 13
  • 2.
    The NoSQL Movement www.arangodb.org(c) f.celler@triagens.de Samstag, 1. Juni 13
  • 3.
  • 4.
  • 5.
    Your Entities A Personhas a Name, first and last one or more addresses, emails, telephone a list of hobbies, skills, tags www.arangodb.org (c) f.celler@triagens.de Samstag, 1. Juni 13
  • 6.
    Relational World www.arangodb.org (c)f.celler@triagens.de PersonPersonPerson AddressAddressAddress HobbyHobbyHobby emailemailemail n-to-mn-to-mn-to-m n-to-mn-to-mn-to-m n-to-mn-to-mn-to-m Samstag, 1. Juni 13
  • 7.
    Use Aggregates Do notNormalize www.arangodb.org (c) f.celler@triagens.de { name: { first: „Frank“, last: „Celler“ }, address: { home: { street: „...“, city: „...“ } }, email: { work: „frank@celler.de“ }, hobbies: [ „C++“, „MRuby“, „JavaScript“ ] } Samstag, 1. Juni 13
  • 8.
    Document Databases documents canbe as simple as key/value maps or as complex as lists containing embedded sub-documents or anything in between representated in JSON Schema-less www.arangodb.org (c) f.celler@triagens.de Samstag, 1. Juni 13
  • 9.
  • 10.
    www.arangodb.org (c) f.celler@triagens.de10 Analytic Processing DBsTransaction Processing DBs Managing the evolving state of an IT system Map/Reduce Graphs Extensibility Key/Value Column- Stores Complex Queries Structured Data Massively Distributed Documents Samstag, 1. Juni 13
  • 11.
    Property Graphs www.arangodb.org (c)f.celler@triagens.de Type: inproceeding Title: Finite Size Effects Type: proceeding Title: Neural Modeling Type: person Name: Anthony C. C. Coolen Label: written Label: published Pages: 99-120 Type: person Name: Snchez-Andrs Label: edited Just Documents Samstag, 1. Juni 13
  • 12.
    Multi-Model Databases www.arangodb.org (c)f.celler@triagens.de vertices and edges are documents query them using geo-index, full-text, SQL-like queries relations are expressed as graphs traverse them using graph algorithms Samstag, 1. Juni 13
  • 13.
    ArangoDB.explain() www.arangodb.org (c) f.celler@triagens.de { "type":"NoSQL database", "model": [ "document", "graph", "key-value" ], "openSource": true, "license“: "apache", "version": 1.3, "builtWith": [ "C", "C++", "js" ], "Javascript": [ "client side", "server side" ], "uses": [ "V8" ] } Samstag, 1. Juni 13
  • 14.
    Why Use JavaScript? www.arangodb.org(c) f.celler@triagens.de Samstag, 1. Juni 13
  • 15.
    JavaScript Everywhere in theBrowser Application-Layer (Node.JS) Database www.arangodb.org (c) f.celler@triagens.de Samstag, 1. Juni 13
  • 16.
    Why is Nodenot enough? www.arangodb.org (c) f.celler@triagens.de Samstag, 1. Juni 13
  • 17.
    JavaScript in aDatabase MVC in the Browser and/or NODE.JS Script-Language in the DB for transactions as functions graph traversal no-backend, just API www.arangodb.org (c) f.celler@triagens.de Samstag, 1. Juni 13
  • 18.
    db._create("accounts"); db.accounts.save({ _key: "john",amount: 423 }); db.accounts.save({ _key: "fred", amount: 197 }); db._executeTransaction({ collections: { write: "accounts" }, params: { user1: "fred", user2: "john", amount: 10 }, action: function (params) { var db = require("internal").db; var account1 = db.accounts.document(params['user1']); var account2 = db.accounts.document(params['user2']); var amount = params['amount']; if (account1.amount < amount) { throw "account of user '" + user1 + "' does not have enough money!"; } db.accounts.update(account1, { amount : account1.amount - amount }); db.accounts.update(account2, { amount : account2.amount + amount }); /* will commit the transaction and return the value true */ return true; } }); www.arangodb.org (c) f.celler@triagens.de Transactions Samstag, 1. Juni 13
  • 19.
    db._executeTransaction({ collections: { write: "accounts" }, params:{ user1: "fred", user2: "john", amount: 10 }, action: function (params) { var db = require("internal").db; var account1 = db.accounts.document(params['user1']); var account2 = db.accounts.document(params['user2']); var amount = params['amount']; if (account1.amount < amount) { throw "account of user '" + user1 + "' does not have enough money!"; } db.accounts.update(account1, { amount : account1.amount - amount }); db.accounts.update(account2, { amount : account2.amount + amount }); www.arangodb.org (c) f.celler@triagens.de Transactions Samstag, 1. Juni 13
  • 20.
    function traverse (graph,start, depth, maxlen) { var config = { datasource: traversal.collectionDatasourceFactory(graph._edges), strategy: Traverser.BREADTH_FIRST, expander: traversal.anyExpander, filter: traversal.maxDepthFilter, maxDepth: depth, uniqueness: { edges: Traverser.UNIQUE_GLOBAL, vertices: Traverser.UNIQUE_NONE }, visitor: coauthorVisitor(maxlen) }; var traverser = new Traverser(config); var result = { positions: {}, vertices: [], links: [], minYear: 0, maxYear: 0 }; var first = graph._vertices.firstExample({ name: start }); if (first !== null) { traverser.traverse(result, first); } return { start: start, depth: depth, minYear: result.minYear, maxYear: result.maxYear, vertices: result.vertices, links: result.links }; } www.arangodb.org (c) f.celler@triagens.de Graph Traversal Samstag, 1. Juni 13
  • 21.
    function traverse (graph,start, depth, maxlen) { var config = { datasource: traversal.collectionDatasourceFactory(graph._edges), strategy: Traverser.BREADTH_FIRST, expander: traversal.anyExpander, filter: traversal.maxDepthFilter, maxDepth: depth, uniqueness: { edges: Traverser.UNIQUE_GLOBAL, vertices: Traverser.UNIQUE_NONE }, visitor: coauthorVisitor(maxlen) }; www.arangodb.org (c) f.celler@triagens.de Graph Traversal Samstag, 1. Juni 13
  • 22.
    No Back-End? www.arangodb.org (c)f.celler@triagens.de Samstag, 1. Juni 13
  • 23.
    To Be Continued... Now Fork me on github Google Group: ArangoDB Twitter: @fceller & @arangodb www.arangodb.org www.arangodb.org (c) f.celler@triagens.de Stay in Touch: Samstag, 1. Juni 13