nosql's biggest lie: sql never went away - martin esmann
Post on 16-Apr-2017
623 Views
Preview:
TRANSCRIPT
NoSQL's biggest lie: SQL never went away!Martin EsmannDeveloper Advocate, Couchbase
1
Let’s do something unspectacular
2
©2014 Couchbase Inc.
A query
3
SELECT * FROM `travel-sample` WHERE type = ‘airline’ AND country = ‘United Kingdom’;
©2014 Couchbase Inc.
A query
4
Did I say unspectacular?
5
©2014 Couchbase Inc.
That was JSON
6
So, what did we do?
7
©2014 Couchbase Inc.
We put the SQL back into NoSQL
8
But first, let’s take a step back
9
©2014 Couchbase Inc.
NoSQL?
10
Polyglot persistence is “…using multiple data
storage technologies, chosen based upon the
way data is being used by individual
applications. Why store binary images in
relational database, when there are better
storage systems?”
Martin Fowler and Pramod Sadalage
©2014 Couchbase Inc.
Types of NoSQL database
11
By Schumi4ever (Own work) [CC BY-‐SA 3.0 (http://creativecommons.org/licenses/by-‐sa/3.0)], via Wikimedia Commons
©2014 Couchbase Inc.
Key value
12
Email: martin@couchbase.comemail:email: {
“personal”: “martin.esmann@hotmail.com”,“work”: “martin@couchbase.com”
}
©2014 Couchbase Inc.
London
matthew@couchbase.comjames@couchbase.comlaura@couchbase.comtom@couchbase.comdavid@couchbase.comgreg@couchbase.com
Document
13
Developer Advocacy
matthew@couchbase.comjames@couchbase.comlaura@couchbase.comlaurent@couchbase.commartin@couchbase.commatt@couchbase.comnic@couchbase.comwill@couchbase.com
martin@couchbase.com:
{"city": ”Copenhagen","glasses": false,"team": "Developer Advocacy","music": ”Electronic!"
}
©2014 Couchbase Inc.
Document
14
London
matthew@couchbase.comjames@couchbase.comlaura@couchbase.com
Developer Advocacy
matthew@couchbase.comjames@couchbase.comlaura@couchbase.com
London and Developer Advocacy
matthew@couchbase.comjames@couchbase.comlaura@couchbase.com
©2014 Couchbase Inc.
And the others
15
Context is all
16
©2014 Couchbase Inc.
There's always a trade-‐off
17
• Offload from some other data store (i.e. caching)• Computation offload• Speed• Scalability• Availability• Flexibility in what you store• Query flexibility
Where Couchbase comes in
18
©2014 Couchbase Inc.
Couchbase Server 4.0
19
High availability cache
Key-‐value store
Document database N1QL SQL-‐like query
for JSON
N1QL: SQL for JSON
20
©2014 Couchbase Inc.
A user profile as JSON
21
How do we query that?
22
©2014 Couchbase Inc.
Querying the JSON profile
23
• Look-‐up documents: i.e. manual secondary indexing (2i)• Couchbase views: i.e. automated secondary indexing (2i)• N1QL
©2014 Couchbase Inc.
Manual 2i
24
©2014 Couchbase Inc.
Automatic 2i: views
25
©2014 Couchbase Inc.
N1QL
26
©2014 Couchbase Inc.
SELECT
27
SELECT ...
©2014 Couchbase Inc.
SELECT
28
SELECT 1 + 1;
{ "requestID": "3ccebac7-‐341a-‐4c31-‐a2c5-‐b46aaed54356", "signature": {
"$1": "number" }, "results": [
{ "$1": 2 }
], "status": "success", "metrics": {
"elapsedTime": "31.826219ms", "executionTime": "29.800616ms", "resultCount": 1, "resultSize": 31
}}
©2014 Couchbase Inc.
SELECT COUNT
29
SELECT COUNT(*) FROM `default`WHERE office = "London";
{"requestID": "6e733000-ac83-44ba-95a7-9b012e9c553d","signature": {
"$1": "number"},"results": [
{"$1": 6
}],"status": "success","metrics": {
"elapsedTime": "18.603124ms","executionTime": "18.327696ms","resultCount": 1,"resultSize": 31
}}
©2014 Couchbase Inc.
SELECT email FROM `default`WHERE office = "London";
SELECT
30
©2014 Couchbase Inc.
SELECT email FROM `default`WHERE office = "London"AND team = "Developer Advocacy";
SELECT
31
©2014 Couchbase Inc.
SELECT email FROM `default`WHERE office = "London"AND team != "Developer Advocacy";
SELECT
32
But this is JSON
33
©2014 Couchbase Inc.
SELECT conferences[0].nameAS event_name FROM `default`;
ARRAY ELEMENTS
34
©2014 Couchbase Inc.
SELECT DISTINCT conferences[0].nameAS event_name FROM `default`;
DISTINCT ARRAY ELEMENTS
35
©2014 Couchbase Inc.
SELECT DISTINCT conferences[0].nameAS event_name FROM `default`WHERE conferencesIS NOT MISSING;
REMOVE MISSING ITEMS
36
©2014 Couchbase Inc.
SELECT email AS person,conferences[0].name AS event FROM `default`WHERE ANY event in conferences SATISFIES event.name = "Droidcon Sweden" END;
WHO IS GOING TO DROIDCON SWEDEN?
37
What's going on underneath?
38
©2014 Couchbase Inc.
EXPLAIN SELECT email AS person,conferences[0].name AS event FROM `default`WHERE ANY event in conferences SATISFIES event.name = "Droidcon Sweden" END;
EXPLAIN
39
Is N1QL read-‐only?
40
©2014 Couchbase Inc.
Updating and deleting
41
• DELETE: provide the key to delete the document• INSERT: provide a key and some JSON to create a new document• UPSERT: as INSERT but will overwrite existing docs• UPDATE: change individual values inside existing docs
©2014 Couchbase Inc.
UPDATE
42
©2014 Couchbase Inc.
DELETE
43
A larger data-‐set: travel-‐sample
44
©2014 Couchbase Inc.
TRAVEL SAMPLE DATA
45
©2014 Couchbase Inc.
travel-‐sample
46
©2014 Couchbase Inc.
CREATE PRIMARY INDEX
47
CREATE PRIMARY INDEXON `travel-sample`USING GSI;
©2014 Couchbase Inc.
SELECT
48
SELECT * FROM `travel-sample`WHERE type = "airline";
©2014 Couchbase Inc.
SELECT
49
©2014 Couchbase Inc.
SELECT
50
SELECT * FROM `travel-sample`WHERE type = "airline"AND country = "United States";
©2014 Couchbase Inc.
SELECT
51
Indexes
52
©2014 Couchbase Inc.
CREATE INDEX
53
CREATE INDEX airline ON `travel-sample`(type)WHERE type = "airline"USING GSI;
JOINs
54
©2014 Couchbase Inc.
JOINs
55
• Retrieve data from two documents in a single SELECT• Join within a keyspace/bucket• Join across keyspaces/buckets
©2014 Couchbase Inc.
A SIMPLE JOIN
56
SELECT * FROM `travel-sample` r JOIN `travel-sample` a ON KEYS r.airlineidWHERE r.sourceairport="LHR" AND r.destinationairport = "SFO";
©2014 Couchbase Inc.
WHO FLIES LHR-‐>SFO?
57
SELECT DISTINCT a.name FROM `travel-sample` r JOIN `travel-sample` a ON KEYS r.airlineidWHERE r.sourceairport="LHR" AND r.destinationairport = "SFO";
©2014 Couchbase Inc.
UNNEST
58
• Breaks out nested JSON from the results
©2014 Couchbase Inc.
SOMETHING USEFUL
59
SELECT a.name, s.flight, s.utc, r.sourceairport, r.destinationairport, r.equipmentFROM `travel-sample` r UNNEST r.schedule sJOIN `travel-sample` a ON KEYS r.airlineidWHERE r.sourceairport="LHR" AND r.destinationairport = "SFO"AND s.day=1ORDER BY s.utc;
N1QL vs View’s
60
©2014 Couchbase Inc.
N1QL and views
61
N1QL Views
Ad-hoc querying Predictable queries
JSON in and JSON out Number crunching
Large growth clusters Multi-dimensional/geospatialqueries
Multi-‐dimensional scaling
62
©2014 Couchbase Inc.
Scaling out
63
Horizontal scaling▪ Partitions a dataset onto one or more homogenous nodes▪ Each node runs the same mixed workloads▪ Re-‐partition dataset with additional hardware capacity
©2014 Couchbase Inc.
What is Multi-‐Dimensional Scalability? MDS is the architecture that enables independent scaling of data, query, and indexing workloads.
Multi-‐dimensional scaling
64
©2014 Couchbase Inc.
Multi-‐dimensional scaling
65
Isolated Service for minimized interference▪ Independent “zones” for query, index, and data services
Minimize indexing and query overhead on core key-‐value operations.
©2014 Couchbase Inc.
Multi-‐dimensional scaling
66
Independent scalability for the best computational capacity per service
Heavier indexing (index more fields): scale up index service nodes.
More RAM for query processing:scale up query service nodes.
Geospatial querying
67
©2014 Couchbase Inc.
Geospatial views
68
• Experimental in 3.0, now GA in 4.0• Performance and stability improvements• GeoJSON output• Bounding-‐box and range queries on
multiple dimensions
What else is in Couchbase Server 4.0?
69
©2014 Couchbase Inc.
Other new things in Couchbase Server 4.0
70
• ForestDB: GSIs are stored with a new storage engine• Filtered XDCR: more efficient cross-‐data centre replication• Security: LDAP, admin auditing
Developers?SDK support for N1QL!
71
©2014 Couchbase Inc.
.NET SDK: Connection
72
// Option 1: Create Cluster and open bucket var cluster = new Cluster(config);var bucket = cluster.OpenBucket(bucketName);
// Option 2: ClusterHelper and open bucket (Singleton, thread safe bucket instanceClusterHelper.Initialize(config);var cluster = ClusterHelper.Get();var bucket = ClusterHelper.GetBucket(bucketName);
// Close connectioncluster.CloseBucket(bucket);cluster.Dispose();
©2014 Couchbase Inc.
.NET SDK: Client Configuration
73
// Cluster Configurationvar config = new ClientConfiguration
{Servers = new List<Uri> { new Uri("http://10.211.55.2:8091/pools"),},UseSsl = false,BucketConfigs = new Dictionary<string, BucketConfiguration>
{{
"travel-‐sample", new BucketConfiguration{
BucketName = "travel-‐sample",UseSsl = false,Password = "",PoolConfiguration = new PoolConfiguration
{MaxSize = 10,MinSize = 5
}}
}}
};
©2014 Couchbase Inc.
.NET SDK: Basic Operations
74
// Create document (dynamic)var doc = new Document<dynamic>{
Id = "doc1",Content = new{
Id = "doc1",Title = "My Document",Type = "basic",Pages = 3
}};
// update or create documentvar upsertResult = await bucket.UpsertAsync<dynamic>(doc);
// Get documentvar getResult = bucket.GetDocument<dynamic>("key1");
// Delete documentvar deleteResult = await bucket.RemoveAsync<dynamic>(doc);
// Check if doc/key exsistsvar exsists = await bucket.ExistsAsync("key1");
©2014 Couchbase Inc.
.NET SDK: N1QL Query (raw)
75
// Create Query Request. Raw API requestvar query = QueryRequest.Create("SELECT COUNT(*) FROM `travel-‐sample` WHERE type = 'airline'");
// Execute Query. var response = await bucket.QueryAsync<dynamic>(query);
// Convert result to string for easy console print out.var result = JsonConvert.SerializeObject(response, Formatting.Indented);
©2014 Couchbase Inc.
.NET SDK: N1QL Query (Linq2Couchbase)
76
// Lambda syntax
var result = ClusterHelper.GetBucket("beer-‐sample").Queryable<Beer>().Where(a => a.Type == "beer").Select(a => a).Join(
ClusterHelper.GetBucket("beer-‐sample").Queryable<Brewery>().Where(airline => airline.Type == "brewery"),innerKey => innerKey.BreweryId,outerKey => N1Ql.Key( outerKey), (inner,outer) => new { Inner = inner, Outer = outer})
.Take(1)
.ToList();
©2014 Couchbase Inc.
.NET SDK: N1QL Query (Linq2Couchbase)
77
// Query syntax
var query = from beer in QueryFactory.Queryable<Beer>(mockBucket.Object)join breweryGroup in QueryFactory.Queryable<Brewery>(mockBucket.Object)on beer.BreweryId equals N1Ql.Key(breweryGroup) into bgfrom brewery in bg.DefaultIfEmpty()select new { beer.Name, beer.Abv, BreweryName = brewery.Name };
https://github.com/couchbaselabs/N1QL-‐Intro-‐dotNET-‐Supplement-‐Demo-‐code
Next Steps
Couchbase Developer Portal
developer.couchbase.com
80
Forums
http://forums.couchbase.com
81
Thanks for listening!
top related