Your SlideShare is downloading. ×
Considerations for using NoSQL technology on your next IT project - Akmal Chaudhri
Upcoming SlideShare
Loading in...5

Thanks for flagging this SlideShare!

Oops! An error has occurred.


Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

Considerations for using NoSQL technology on your next IT project - Akmal Chaudhri


Published on

Over the past few years, we have seen the emergence and growth of NoSQL technology. This has attracted interest from organizations looking to solve new business problems. There are also examples of …

Over the past few years, we have seen the emergence and growth of NoSQL technology. This has attracted interest from organizations looking to solve new business problems. There are also examples of how this technology has been used to bring practical and commercial benefits to some organizations. However, since it is still an emerging technology, careful consideration is required in finding the relevant developer skills and choosing the right product. This presentation will discuss these issues in greater detail. In particular, it will focus on some of the leading NoSQL products, such as MongoDB, Cassandra, Redis, and Neo4j and will discuss their architectures and suitability for different problems. Short demonstrations, using Java, are planned to give the audience a feel for the practical aspects of such products.

Published in: Technology, Business

  • Be the first to comment

No Downloads
Total Views
On Slideshare
From Embeds
Number of Embeds
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

No notes for slide


  • 1. Considerations for using{"no":"SQL"} technology onyour next IT projectAkmal B. Chaudhri(艾克摩 曹理)
  • 2. AbstractOver the past few years, we have seen the emergenceand growth in NoSQL technology. This has attractedinterest from organizations looking to solve newbusiness problems. There are also examples of how thistechnology has been used to bring practical andcommercial benefits to some organizations. However,since it is still an emerging technology, carefulconsideration is required in finding the relevantdeveloper skills and choosing the right product. Thispresentation will discuss these issues in greater detail. Inparticular, it will focus on some of the leading NoSQLproducts and discuss their architectures and suitabilityfor different problems
  • 3. Agenda
  • 4. In a packed program ...• Introduction• Market analysis• NoSQL• Security and vulnerability• Polyglot persistence• Benchmarks and performance• BI/Analytics• NoSQL alternatives• Summary• Resources
  • 5. In a packed program ...• Introduction• Market analysis• NoSQL• Security and vulnerability• Polyglot persistence• Benchmarks and performance• BI/Analytics• NoSQL alternatives• Summary• Resources
  • 6. In a packed program ...• Introduction• Market analysis• NoSQL• Security and vulnerability• Polyglot persistence• Benchmarks and performance• BI/Analytics• NoSQL alternatives• Summary• Resources
  • 7. In a packed program ...• Introduction• Market analysis• NoSQL• Security and vulnerability• Polyglot persistence• Benchmarks and performance• BI/Analytics• NoSQL alternatives• Summary• Resources
  • 8. In a packed program ...• Introduction• Market analysis• NoSQL• Security and vulnerability• Polyglot persistence• Benchmarks and performance• BI/Analytics• NoSQL alternatives• Summary• Resources
  • 9. Introduction
  • 10. My background• ~25 years experience in IT– Developer (Reuters)– Academic (City University)– Consultant (Logica)– Technical Architect (CA)– Senior Architect (Informix)– Senior IT Specialist (IBM)• Broad industry experience• Worked with varioustechnologies– Programming languages– IDE– Database Systems• Client-facing roles– Developers– Senior executives– Journalists• Community outreach• 10 books, many presentations
  • 11. HistoryHave you run into limitations withtraditional relational databases? Don’tmind trading a query language forscalability? Or perhaps you just like shinynew things to try out? Either way thismeetup is for you.Join us in figuring out why these newfangled Dynamo clones and BigTableshave become so popular lately.Source:
  • 13. Gartner hype curveNoSQL
  • 14. Innovation adoption lifecycleSource:
  • 15. Crossing the chasmChasm
  • 16. 20 years ago
  • 17. 10 years ago
  • 18. Today
  • 19. The way developers really thinkOOXMLNoSQL
  • 20. NoSQL is developer-friendlyOther StakeholdersDevelopers
  • 21. But ...Riak ... We’re talking about nearly a yearof learning.[1]Things I wish I knew about MongoDB ayear ago[2]I am learning Cassandra. It is not easy.[3][1][2][3]
  • 22. NoSQL hoopla and hype
  • 23. Extra! extra! ...
  • 24. Extra! extra! ...Source: Inspired by “The Next Big Thing 2012” The Wall Street Journal 27 September 2012
  • 25. Extra! extra! ...
  • 26. Extra! extra! ...
  • 27. Extra! extra!Source: Inspired by the movie “Airplane!” (1980)
  • 28. Past proclamations of the imminentdemise of relational technology• Object databases vs. relational– GemStone, ObjectStore, Objectivity, etc.• In-memory databases vs. relational– TimesTen, SolidDB, etc.• Persistence frameworks vs. relational– Hibernate, OpenJPA, etc.• XML databases vs. relational– Tamino, BaseX, etc.• Column-store databases vs. relational– Sybase IQ, Vertica, etc.
  • 29. Market analysis
  • 30. NoSQL market size ...• Private companies donot publish results• Venture Capital (VC)funding 10s/100s ofmillions of US $[1]• NoSQL softwarerevenue was US $20million in 2011[2][1][2]
  • 31. NoSQL market sizeSource:
  • 32. NoSQL job trendsSource: (August 2012)Example:100,000x 0.08 %= 80 jobs!
  • 33. NoSQL jobs in the UK• Database andBusiness Intelligence– MongoDB (696)– Cassandra (291)– Redis (242)– CouchDB (122)– Hive (70)– HBase (67)– Neo4j (52)– Couchbase (38)Source: (May 2013)
  • 34. DB-Engines ranking ...Source: (November 2012)
  • 35. DB-Engines rankingSource: (November 2012)
  • 36. PaaS example ...Source: Jelastic, used with permission
  • 37. PaaS exampleSource: Jelastic, used with permission
  • 38. NoSQL
  • 39. NoSQL The Movie!Sequel
  • 40. Why did NoSQL datastores arise?• Some applications need very few databasefeatures, but need high scale• Desire to avoid data/schema pre-designaltogether for simple applications• Need for a low-latency, low-overhead API toaccess data• Simplicity -- do not need fancy indexing -- justfast lookup by primary key
  • 41. NoSQL driversSource: Couchbase NoSQL Survey (December 2011)
  • 42. Source: 451 Research, used with permission
  • 43. How many systems?Source: (October 2012)
  • 44. Major categories of NoSQL ...Type ExamplesDocument storeColumn storeKey-value storeGraph store
  • 45. Major categories of NoSQLDocument store Column storeKey-value store Graph storeKeyDocument(collection of key-values)Key CF1:C1CF1:C2CF2:C1CF3:C1Key Binary Data Key PropertiesNode 1Key PropertiesNode 2Key PropertiesRelationship 1
  • 46. Source: Ilya Katsov, used with permission
  • 47. Commercialization examples
  • 48. Document store• Represent rich, hierarchical data structures,reducing the need for multi-table joins• Structure of the documents need not be known apriori, can be variable, and evolve instantly, buta query can understand the contents of adocument• Use cases: rapid ingest and delivery for evolvingschemas and web-based objects
  • 49. Connectionprivate static final String DBNAME = "demodb";private static final String COLLNAME = "people";...MongoClient mongoClient = new MongoClient("localhost", 27017);DB db = mongoClient.getDB(DBNAME);DBCollection collection = db.getCollection(COLLNAME);System.out.println("Connected to MongoDB");
  • 50. CreateBasicDBObject document = new BasicDBObject();List<String> likes = new ArrayList<String>();likes.add("satay");likes.add("kebabs");likes.add("fish-n-chips");document.put("name", "akmal");document.put("age", 40);document.put("date", new Date());document.put("likes", likes);collection.insert(document);
  • 51. ReadBasicDBObject document = new BasicDBObject();document.put("name", "akmal");DBCursor cursor = collection.find(document);while (cursor.hasNext())System.out.println(;cursor.close();
  • 52. UpdateBasicDBObject document = new BasicDBObject();document.put("name", "akmal");BasicDBObject newDocument = new BasicDBObject();newDocument.put("age", 29);BasicDBObject updateObj = new BasicDBObject();updateObj.put("$set", newDocument);collection.update(document, updateObj);
  • 53. DeleteBasicDBObject document = new BasicDBObject();document.put("name", "akmal");collection.remove(document);
  • 54. Connectionvar async = require(async);var MongoClient = require(mongodb).MongoClient;MongoClient.connect("mongodb://localhost:27017/demodb",function(err, db) {if (err) {return console.log(err);}console.log("Connected to MongoDB");var collection = db.collection(people);var document = {name:akmal,age:40,date:new Date(),likes:[satay, kebabs, fish-n-chips]};
  • 55. Createfunction (callback) {collection.insert(document, {w:1}, function(err, result) {if (err) {return callback(err);}callback();});},
  • 56. Readfunction (callback) {collection.findOne({name:akmal}, function(err, item) {if (err) {return callback(err);}console.log(item);callback();});},
  • 57. Updatefunction (callback) {collection.update({name:akmal}, {$set:{age:29}}, {w:1},function(err, result) {if (err) {return callback(err);}callback();});},
  • 58. Deletefunction (callback) {collection.remove({name:akmal}, function(err, result) {if (err) {return callback(err);}callback();});},
  • 59. Column store ...• Manage structured data, with multiple-attributeaccess• Columns are grouped together in “column-families/groups”; each storage block containsdata from only one column/column set to providedata locality for “hot” columns• Column groups defined a priori, but supportvariable schemas within a column group
  • 60. Column store• Scale using replication, multi-node distributionfor high availability and easy failover• Optimized for writes• Use cases: high throughput verticals (activityfeeds, message queues), caching, weboperations
  • 61. ConnectionClass.forName("org.apache.cassandra.cql.jdbc.CassandraDriver");connection = DriverManager.getConnection("jdbc:cassandra://localhost:9160/demodb");System.out.println("Connected to Cassandra");
  • 62. CreateString query ="BEGIN BATCHn" +"INSERT INTO people (name, age, date, likes) VALUES (akmal, 40, "+ new Date() +", {satay, kebabs, fish-n-chips})n" +"APPLY BATCH;";Statement statement = connection.createStatement();statement.executeUpdate(query);statement.close();
  • 63. ReadString query = "SELECT * FROM people";Statement statement = connection.createStatement();ResultSet cursor = statement.executeQuery(query);while ( (int j = 1; j < cursor.getMetaData().getColumnCount()+1; j++)System.out.printf("%-10s: %s%n",cursor.getMetaData().getColumnName(j),cursor.getString(cursor.getMetaData().getColumnName(j)));cursor.close();statement.close();
  • 64. UpdateString query ="UPDATE people SET age = 29 WHERE name = akmal";Statement statement = connection.createStatement();statement.executeUpdate(query);statement.close();
  • 65. DeleteString query ="BEGIN BATCHn" +"DELETE FROM people WHERE name = akmaln" +"APPLY BATCH;";Statement statement = connection.createStatement();statement.executeUpdate(query);statement.close();
  • 66. Key-value store• Simplest NoSQL stores, provide low-latencywrites but single key/value access• Store data as a hash table of keys where everykey maps to an opaque binary object• Easily scale across many machines• Use-cases: applications that require massiveamounts of simple data (sensor, weboperations), applications that require rapidlychanging data (stock quotes), caching
  • 67. ConnectionJedis j = new Jedis("localhost", 6379);j.connect();System.out.println("Connected to Redis");
  • 68. CreateString id = Long.toString(j.incr("global:nextUserId"));j.set("uid:" + id + ":name", "akmal");j.set("uid:" + id + ":age", "40");j.set("uid:" + id + ":date", new Date().toString());j.sadd("uid:" + id + ":likes", "satay");j.sadd("uid:" + id + ":likes", "kebabs");j.sadd("uid:" + id + ":likes", "fish-n-chips");j.hset("uid:lookup:name", "akmal", id);
  • 69. ReadString id = j.hget("uid:lookup:name", "akmal");print("name ", j.get("uid:" + id + ":name"));print("age ", j.get("uid:" + id + ":age"));print("date ", j.get("uid:" + id + ":date"));print("likes ", j.smembers("uid:" + id + ":likes"));
  • 70. UpdateString id = j.hget("uid:lookup:name", "akmal");j.set("uid:" + id + ":age", "29");
  • 71. DeleteString id = j.hget("uid:lookup:name", "akmal");j.del("uid:" + id + ":name");j.del("uid:" + id + ":age");j.del("uid:" + id + ":date");j.del("uid:" + id + ":likes");
  • 72. Graph store• Use nodes, relationships between nodes, andkey-value properties• Access data using graph traversal, navigatingfrom start nodes to related nodes according tograph algorithms• Faster for associative data sets• Use cases: storing and reasoning on complexand connected data, such as inferencingapplications in healthcare, government, telecom,oil, performing closure on social networkinggraphs
  • 73. Connectionprivate static final String DB_PATH ="C:/neo4j-community-1.8.2/data/graph.db";private static enum RelTypes implements RelationshipType {LIKES}...graphDb =new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH);registerShutdownHook(graphDb);System.out.println("Connected to Neo4j");
  • 74. CreateTransaction tx = graphDb.beginTx();try {firstNode = graphDb.createNode();firstNode.setProperty("name", "akmal");firstNode.setProperty("age", 40);firstNode.setProperty("date", new Date().toString());secondNode = graphDb.createNode();secondNode.setProperty("food", "satay, kebabs, fish-n-chips");relationship = firstNode.createRelationshipTo(secondNode,RelTypes.LIKES);relationship.setProperty("likes", "likes");tx.success();} finally { tx.finish(); }
  • 75. ReadTransaction tx = graphDb.beginTx();try {print("name", firstNode.getProperty("name"));print("age", firstNode.getProperty("age"));print("date", firstNode.getProperty("date"));print("likes", secondNode.getProperty("food"));tx.success();} finally { tx.finish(); }
  • 76. UpdateTransaction tx = graphDb.beginTx();try {firstNode.setProperty("age", 29);tx.success();} finally { tx.finish(); }
  • 77. DeleteTransaction tx = graphDb.beginTx();try {firstNode.getSingleRelationship(RelTypes.LIKES,Direction.OUTGOING).delete();firstNode.delete();secondNode.delete();tx.success();} finally { tx.finish(); }
  • 78. NoSQL use cases ...• Online/mobile gaming– Leaderboard (high score table) management– Dynamic placement of visual elements– Game object management– Persisting game/user state information– Persisting user generated data (e.g. drawings)• Display advertising on web sites– Ad Serving: match content with profile and present– Real-time bidding: match cookie profile with advertinventory, obtain bids, and present advert
  • 79. NoSQL use cases• Dynamic content management and publishing(news and media)– Store content from distributed authors, with fastretrieval and placement– Manage changing layouts and user generated content• E-commerce/social commerce– Storing frequently changing product catalogs• Social networking/online communities• Communications– Device provisioning
  • 80. Use case requirements ...• Schema flexibility and development agility– Application not constrained by fixed pre-definedschema– Application drives the schema– Ability to develop a minimal application rapidly, anditerate quickly in response to customer feedback– Ability to quickly add, change or delete “fields” ordata-elements– Ability to handle a mix of structured and unstructureddata– Easier, faster programming, so faster time to marketand quick to adapt
  • 81. Use case requirements ...• Consistent low latency, even under high load– Typically milliseconds or sub-milliseconds, for readsand writes– Even with millions of users• Dynamic elasticity– Rapid horizontal scalability– Ability to add or delete nodes dynamically– Application transparent elasticity, such as automatic(re)distribution of data, if needed– Cloud compatibility
  • 82. Use case requirements• High availability– 24 x 7 x 365 availability– (Today) Requires data distribution and replication– Ability to upgrade hardware or software without anydown time• Low cost– Commonly available hardware– Lower cost software, such as open source or pay-per-use in cloud– Reduced need for database administration, andmaintenance
  • 83. Security andvulnerability
  • 84. Security
  • 85. NoSQL injection attacks ...• NoSQL systems arevulnerable• Various types ofattacks• Understand thevulnerabilities andconsequences
  • 86. PolyglotpersistenceSource: Heroku, used with permission
  • 87. Polyglot persistenceUser Sessions Financial Data Shopping Cart RecommendationsProduct Catalog Reporting Analytics User Activity LogsSource: Adapted from
  • 88. Polyglot persistence examples• Disney– Cassandra, Hadoop, MongoDB• Interactive Mediums– CouchDB, MySQL• Mendeley– HBase, MongoDB, Solr, Voldemort• Netflix– Cassandra, Hadoop/HBase, RDBMS, SimpleDB• Twitter– Cassandra, FlockDB, Hadoop/HBase, MySQL
  • 89. Polyglot persistence• NoSQL product specialization requiresdeveloper knowledge and skills for eachplatform• Different APIs– Develop public API for each NoSQL store (Disney)
  • 90. Public API for NoSQL storeIn some cases, the team decided to hidethe platform’s complexity from users; notto facilitate its use, but to keep loose-cannon developers from doing somethingcrazy that could take down the wholecluster. It could show them all the controlsand knobs in a NoSQL database, but “theytend to shoot each other,” Jacob said.“First they shoot themselves, then theyshoot each other.”Source: “How Disney built a big data platform on a startup budget” Derrick Harris (2012)
  • 91. Benchmarks andperformance
  • 92. Yahoo Cloud Serving BM ...• Originally Tested Systems– Cassandra, HBase, Yahoo!’s PNUTS,sharded MySQL• Tier 1 (performance)– Latency by increasing the server load• Tier 2 (scalability)– Scalability by increasing the number ofservers
  • 93. Yahoo Cloud Serving BM• Yahoo Cloud ServingBenchmark (YCSB)– Research paper– Slide deck• Altoros Report– 50+ pages• Thumbtack Report– 40+ pages
  • 94. Linked Data Benchmark Council• EU-funded project• Develop Graph and RDF benchmarks
  • 95. BI/Analytics
  • 96. Architectures• NoSQL reports• NoSQL thru and thru• NoSQL + MySQL• NoSQL as ETL source• NoSQL programs in BI tools• NoSQL via BI database (SQL)Source: Nicholas Goodman
  • 97. NoSQL alternatives
  • 98. Source: 451 Research, used with permission
  • 99. What about Oracle?
  • 100. Summary
  • 101. Structured vs. unstructuredStructured
  • 102. Relational vs. NoSQL toolbox
  • 103. Relational vs. NoSQL ...It is specious to compare NoSQLdatabases to relational databases; asyou’ll see, none of the so-called “NoSQL”databases have the same implementation,goals, features, advantages, anddisadvantages. So comparing “NoSQL” to“relational” is really a shell game.-- Eben HewittSource: “Cassandra: The Definitive Guide” Eben Hewitt (2010)
  • 104. Limitations of NoSQL• Lack of standardized or well-defined semantics– Transactions? Isolation levels?• Reduced consistency for performance andscalability– “Eventual consistency”– “Soft commit”• Limited forms of access, e.g. often no joins, etc.• Proprietary interfaces• Large clusters, failover, etc.?• Security?
  • 105. Choices, choices
  • 106. Traditional RDBMSSimpleSlowSmallFastComplexLargeApplicationComplexityValue of Individual Data Item Aggregate Data ValueDataValueVelocityInteractiveInteractiveRealReal--timetimeAnalyticsAnalyticsRecord LookupRecord LookupHistoricalHistoricalAnalyticsAnalyticsExploratoryExploratoryAnalyticsAnalyticsTransactionalTransactional AnalyticAnalyticSource: VoltDB, used with permission
  • 107. Understand your use caseSource:
  • 108. Understand vendor-speakWhat vendor says What vendor meansThe biggest in the world The biggest one we’ve gotThe biggest in the universe The biggest one we’ve gotThere is no limit to ... It’s untested, but we don’t mind if youtry itA new and unique feature Something the competition has had foragesCurrently available feature We are about to start Beta testingPlanned feature Something the competition has, that wewish we had too, that we might haveone dayHighly distributed International officesEngineered for robustness Comes in a tough boxSource: “Object Databases: An Evaluation and Comparison” Bloor Research (1994)
  • 109. Contact details
  • 110. Find me on ...–––––––
  • 111. Akmal B.
  • 112. {"thank":"You"}
  • 113. Resources
  • 114. History• First NoSQL meetup––• First NoSQL meetup debrief–• First NoSQL meetup photographs–
  • 115. NoSQL Search roadshow• Multi-city tour 2013– Munich– Berlin– San Francisco– Copenhagen– Zurich– Amsterdam– LondonSource:
  • 116. Web sites• NoSQL Databases and Polyglot Persistence: ACurated Guide–• NoSQL: Your Ultimate Guide to the Non-Relational Universe!–
  • 117. Free books ...• The Little MongoDB Book–• The Little Redis Book–
  • 118. Free books• CouchDB: The Definitive Guide–• A Little Riak Book–
  • 119. Free training• Free courses on MongoDB–
  • 120. Articles• Saying Yes to NoSQL–• The State of NoSQL–
  • 121. White papers• The CIO’s Guide toNoSQL–
  • 122. Product selection ...• 101 Questions to Ask When Considering aNoSQL Database–• 35+ Use Cases for Choosing Your Next NoSQLDatabase–
  • 123. Product selection• NoSQL Options Compared: Different Horses forDifferent Courses–• NoSQL Data Modeling Techniques–• Choosing a NoSQL data store according to yourdata set–
  • 124. Short product overviews ...• Picking the Right NoSQL Database Tool–• NoSQL Databases -- A Look at ApacheCassandra–• The NoSQL Databases -- A Look at HBase–
  • 125. Short product overviews ...• A Look at Some NoSQL Databases --MongoDB, Redis and Basho Riak–• Picking the Right NoSQL Database, Part 4 --CouchDB and Membase–
  • 126. Short product overviews• Cassandra vs MongoDB vs CouchDB vs Redisvs Riak vs HBase vs Couchbase vs Neo4j vsHypertable vs ElasticSearch vs Accumulo vsVoltDB vs Scalaris comparison–•–
  • 127. Case studies ...• Real World NoSQL: HBase at Trend Micro–• Real World NoSQL: MongoDB at Shutterfly–• Real World NoSQL: Cassandra at Openwave–
  • 128. Case studies• Real World NoSQL: Amazon SimpleDB at Netflix–• Real World NoSQL: Membase at Tribal Crossing–• How Disney built a big data platform on a startupbudget–
  • 129. Security ...• NoSQL, no security?–• NoSQL, No Injection!?–• Attacking MongoDB–• NoSQL, But Even Less Security–
  • 130. Security• NoSQL Database Security– Nyffenegger V1.pdf• Does NoSQL Mean No Security?–• A Response To NoSQL Security Concerns–
  • 131. Polyglot persistence ...• Polyglot Persistence–• HBase at Mendeley–• Polyglot Persistence Patterns–
  • 132. Polyglot persistence• Polyglot Persistence: EclipseLink with MongoDBand Derby–• D. Ghosh (2010) Multiparadigm data storage forenterprise applications. IEEE Software. Vol. 27,No. 5, pp. 57-60
  • 133. Performance benchmarks ...• Yahoo Cloud Serving Benchmark–––• Benchmarking Couchbase Server–
  • 134. Performance benchmarks ...• Ultra-High Performance NoSQL Benchmarking–• Benchmarking Top NoSQL Databases–
  • 135. Performance benchmarks ...• MongoDB Performance Pitfalls -- Behind TheScenes–• MySQL vs. MongoDB Disk Space Usage–• MongoDB: Scaling write performance–
  • 136. Performance benchmarks• Can the Elephants Handle the NoSQLOnslaught?–• Solving Big Data Challenges for EnterpriseApplication Performance Management–• Linked Data Benchmark Council–
  • 137. BI/Analytics• BI/Analytics on NoSQL: Review of ArchitecturesPart 1–• BI/Analytics on NoSQL: Review of ArchitecturesPart 2–
  • 138. Various graphics ...• Database Landscape Map -- December 2012–• Necessity is the mother of NoSQL–• NoSQL, Heroku, and You–
  • 139. Various graphics• The NoSQL vs. SQL hoopla, another turn of thescrew!–• Navigating the Database Universe–
  • 140. Discussion fora• NoSQL–• NewSQL–• Google groups–
  • 141. London meetup groups ...• Cassandra–• MongoDB–• Neo4j–• Redis–
  • 142. London meetup groups• Riak–
  • 143. NoSQL jokes/humour ...• LinkedIn discussion thread–• NoSQL Better Than MySQL?–– Shorter version of “Episode 1 - MongoDB is WebScale”• say No! No! and No! (=NoSQL Parody)–
  • 144. NoSQL jokes/humour• C.R.U.D.–– Scroll-back for some great humour on NoSQL!
  • 145. Miscellaneous ...• Powerpoint template–• Autostereogram–• Theatre Curtain Animations–
  • 146. Miscellaneous ...• Bar and Column charts–• Newspaper headlines–• Pie charts–
  • 147. Miscellaneous• Icons and images–––––