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 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

No notes for slide

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

  1. 1. Considerations for using{"no":"SQL"} technology onyour next IT projectAkmal B. Chaudhri(艾克摩 曹理)
  2. 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. 3. Agenda
  4. 4. In a packed program ...• Introduction• Market analysis• NoSQL• Security and vulnerability• Polyglot persistence• Benchmarks and performance• BI/Analytics• NoSQL alternatives• Summary• Resources
  5. 5. In a packed program ...• Introduction• Market analysis• NoSQL• Security and vulnerability• Polyglot persistence• Benchmarks and performance• BI/Analytics• NoSQL alternatives• Summary• Resources
  6. 6. In a packed program ...• Introduction• Market analysis• NoSQL• Security and vulnerability• Polyglot persistence• Benchmarks and performance• BI/Analytics• NoSQL alternatives• Summary• Resources
  7. 7. In a packed program ...• Introduction• Market analysis• NoSQL• Security and vulnerability• Polyglot persistence• Benchmarks and performance• BI/Analytics• NoSQL alternatives• Summary• Resources
  8. 8. In a packed program ...• Introduction• Market analysis• NoSQL• Security and vulnerability• Polyglot persistence• Benchmarks and performance• BI/Analytics• NoSQL alternatives• Summary• Resources
  9. 9. Introduction
  10. 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. 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:
  12. 12. Your road leads to NoSQL?NoSQLNoSQLNoSQLNoSQLNoSQLNoSQLNoSQLNoSQL
  13. 13. Gartner hype curveNoSQL
  14. 14. Innovation adoption lifecycleSource:
  15. 15. Crossing the chasmChasm
  16. 16. 20 years ago
  17. 17. 10 years ago
  18. 18. Today
  19. 19. The way developers really thinkOOXMLNoSQL
  20. 20. NoSQL is developer-friendlyOther StakeholdersDevelopers
  21. 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. 22. NoSQL hoopla and hype
  23. 23. Extra! extra! ...
  24. 24. Extra! extra! ...Source: Inspired by “The Next Big Thing 2012” The Wall Street Journal 27 September 2012
  25. 25. Extra! extra! ...
  26. 26. Extra! extra! ...
  27. 27. Extra! extra!Source: Inspired by the movie “Airplane!” (1980)
  28. 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. 29. Market analysis
  30. 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. 31. NoSQL market sizeSource:
  32. 32. NoSQL job trendsSource: (August 2012)Example:100,000x 0.08 %= 80 jobs!
  33. 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. 34. DB-Engines ranking ...Source: (November 2012)
  35. 35. DB-Engines rankingSource: (November 2012)
  36. 36. PaaS example ...Source: Jelastic, used with permission
  37. 37. PaaS exampleSource: Jelastic, used with permission
  38. 38. NoSQL
  39. 39. NoSQL The Movie!Sequel
  40. 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. 41. NoSQL driversSource: Couchbase NoSQL Survey (December 2011)
  42. 42. Source: 451 Research, used with permission
  43. 43. How many systems?Source: (October 2012)
  44. 44. Major categories of NoSQL ...Type ExamplesDocument storeColumn storeKey-value storeGraph store
  45. 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. 46. Source: Ilya Katsov, used with permission
  47. 47. Commercialization examples
  48. 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. 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. 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. 51. ReadBasicDBObject document = new BasicDBObject();document.put("name", "akmal");DBCursor cursor = collection.find(document);while (cursor.hasNext())System.out.println(;cursor.close();
  52. 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. 53. DeleteBasicDBObject document = new BasicDBObject();document.put("name", "akmal");collection.remove(document);
  54. 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. 55. Createfunction (callback) {collection.insert(document, {w:1}, function(err, result) {if (err) {return callback(err);}callback();});},
  56. 56. Readfunction (callback) {collection.findOne({name:akmal}, function(err, item) {if (err) {return callback(err);}console.log(item);callback();});},
  57. 57. Updatefunction (callback) {collection.update({name:akmal}, {$set:{age:29}}, {w:1},function(err, result) {if (err) {return callback(err);}callback();});},
  58. 58. Deletefunction (callback) {collection.remove({name:akmal}, function(err, result) {if (err) {return callback(err);}callback();});},
  59. 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. 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. 61. ConnectionClass.forName("org.apache.cassandra.cql.jdbc.CassandraDriver");connection = DriverManager.getConnection("jdbc:cassandra://localhost:9160/demodb");System.out.println("Connected to Cassandra");
  62. 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. 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. 64. UpdateString query ="UPDATE people SET age = 29 WHERE name = akmal";Statement statement = connection.createStatement();statement.executeUpdate(query);statement.close();
  65. 65. DeleteString query ="BEGIN BATCHn" +"DELETE FROM people WHERE name = akmaln" +"APPLY BATCH;";Statement statement = connection.createStatement();statement.executeUpdate(query);statement.close();
  66. 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. 67. ConnectionJedis j = new Jedis("localhost", 6379);j.connect();System.out.println("Connected to Redis");
  68. 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. 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. 70. UpdateString id = j.hget("uid:lookup:name", "akmal");j.set("uid:" + id + ":age", "29");
  71. 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. 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. 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. 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. 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. 76. UpdateTransaction tx = graphDb.beginTx();try {firstNode.setProperty("age", 29);tx.success();} finally { tx.finish(); }
  77. 77. DeleteTransaction tx = graphDb.beginTx();try {firstNode.getSingleRelationship(RelTypes.LIKES,Direction.OUTGOING).delete();firstNode.delete();secondNode.delete();tx.success();} finally { tx.finish(); }
  78. 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. 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. 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. 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. 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. 83. Security andvulnerability
  84. 84. Security
  85. 85. NoSQL injection attacks ...• NoSQL systems arevulnerable• Various types ofattacks• Understand thevulnerabilities andconsequences
  86. 86. PolyglotpersistenceSource: Heroku, used with permission
  87. 87. Polyglot persistenceUser Sessions Financial Data Shopping Cart RecommendationsProduct Catalog Reporting Analytics User Activity LogsSource: Adapted from
  88. 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. 89. Polyglot persistence• NoSQL product specialization requiresdeveloper knowledge and skills for eachplatform• Different APIs– Develop public API for each NoSQL store (Disney)
  90. 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. 91. Benchmarks andperformance
  92. 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. 93. Yahoo Cloud Serving BM• Yahoo Cloud ServingBenchmark (YCSB)– Research paper– Slide deck• Altoros Report– 50+ pages• Thumbtack Report– 40+ pages
  94. 94. Linked Data Benchmark Council• EU-funded project• Develop Graph and RDF benchmarks
  95. 95. BI/Analytics
  96. 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. 97. NoSQL alternatives
  98. 98. Source: 451 Research, used with permission
  99. 99. What about Oracle?
  100. 100. Summary
  101. 101. Structured vs. unstructuredStructured
  102. 102. Relational vs. NoSQL toolbox
  103. 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. 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. 105. Choices, choices
  106. 106. Traditional RDBMSSimpleSlowSmallFastComplexLargeApplicationComplexityValue of Individual Data Item Aggregate Data ValueDataValueVelocityInteractiveInteractiveRealReal--timetimeAnalyticsAnalyticsRecord LookupRecord LookupHistoricalHistoricalAnalyticsAnalyticsExploratoryExploratoryAnalyticsAnalyticsTransactionalTransactional AnalyticAnalyticSource: VoltDB, used with permission
  107. 107. Understand your use caseSource:
  108. 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. 109. Contact details
  110. 110. Find me on ...–––––––
  111. 111. Akmal B.
  112. 112. {"thank":"You"}
  113. 113. Resources
  114. 114. History• First NoSQL meetup––• First NoSQL meetup debrief–• First NoSQL meetup photographs–
  115. 115. NoSQL Search roadshow• Multi-city tour 2013– Munich– Berlin– San Francisco– Copenhagen– Zurich– Amsterdam– LondonSource:
  116. 116. Web sites• NoSQL Databases and Polyglot Persistence: ACurated Guide–• NoSQL: Your Ultimate Guide to the Non-Relational Universe!–
  117. 117. Free books ...• The Little MongoDB Book–• The Little Redis Book–
  118. 118. Free books• CouchDB: The Definitive Guide–• A Little Riak Book–
  119. 119. Free training• Free courses on MongoDB–
  120. 120. Articles• Saying Yes to NoSQL–• The State of NoSQL–
  121. 121. White papers• The CIO’s Guide toNoSQL–
  122. 122. Product selection ...• 101 Questions to Ask When Considering aNoSQL Database–• 35+ Use Cases for Choosing Your Next NoSQLDatabase–
  123. 123. Product selection• NoSQL Options Compared: Different Horses forDifferent Courses–• NoSQL Data Modeling Techniques–• Choosing a NoSQL data store according to yourdata set–
  124. 124. Short product overviews ...• Picking the Right NoSQL Database Tool–• NoSQL Databases -- A Look at ApacheCassandra–• The NoSQL Databases -- A Look at HBase–
  125. 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. 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. 127. Case studies ...• Real World NoSQL: HBase at Trend Micro–• Real World NoSQL: MongoDB at Shutterfly–• Real World NoSQL: Cassandra at Openwave–
  128. 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. 129. Security ...• NoSQL, no security?–• NoSQL, No Injection!?–• Attacking MongoDB–• NoSQL, But Even Less Security–
  130. 130. Security• NoSQL Database Security– Nyffenegger V1.pdf• Does NoSQL Mean No Security?–• A Response To NoSQL Security Concerns–
  131. 131. Polyglot persistence ...• Polyglot Persistence–• HBase at Mendeley–• Polyglot Persistence Patterns–
  132. 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. 133. Performance benchmarks ...• Yahoo Cloud Serving Benchmark–––• Benchmarking Couchbase Server–
  134. 134. Performance benchmarks ...• Ultra-High Performance NoSQL Benchmarking–• Benchmarking Top NoSQL Databases–
  135. 135. Performance benchmarks ...• MongoDB Performance Pitfalls -- Behind TheScenes–• MySQL vs. MongoDB Disk Space Usage–• MongoDB: Scaling write performance–
  136. 136. Performance benchmarks• Can the Elephants Handle the NoSQLOnslaught?–• Solving Big Data Challenges for EnterpriseApplication Performance Management–• Linked Data Benchmark Council–
  137. 137. BI/Analytics• BI/Analytics on NoSQL: Review of ArchitecturesPart 1–• BI/Analytics on NoSQL: Review of ArchitecturesPart 2–
  138. 138. Various graphics ...• Database Landscape Map -- December 2012–• Necessity is the mother of NoSQL–• NoSQL, Heroku, and You–
  139. 139. Various graphics• The NoSQL vs. SQL hoopla, another turn of thescrew!–• Navigating the Database Universe–
  140. 140. Discussion fora• NoSQL–• NewSQL–• Google groups–
  141. 141. London meetup groups ...• Cassandra–• MongoDB–• Neo4j–• Redis–
  142. 142. London meetup groups• Riak–
  143. 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. 144. NoSQL jokes/humour• C.R.U.D.–– Scroll-back for some great humour on NoSQL!
  145. 145. Miscellaneous ...• Powerpoint template–• Autostereogram–• Theatre Curtain Animations–
  146. 146. Miscellaneous ...• Bar and Column charts–• Newspaper headlines–• Pie charts–
  147. 147. Miscellaneous• Icons and images–––––