27
DocumentDB NoSQL the sequel

Document db

Embed Size (px)

Citation preview

DocumentDBNoSQL the sequel

Hvem er [email protected]@dotnetnerd

Agenda• Hvor passer DocumentDB ind?• Arkitektur• Tooling• REST API / SDK’er

Data på Azure

• SQL• Storage (blob, table, file, queue)• Redis Cache• Search• DocumentDB

Dokumentdatabaser

• Ingen schema• Json• Nestede komplekse datastrukturer• Advancerede query muligheder• Matcher godt med objektmodeller

Hvordan adskiller DocumentDB sig?

• Bygget til cloud • Elasticitet• High availability

• Velkendte begreber fra SQL• SQL• Stored procedures• Triggers• User-defined functions

Ressourcer

{Json}

Property User settable or system generated?

Purpose

_rid System generated System generated, unique and hierarchical identifier of the resource.

_etag System generated etag of the resource required for optimistic concurrency control.

_ts System generated Last updated timestamp of the resource.

_self System generated Unique addressable URI of the resource.

id User settable User defined unique name of the resource.

Datatyper

• Json.NET serializer• Datoer som ISO 8601 string

Database

Brugere og rettigheder

• Account administrators• Read-only administrators• Database users and permissions

• Manuelt styre adgang til resources• All / read

var docUser = new User { Id = "mobileuser" };

docUser = await client.CreateUserAsync(database.SelfLink, docUser);

var docPermission = new Permission

{

PermissionMode = PermissionMode.Read,

ResourceLink = documentCollection.SelfLink,

Id = "readperm"

};

docPermission = await client.CreatePermissionAsync(docUser.SelfLink, docPermission);

FeedResponse<Permission> permFeed = await client.ReadPermissionFeedAsync(docUser.SelfLink);

List<Permission> permList = new List<Permission>();

foreach (Permission perm in permFeed){ permList.Add(perm);}

DocumentClient userClient = new DocumentClient(new Uri(endpointUrl),permList);

Consistency levels

• Strong – quorum writes og reads. Forespørgsler er fuldt konsistente.• Bounded Staleness – write order er konsistent. Reads må være bagud

med et specificeret antal operationer (eller tid i sekunder).

• Session - write order og reads er konsistente inden for en client session.

• Eventual – reads må være ude af sekvens, eg., nogle reads ser muligvis ikke de seneste ændringer

Collections

• Container til Json dokumenter• En collection kan indeholde forskellige typer dokumenter• Sharding og fan-out queries• Skaleringsenhed for transaktioner og queries• Konfigurerbar indexering

Indexing

• Automatic• Kan slås fra (kun query på id og selflink)• Query med FeedOptions.EnableScanInQuery• Tilføj eller fjern enkelte dokumenter (whitelist/blacklist)

client.CreateDocumentAsync(defaultCollection.SelfLink,

new { Name = ”Christian", isSpeaking = true },

new RequestOptions

{

IndexingDirective = IndexingDirective.Include

}

);

Indexing modes

• Consistent• Lazy (= eventual consistency level)

var defaultCollection = new DocumentCollection { Name ="defaultCollection" };

defaultCollection.IndexingPolicy.Automatic = true;

// Set IndexingMode to Lazy for bulk import/read heavy collections.

defaultCollection.IndexingPolicy.IndexingMode = IndexingMode.Lazy;

defaultCollection = await client.CreateDocumentCollectionAsync(database.SelfLink,defaultCollection);

Skalering og pris

• Capacity units• SSD storage og throughput

Tools

• Azure Portal• DocumentDBStudio (github)• Visual Studio (roadmap)

• Azure DocumentDB Data Migration Tool (github)• Json• MongoDB• SQL Server• CSV

REST API

VALUE OF THE _SELF DESCRIPTION

/dbs Feed of databases under a database account.

/dbs/{_rid-db} Database with the unique id property with the value {_rid-db}.

/dbs/{_rid-db}/colls/ Feed of collections under a database.

/dbs/{_rid-db}/colls/{_rid-coll} Collection with the unique id property with the value {_rid-coll}.

/dbs/{_rid-db}/users/ Feed of users under a database.

/dbs/{_rid-db}/users/{_rid-user} User with the unique id property with the value {_rid-user}.

/dbs/{_rid-db}/users/{_rid-user}/permissions Feed of permissions under a database.

/dbs/{_rid-db}/users/{_rid-user}/permissions/{_rid-permission}

Permission with the unique id property with the value {_rid-permission}.

POST https://mydb.documents.azure.com/dbs/XP0mAA==/colls/XP0mAJ3H-AA=/docs HTTP/1.1x-ms-documentdb-isquery: Truex-ms-date: Mon, 18 Aug 2014 13:05:49 GMTauthorization: type%3dmaster%26ver%3d1.0%26sig%3dkOU%2bBn2vkvIlHypfE8AA5fulpn8zKjLwdrxBqyg0YGQ%3dx-ms-version: 2014-08-21Accept: application/jsonContent-Type: application/query+jsonHost: mydb.documents.azure.comContent-Length: 50 { query: "SELECT * FROM root WHERE (root.Person.id = 'Jens')", parameters: []}

SDK’er

• Dokumentation og samples: • http://azure.microsoft.com/da-dk/documentation/services/documentdb• https://code.msdn.microsoft.com/windowsazure/Azure-DocumentDB-NET-Code-6b3da8af

• .NET (Nuget)• LINQ

• Java• Python • Node• JavaScript (database)

.NET SDK

• Nuget• Client• Database• Collection• Selflinks

Performance

• Én client i applikationens levetid• Cache selflinks• Call client.OpenAsync()• ConnectionMode (gateway/direct)• Protocol (https/tcp)

new DocumentClient(new Uri(MyEndPointUrl), MyAuthorizationKey, new ConnectionPolicy()

{

ConnectionMode = ConnectionMode.Direct,

ConnectionProtocol = Protocol.Tcp

});

Queries

• SQL• Parameters• LINQ• Forskellige typer i samme collection• Ingen Skip, Top, Count…

SELECT f.id AS familyName, c.givenName AS childGivenName, c.firstName AS childFirstName, p.givenName AS petName FROM Families f JOIN c IN f.children JOIN p IN c.petsWHERE p.givenName = "King"

User-defined functions

• JavaScript• Opret som ressource• Brug fra Queries

var udf = new UserDefinedFunction{ Id = "myUdf", Body = udfBody,}; await client.CreateUserDefinedFunctionAsync(colSelfLink, udf);

Triggers

• JavaScript• Opret som ressource• Specificeres ved operation

var triggerId = "myTrigger";Trigger trigger = new Trigger{ Id = triggerId, Body = triggerBody, TriggerOperation = TriggerOperation.Create, TriggerType = TriggerType.Post //Pre or Post};

await client.CreateTriggerAsync(colSelfLink, trigger);

var requestOptions = new RequestOptions { PostTriggerInclude = new List<string> { triggerId } };

await client.CreateDocumentAsync(colSelfLink, myDocument, requestOptions);

Stored procedures

• JavaScript• Opret som ressource• Execute• Tidsgrænse

await _client.CreateStoredProcedureAsync(colSelfLink, new StoredProcedure() { Id = "mySproc", Body = sprocBody });

var sproc = _client.CreateStoredProcedureQuery(colSelfLink) .ToList().Single(sp => sp.Id == "mySproc");

var sprocResponse = await _client.ExecuteStoredProcedureAsync<int>(sproc.SelfLink, objData);

Transaktioner

• Dybt integrerede i javascript modellen• Funktion = ACID transaktion med snapshot isolation• Exception => rollback

Takeaways

• Dokumentdatabaser• Forståelse for arkitekturen• Overblik over tooling og sdk’er• Mod på at bruge DocumentDB