Oracle's Take On NoSQL

Preview:

DESCRIPTION

History of NoSQL, architecture of Oralce's NoSQL database, examples for using it in Java

Citation preview

Oracle's Take On NoSQL

Alexander Shopov <ash@kambanaria.org>

By day: Software Engineer at CiscoBy night: OSS contributorCoordinator of Bulgarian Gnome TP Contacts:

E-mail: ash@kambanaria.org Jabber: al_shopov@jabber.minus273.org LinkedIn: http://www.linkedin.com/in/alshopov SlideShare: http://www.slideshare.net/al_shopovWeb: Just search “al_shopov”

[ash@edge ~]$ whoami

Please Learn And Share

License: CC-BY v4.0

Contents

● What is NoSQL?● Has it beaten SQL?● What is Oracle's take on it?● Do these have any foothold with us?

The NoSQL Story

What is NoSQL

● Hardest question we will have to answer today● Simplest definition is that NoSQL databases are

a set (not even a family) of mechanisms for storage and retrieval of data that try to be: – highly available

– able to scale horizontally

Simple, yet true?

● Simple answers may be simple, though they are not necessarily correct

● Especially with NoSQL because:

● NoSQL isn't (something)

● NoSQL isn't (something)

● NoSQL is (NOT something)

In particular

● NoSQL are data stores that are NOT relational databases

● They are something else● Thus it follows that they are not relational● And some say they are not even true

databases

NoSQL = Without SQL?

● Perhaps a datastore without a SQL dialect of its own?

● Well no – some NoSQL solutions do have SQL or SQL- ish dialects

● So NoSQL is not even NO to SQL

Not Only SQL

● Which is fair enough, but a subtle point● Not in terms of black and white, cool – not cool,

works – sucks binary viewpoints● And then it should be NOSQL, but it is NoSQL● But this still does not explain things

How did the term NoSQL caught on then?

● You should know the answer – many people hate SQL

● And SQL is easy to hate!● It is large, Large, LARGE, LARGE – Oracle

SQL Language reference for 12.1 is 1826 pages.

● Have you actually seen the whole rail-road diagram for Oracle's SELECT anywhere?

SQL – Love or Hate?

● It is not a single language, rather it is a family of dialects by competing companies

● Have you seen the standard (9 parts, 10th under way, more than 4000 pages)?

● Do you even care about the standard?

As Academic As You Can Get

● SQL is not even relational● It is a language of bags, rather than sets

If you can make the last point – you do not hate SQL, you have

grown used to it

What else NoSQL is not?

● Martin Folwer says NoSQL should be called NoDBA because developers use NoSQL to run around traditional databases with their DBAs and bureaucracies.

Dear DBAs,Do your developers love you?

Do they hate you?

The term NoSQL

● Was coined in 1998 by Carlo Strozzi

● Lightweight relational database that lacks SQL dialect – NoSQL

● NoSQL should be NoREL

The current usage of the term is a #tag

● Started in 2009 when Eric Evans who worked at Rackspace

● He proposed NoSQL as a Twitter #tag for a conference for the existing distributed databases

● The term stayed and gained popularity

NoSQL stems from needs that are

● Hard● Impossible● Or even worse – prohibitively expensive to fulfil

with a traditional relational databases

Examples

● Not-structured data or hard to model in a relational way

● Big data - generated by interuser interaction (Facebook), imported from external sources (WWW)

● Bringing structure to otherwise unstructured data – what we usually model as LOBs or BLOBs in RDBMS

● Graphs – Hierarchies in RDBMS (even bi-directional). Storing

vertices and edges in a table and then modeling paths with joins – like the Entity Attribute Value anti-pattern

NoSQL comes from the need to scale out cheaply

NoSQL comes from the need to scale out cheaply

NoSQL comes from the need to scale out cheaply

Origins of Scale

● Towards Robust Distributed Systems – Symposium on Principles of Distributed Computing - 2000

● Eric Brewer then at Inktomi

● Called his conjecture – the CAP theorem

Proven as theorem in 2002 by Nancy Lynch and Seth Gilbert

The Fall Of the Triad2 Out of 3

`

Consistency Availability

Tolerance to network partitions

The Fall Of the Triad2 Out of 3

`

Consistency Availability

Tolerance to network partitions

You cannot have full availability – all operations can proceed,even writes

The Fall Of the Triad2 Out of 3

`

Consistency Availability

Tolerance to network partitions

You cannot have full availability – all operations can proceed,even writes

While keeping consistency - all nodes have the same data(not the same as C in ACID)

The Fall Of the Triad2 Out of 3

`

Consistency Availability

Tolerance to network partitions

You cannot have full availability – all operations can proceed,even writes

When you havepartitions –machines that cannotcommunicate

While keeping consistency - all nodes have the same data(not the same as C in ACID)

A Somewhat Better Representation100% consistency

100% availability

100% partition tolerance

Impossible to achieve

A Somewhat Better Representation100% consistency

100% availability

100% partition tolerance

Impossible to achieve

The Whole Volume Is Interesting

Do Not Forget100% consistency

100% availability

100% partition tolerance

Impossible to achieve

These are actuallymultidimensional

A Single System Can Wander In The Space

100% consistency

100% availability

100% partition tolerance

Impossible to achieve

Or Have Data Operations In Different Points At The Same Time

100% consistency

100% availability

100% partition tolerance

Impossible to achieve

CAP is easy to prove

● Think of two nodes on opposite sides of a partition● Allowing at least one node to update state will cause

the nodes to become inconsistent, thus forfeiting C.● If we preserve consistency, one side of the partition

must act as if it is unavailable, thus forfeiting A.● Only when nodes communicate is it possible to

preserve both consistency and availability, thereby forfeiting P.

ACID vs. BASE

● Brewer called these BASE: Basically Available, Soft state, Eventually consistent to pun the pun of Jim Gray

● But NoSQL caught on

A Typical NoSQL Taxonomy

● Key-value stores

A Typical NoSQL Taxonomy

● Key-value stores

● Document databases

A Typical NoSQL Taxonomy

● Key-value stores ● Column family stores

● Document databases

A Typical NoSQL Taxonomy

● Key-value stores ● Column family stores

● Graph databases● Document databases

A Typical NoSQL Taxonomy

● Key-value stores ● Column family stores

● Graph databases● Document databases

Not True Taxonomy

● These are folk taxonomies● What happens to exist currently● No family relations – no speciation● Even putting them in four corners is visually

lying – some key-value stores are very close to some document databases, while graph databases look like the odd man out and stand on their own

How do you use these NoSQLs?

● Get one or few values out of the store● Either modify and store● Or go on looking for other values● It is like pointer chasing● p->p1->p2->p3...

The Other Way to Use Is Map-Reduce

● Similar to the way we process garbage for recycling

● Make heaps of garbage, make many teams sort each out (map)

● Aggregate iron, plastics, paper, glass from each team (reduce)

● Very efficient batch processing● But it is batch processing

NoSQL are Less Capable than RDBMS

● Do not expect similar behavior or even capabilities – even when you have seen so on first glance in the documentation

● The maturity of RDBMS ecosystem and your expectations may be a bad service for the wild west of NoSQL

● Do not assume – double check

Less Sophisticated Than RDBMS

● Less to learn● Less to administer● Easy to start using● Similar to pointer and reference programming

models● Programmers like them

Loved By Developers? What About Admins And Operations?

● Ad Hoc Data Fixing – how?● Ad Hoc Data Querying – how?● Data Export – how?

So will NoSQL beat SQL?

● First – why do we ask this? Hype and fanboyism, tradition and rut all have their answer

● For some NoSQL has already beaten SQL (no matter what NoSQL and SQL mean)

● For others NoSQL is way too young and not providing even a part of what SQL does (similarly - no matter what NoSQL and SQL mean)

NoSQL is changing, so does SQL

● Champions of NoSQL like Google are moving closer to SQL and RDBMS– Declarativeness of SQL is fine and actually

developers like it

– Transactions help developers reason about what is happening, developers also like it

– No ACID in DB means it is maddengly hard to ACID on application level

– Speed is not everythg – it is just part of the equasion

● Move from batch to online processing

O, champion of NoSQL – Where Art Thou Now?

● Google– Spanner – ACID, SQL, schematized tables,

PAXOS, descendant of Megastore rather than BigTable

– F1 – General transactions, Paxos, relational schema + extensions hierarchy, rich data types,

● Facebook– Presto – standard SQL, window functions, ad hoc

queries

Michael Stonebraker

● Ingres● Postgres● Informix● Vertica● VoltDB● Next 5 slides –

quoting him

SQL is so last millenium, there is NewSQL

● The variety in NoSQL and competition among RDBMS are pushing traditional SQL engnes to differentiate more strongly

● No more – One size fits all

OLAP/DW

● Moving to column stores rather than traditional row oriented stores – 50-100 faster– No row per header

– Better compression

– IO much better for sparsely filled wide tables when running aggregates on several columns

● IBM DB2 (10.5, June 2013), Oracle (some in 11g2 2009 Exadata, more in 12c), MS SQL Server (some in 2012/2014 CTP1, June 2013), SAP HANA, MySQL

Current OLTP

2424

24 24

4

Buffer pool ≈ 24%

Locking ≈ 24%

Latching ≈ 24%

Recovery ≈ 24%

Useful work ≈ 4%

Ideal OLTP

100

Buffer pool ≈ 0%

Locking ≈ 0%

Latching ≈ 0%

Recovery ≈ 0%

Useful work ≈ 100%

How to get this ideal OLTP?

● Latching – due to multithreadness. Go single threaded, each core – like a single thread, divide memory or remove all shared data

● Buffer pool – go into main memory, use anticaching● Row level locking – MVCC, timestamp ordering,

lightweight locking● Recovery – replication rather than rely on Aries,

replicate via command logging– Algorithms for Recovery and Isolation Exploiting Semantics

The Oracle Story

Who Is This Guy?

Who Is This Guy?

● Designed and implemented Unix

Who Is This Guy?

● Designed and implemented Unix

● UTF-8

Who Is This Guy?

● Designed and implemented Unix

● UTF-8● B – the direct

predecessor of C● Go, Plan 9● Early Regex● Turing Award

Back in 1979

● As part of Unix he also wrote DBM (database manager)

● Basically a hashtable backed by disk storage

1971 197319701972 19701974 1975 19701976 1977 19701978 1979 19701980 19811970

To Put Tings Into Perspective

EdwardOates

Bruce Scott, 1st employee

EdwardOates

Bruce Scott, 1st employee

EdwardOates

RobertMiner

Bruce Scott, 1st employee

EdwardOates

RobertMiner

LawrenceJoseph

But this was yet to comeBack to the past

Unix Went To College – Berkeley

19701986 1987 19701988 1989 19701990 1991 19701992 1993 19701994 1995 19701996 1997

Unix Went To College – Berkeley

19701986 1987 19701988 1989 19701990 1991 19701992 1993 19701994 1995 19701996 1997

DBM becamendbm –

new databasemanager

Unix Went To College – Berkeley

19701986 1987 19701988 1989 19701990 1991 19701992 1993 19701994 1995 19701996 1997

DBM becamendbm –

new databasemanager

Lawsuit – in 1992, ended

in 1994. Effort to rewrite AT&T copyrighted

utilities.

Unix Went To College – Berkeley

19701986 1987 19701988 1989 19701990 1991 19701992 1993 19701994 1995 19701996 1997

DBM becamendbm –

new databasemanager

Lawsuit – in 1992, ended

in 1994. Effort to rewrite AT&T copyrighted

utilities.

LinusTorvaldsStartedLinux

Unix Went To College – Berkeley

19701986 1987 19701988 1989 19701990 1991 19701992 1993 19701994 1995 19701996 1997

DBM becamendbm –

new databasemanager

Lawsuit – in 1992, ended

in 1994. Effort to rewrite AT&T copyrighted

utilities.

LinusTorvaldsStartedLinux

KeithBostic

Designedthe API

Unix Went To College – Berkeley

19701986 1987 19701988 1989 19701990 1991 19701992 1993 19701994 1995 19701996 1997

DBM becamendbm –

new databasemanager

Lawsuit – in 1992, ended

in 1994. Effort to rewrite AT&T copyrighted

utilities.

LinusTorvaldsStartedLinux

KeithBostic

Designedthe API

MichaelOlson

Btreeimpl.

Unix Went To College – Berkeley

19701986 1987 19701988 1989 19701990 1991 19701992 1993 19701994 1995 19701996 1997

DBM becamendbm –

new databasemanager

Lawsuit – in 1992, ended

in 1994. Effort to rewrite AT&T copyrighted

utilities.

LinusTorvaldsStartedLinux

KeithBostic

Designedthe API

MichaelOlson

Btreeimpl.

Db 1.85 -part of 4.4 BSD

Unix Went To College – Berkeley

19701986 1987 19701988 1989 19701990 1991 19701992 1993 19701994 1995 19701996 1997

DBM becamendbm –

new databasemanager

Lawsuit – in 1992, ended

in 1994. Effort to rewrite AT&T copyrighted

utilities.

LinusTorvaldsStartedLinux

KeithBostic

Designedthe API

MichaelOlson

Btreeimpl.

Db 1.85 -part of 4.4 BSD

MargoSeltzer

Paperon TXvariant

Berkeley DB by Sleepycat Software

19701996 1997 19701998 1999 19702000 2001 19702002 2003 19702004 2005 19702006 2007

Berkeley DB by Sleepycat Software

19701996 1997 19701998 1999 19702000 2001 19702002 2003 19702004 2005 19702006 2007

SleepycatSoftware

Berkeley DB by Sleepycat Software

19701996 1997 19701998 1999 19702000 2001 19702002 2003 19702004 2005 19702006 2007

SleepycatSoftware

BerkleyDB 2.0 –

transactions

Berkeley DB by Sleepycat Software

19701996 1997 19701998 1999 19702000 2001 19702002 2003 19702004 2005 19702006 2007

SleepycatSoftware

BerkleyDB 2.0 –

transactions

BerkleyDB3.0 – API

Berkeley DB by Sleepycat Software

19701996 1997 19701998 1999 19702000 2001 19702002 2003 19702004 2005 19702006 2007

SleepycatSoftware

BerkleyDB 2.0 –

transactions

BerkleyDB3.0 – API

BerkleyDB 4.0 –

HA single master, multiple reader

Berkeley DB by Sleepycat Software

19701996 1997 19701998 1999 19702000 2001 19702002 2003 19702004 2005 19702006 2007

SleepycatSoftware

BerkleyDB 2.0 –

transactions

BerkleyDB3.0 – API

BerkleyDB 4.0 –

HA single master, multiple reader

BerkleyDB Java Edition

pure Javaimpl.

Berkeley DB by Oracle

19701996 1997 19701998 1999 19702000 2001 19702002 2003 19702004 2005 19702006 2007

SleepycatSoftware

BerkleyDB 2.0–

transactions

BerkleyDB3.0 – API

BerkleyDB 4.0 –

HA single master, multiple reader

BerkleyDB Java Edition

pure Javaimpl.

Oraclebought

Sleepycat – embedded DB

VMWareRedis2009

LinkedInVoldemort2009

TwitterFlockDB2010

AmazonDynamo2007

FacebookCassandra2008

Yahoo!PNUTS2008

BashoRiak2009

10genMongoDB2009

GoogleFileSystem2003

GoogleMapReduce2004

GoogleBigTable2006

ApacheCouchDB2005

ApacheHadoop2007

And Then Everybody And Their Dog Were Creating Databases

May 2011

Oracle Whitepaper

Debunking the NoSQL hype

Now available only in Internet

caches and torrent sites

Vive La Révolution!

● Just 4 months later on Oracle OpenWorld in start of October 2011 Oracle announced they were working on a NoSQL solution, availability – end of October 2011

● December 2011 – version 1.2.x● December 2012 – Oracle NoSQL Database 2.0,

11gR2 (11.2.x)● The Old Dog Learns The New Tricks – VERY,

VERY FAST

General ArchitectureStorage Nodes

Replication Node – DB of key value pairs

Divide keyspace into shards

PopulateStorage Nodes

Shard 1, Replication node 1, master

Shard 1, Replication node 1, master + replicas

Shard 1, 2, 3, Replication node 1, master

Shard 1, 2, 3, Replication node 1, master + replicas

Shard 1, 2, 3, RN 1, MR + REPShard 1, 2, 3, RN 2, MR

Shard 1, 2, 3, RN 1, MR + REPShard 1, 2, 3, RN 2, MR + REP

Add last masters

Add All Data

Clients With Clever Drivers – Less Roundtrips

Initialize Handle

private KVStore store;private KVStoreConfig config;

public void getHandle() { String[] hosts = {"localhost:5000", "127.0.0.1:5000"}; config = new KVStoreConfig("example", hosts); // set default time out config.setRequestTimeout(50, TimeUnit.MILLISECONDS); // can set consistency, durability // config.setConsistency(Consistency.ABSOLUTE) // .setDurability(Durability.COMMIT_SYNC); // set*Void() store = KVStoreFactory.getStore(config); }

Release Resources

public void release() { store.close();}

But Let's Do It the Java 7 Way

public void getHandleJava7() { try (KVStore store1 = KVStoreFactory.getStore(config)) { // MEAT GOES HERE } catch (Exception e) { } finally { }}

How to Write

public void writeKeyValue() throws UnsupportedEncodingException { List<String> major = new ArrayList<>(); major.add("Muffin"); major.add("Man"); List<String> minor = new ArrayList<>(); minor.add("address"); Key k = Key.createKey(major, minor); String address = "Drury Lane"; Value v = Value.createValue(address.getBytes("UTF-8")); store.put(k, v); store.putIfAbsent(k, v); store.putIfPresent(k, v); store.putIfVersion(k, v, null);}

How to Delete

public void deleteKeyValue(){ List<String> major = Arrays.asList("Muffin", "Man"); List<String> minor = Arrays.asList("address"); Key k = Key.createKey(major, minor); store.delete(k); store.multiDelete(Key.createKey(major), null, null);}

How to Read – 1

public void readARecord() throws UnsupportedEncodingException{ List<String> major = Arrays.asList("Muffin", "Man"); List<String> minor = Arrays.asList("address"); Key k = Key.createKey(major, minor); ValueVersion vv = store.get(k); Value v = vv.getValue(); String result = new String(v.getValue(), "UTF-8"); result.equals("Drury Lane");}

How to Read – 2

public void readFullMajor1Go(){ List<String> major = Arrays.asList("Muffin", "Man"); Key k = Key.createKey(major); // Single operation SortedMap<Key,ValueVersion> records = store.multiGet(k, null, null); for (Map.Entry<Key, ValueVersion> entry : records.entrySet()) { Key key = entry.getKey(); List<String> minor = key.getMinorPath(); ValueVersion vv = entry.getValue(); Value v = vv.getValue(); // Do some work with the Value here }}

How to Read – 3

public void readFullMajorManyGoes(){ List<String> major = Arrays.asList("Muffin", "Man"); Key k = Key.createKey(major); // Non atomic Iterator<KeyValueVersion> it = store.multiGetIterator( Direction.FORWARD, // BACKWARD, UNORDEREDED 0, // Batch size, 0 - use default k, // the key null, // KeyRange null); // Depth - CHILDREN_ONLY, PARENT_AND_CHILDREN, // DESCENDANTS_ONLY, PARENT_AND_DESCENDANTS while (it.hasNext()){ Value v = it.next().getValue(); // Do some work with the Value here }}

How to Read – 4

public void readPartialMatch() { List<String> major = Arrays.asList("Muffin"); Key k = Key.createKey(major); // Non atomic, read large part of DB Iterator<KeyValueVersion> it = store.storeIterator( Direction.UNORDERED, // BACKWARD, FORWARD 0, // Batch size, 0 - use default k, // the key null, // KeyRange null); // Depth - CHILDREN_ONLY, PARENT_AND_CHILDREN, // DESCENDANTS_ONLY, PARENT_AND_DESCENDANTS while (it.hasNext()){ Value v = it.next().getValue(); // Do some work with the Value here }}

Key ranges

public void prepareKeyRange() { // Bowerick Wowbagger the Infinitely Prolonged // Hitchhikers Guide To the Galaxy // Arthur Philip Dent - You are a jerk KeyRange kr = new KeyRange( "Arthur Philip Dent", // start true, // inclusive? [( "A-Rth-Urp-Hil-Ipdenu", // slug true); // inclusive? )]}

Sequence of Operations - TX

public void sequence(){ OperationFactory of = store.getOperationFactory(); List<Operation> ops = new ArrayList<>(); Key k = null; Value v = null; ops.add(of.createDelete(k)); ops.add(of.createPut(k, v)); // of.createDeleteIfVersion(); of.createPutIfAbsent(); // of.createPutIfPresent(); of.createPutIfVersion() try { store.execute(ops); } catch (OperationExecutionException | // cannot exec DurabilityException | // durability not met IllegalArgumentException | // list is , null∅ RequestTimeoutException e) { // timeout } catch (FaultException e) { // sth else }}

Apache Avro

Avro JSON Schemas

{ "type": "record", "namespace": "bgoug", "name": "Developer", "fields": [ { "name": "name", "type": "string", "default" : "NONE"}, { "name": "age", "type": "int", "default" : "NONE"}, { "name": "language", "type": "string", "default" : "Java"} ]}

Prepare Avro

public void prepareSchemas() throws IOException{ Map<String, Schema> schemas = new HashMap<>(); Schema.Parser parser = new Schema.Parser(); Schema developerSchema = parser.parse(new File("DeveloperSchema.avsc")); schemas.put(developerSchema.getFullName(), developerSchema); Schema dbAdminSchema = parser.parse(new File("DbAdminSchema.avsc")); schemas.put(dbAdminSchema.getFullName(), dbAdminSchema);}

Generic Avro

public void genericAvro(){ AvroCatalog catalog = store.getAvroCatalog(); GenericAvroBinding binding = catalog.getGenericMultiBinding(schemas); GenericRecord dev = new GenericData.Record(developerSchema); dev.put("name", "Sam A. Hacker"); dev.put("age", 37); dev.put("language", "Java"); Key k = null; //Key.createKey store.put(k, binding.toValue(dev)); Value v = store.get(k).getValue(); GenericRecord dbAdmin = binding.toObject(v); dbAdmin.get("name");}

Specific Avro

public void specificAvro(){ AvroCatalog catalog = store.getAvroCatalog(); SpecificAvroBinding binding = catalog.getSpecificMultiBinding(); // generate via provided ant task // org.apache.avro.compiler.specific.SchemaTask Developer dev = new Developer(); dev.setName("Sam. A. Hacker"); dev.setAge(37); dev.setLanguage("Java"); Key k = null; //Key.createKey store.put(k, binding.toValue(dev)); Value v = store.get(k).getValue(); SpecificRecord sr = binding.toObject(v); if (sr.getSchema().getFullName().equals("dba")){ DbAdmin dbAdmin = (DbAdmin) sr; }}

JSON Avro

public void jsonAvro(){ AvroCatalog catalog = store.getAvroCatalog(); JsonAvroBinding binding = catalog.getJsonMultiBinding(schemas); String jsonText = "{\"name\": \"Sam. A. Hacker\"," + " \"age\": 34, \"language\": \"Java\"}"; ObjectMapper jsonMapper = new ObjectMapper(); JsonNode json = jsonMapper.readTree(jsonText); JsonRecord dev = new JsonRecord(json, developerSchema); Key k = null; //Key.createKey store.put(k, binding.toValue(dev)); Value v = store.get(k).getValue(); JsonRecord jr = binding.toObject(v); if (jr.getSchema().getFullName().equals("dba")){ JsonNode dbAdmin = jr.getJsonNode(); dbAdmin.get("db"); }}

Licensing

● Community Edition – FLOSS, AGPLv3

● Enterprise edition:– SNMP, Oracle RDBMS compatibility, JMX

– $40/user/year (min. 25), $2000/processor/year

– RDBMS Standard Edition One ≤ NoSQL ≤ RDBMS Standard Edition

Further General Resources

● Martin Fowler: NoSQL Distilled to an hour http://vimeo.com/66052102

● Martin Fowler: NoSQL Distilled http://martinfowler.com/nosql.html

● Ilya Katsov: NoSQL Data Modelling Techniques http://highlyscalable.wordpress.com/2012/03/01/nosql-data-modeling-techniques/

● Christof Strauch: NoSQL Databases http://www.christof-strauch.de/nosqldbs.pdf

● Michael Stonebreaker http://slideshot.epfl.ch/play/suri_stonebraker

Further Resources on CAP

● Eric Brewer: Towards Robust Distributed Systems http://www.cs.berkeley.edu/~brewer/cs262b-2004/PODC-keynote.pdf

● Eric Brewer: NoSQL: Past, Present, Future http://www.infoq.com/presentations/NoSQL-History

● Eric Brewer: CAP Twelve Years Later: How the "Rules" Have Changed http://www.infoq.com/articles/cap-twelve-years-later-how-the-rules-have-changed

● Nancy Lynch, Seth Gilbert: Brewer’s Conjecture and the Feasibility of Consistent, Available, Partition-Tolerant Web Services http://lpd.epfl.ch/sgilbert/pubs/BrewersConjecture-SigAct.pdf

Further Oracle NoSQL Resources

● Oracle's Product Page: http://www.oracle.com/technetwork/products/nosqldb/overview/index.html

● Good Documentation: http://docs.oracle.com/cd/NOSQL/html/index.html

Code examples

● https://github.com/alshopov/OracleNoSQLExamples