Una sencilla y simple exposición rápida de lo que es el servicio de las bases de datos NoSQL en Microsoft Azure "Azure DocumentDB" yéndonos desde las conceptualizaciones y cimientos conceptuales básicos hasta entender y validar como trabajar con modelo de datos JSON document para la creación de documentos repositorios así como de procedimientos almacenados en JavaScript como plataforma de servicio en Azure para con ellos, aplicarlos en las empresas de hoy. Estan tod@s cordialmente invitados a la misma.
2. Microsoft Data Platform
Avanet
Jose Redondo
Microsoft SQL Server MVP | CEO EntornoDB | DPA SolidQ
redondoj@gmail.com | @redondoj | redondoj.wordpress.com
Introducción a Azure DocumentDB
3. Expositor
• Data Architect
• BI Expert, Data Analysis & Big Data
• Dev Client, Web & Database .NET - Java
• Dev – DBA Microsoft, SyBase, IBM & Oracle
• Speaker Latam “Microsoft, Avanet, FirstCloud,
ShareCol” & USA “ITProCamp”
• SQL Server MCP – MSTS – MTA
• Contributing Technical Reviewer Packt Publishing
Microsoft SQL Server MVP | CEO EntornoDB | DPA SolidQ
8. Introducción
• Que es Azure DocumentDB?
• NoSQL… ? Porque… ?
• NoSQL… ? Porque no… ?
• Microsoft Databases en Azure
• Características y Beneficios de DocumentDB
• Modelo de Recursos
• Modelo de Recursos DocumentDB
• Resumen
9. Que es Azure DocumentDB?
• Orientado a Documentos
• Almacén de datos NoSQL libre de Schema
• Base de datos completamente administrable
como un servicio
• Disponible para suscriptores de Microsoft Azure
10. NoSQL… ? Porque… ?
• Simplicidad de diseño
• Habilidad de escalar horizontalmente
• Ejecución de aplicaciones de entorno web en
tiempo real y Big Data
11. NoSQL… ? Porque no… ?
• Consistencia de compromiso con la
tecnología actual
• Uso de lenguajes de consulta de bajo
nivel
• Algunas interfaces estandarizadas
• Numerosas inversiones de SQL en la
actualidad
12. Microsoft Databases en Azure
• Relacional
• SQL Database (PaaS – Platform as a Services)
• SQL Server (IaaS – Infrastructure as a Service)
• NoSQL
• Azure Tables – Almacén de valores claves
• Azure DocumentDB – Base de datos de documentos
13. Características y Beneficios de DocumentDB
• Consultas Ad hoc con sintaxis
SQL
• Ejecución de JavaScript dentro de
la base de datos
• Niveles de consistencia regulables
• Completamente administrable
• Almacenamiento y rendimiento
elásticamente escalable
• Abierto al Diseño de Aplicaciones
de bases de datos
14. Características y Beneficios de DocumentDB
• Base de datos documental
NoSQL, Poca aplicación en
Schema
• Totalmente gestionable, con
capacidad aprovisionada
• Las entidades almacenadas son
documentos JSON
• Consistencia ajustable
• Diseñado para su escalamiento
en Petabytes
15. Modelo de Recursos
Database Account
Database
Collection
Document
Attachment
Stored Procedure
Trigger
User-defined functions
User
Permission
Media
17. Modelo de Recursos DocumentDB
• Database Account
• Una o más unidades de capacidad
• Único DNS
• Database
• Contenedor lógico de usuarios y colecciones
• Particiones a través colecciones
18. Modelo de Recursos DocumentDB
• Collection
• Contenedor de documentos JSON
• Alcance de las transacciones y consultas
• Unidad más pequeña de la Escalación
• Document
• Objetos CRUD (Acrónimo: Create, Read,
Update y Delete) habilitados en una
colección
• No hay forzamiento de esquema o tipos
de datos especializados
19. Modelo de Recursos DocumentDB
• Users
• Namespace lógico para alcances
de permisos
• Pueden representar Personas o
Funciones
• Permissions
• Token de autorización asociada a
un usuario
• Controla el acceso a recursos
específicos
20. Modelo de Recursos DocumentDB
• Stored Procedures, Triggers y User-
Defined-Functions
• Lógica en la aplicación para ejecutarse
directamente en la transacción de la
base de datos
• Escrito completamente en JavaScript
• Attachments y Media
• Permite el almacenamiento de blobs /
medios binarios
• Puede ser en DocumentDB o en una
tienda de medios remoto (Adjunto)
21. Recursos del Sistema vs.
Recursos Definidos por el Usuario
Propiedad
Configurables por el usuario o
generado por el sistema?
Proposito
_rid Generado por el Sistema
Generados por el sistema, identificador único y
jerárquico de los recursos
_etag Generado por el Sistema
etag de los recursos necesarios para el control
de simultaneidad optimista
_ts Generado por el Sistema Última actualización Timestamp del recurso
_self Generado por el Sistema Direccionamiento único URI del recurso
id Configurado por el Usuario
Nombre único definido por el usuario del
recurso
22. Resumen
• Libre de Schema
• JSON Document
• Estándar del mercado para pasar datos entre un servidor y una aplicación
web
• Reemplazo para XML
• Jerárquico
• Abreviado
• Tipos de datos simples
23. Resumen
• Collections
• Unidad de escala, Transacciones y Consultas
• DocumentDB escalable mediante la adición de colecciones adicionales
• Respaldado por almacenamiento SSD flexible
• Indexación automática
• Por defecto, los documentos están indexados como cuando son agregados a la
colección
• Habilitado para la optimización de escritura siendo libre de bloqueo así como técnicas
de mantenimiento de indexación de registros estructurados
• Énfasis en las rápidas escrituras mientras servía consultas consistentes
• Políticas pueden ser configuradas a nivel de colección
24. Resumen
• Desarrollo contra DocumentDB - Diferentes APIs
• Python
• REST API
• Node.js
• SQL
• .NET/LINQ
• JavaScript
26. Configuración
• Crear una Cuenta
• Costo actuales
• Disponibilidad Geográfica
• Qué es un CU?
• Límites y aplicaciones de cuotas para DocumentDB
• Configuración de las políticas de indexación de Collection
27. Crear una Cuenta
• Actualmente solo disponible en el nuevo portal en versión Preview
http://portal.azure.com
28. Crear una Cuenta
• Actualmente solo disponible en el nuevo portal en versión Preview
http://portal.azure.com
37. Qué es un CU?
• CU = Unidad de Capacidad
• Unidad de Escalabilidad para DocumentDB
• 1 CU de ejecución por segundo
• 2,000 lecturas de documentos simples
• 500 inserciones/actualizaciones/eliminaciones de
documentos simples
• 1,000 consultas de documentos simples
• 20 procedimientos almacenados (Asumiendo la
inserción / ejecución de un procedimiento
almacenado de 50 documentos)
• Si llegamos a necesitar escalar nuestro escenario
de ejecución, añadimos otra CU!
38. Límites y aplicaciones de cuotas para
DocumentDB
ENTIDAD (OFERTA ESTÁNDAR PARA
LA VERSIÓN PRELIMINAR)
Cuentas de la base de datos 5
Número de bases de datos por cuenta de base de datos 100
Número de usuarios por cuenta de base de datos en todas las bases de
datos
500.000
Número de permisos por cuenta de base de datos en todas las bases de
datos
2.000.000
Almacenamiento anexo por cuenta de base de datos 2 GB
Número máximo de unidades de capacidad por cuenta de base de datos 50
Número de colecciones por unidad de capacidad 3
39. Límites y aplicaciones de cuotas para
DocumentDB
ENTIDAD (OFERTA ESTÁNDAR PARA
LA VERSIÓN PRELIMINAR)
Almacenamiento asignado mínimo por colección con 1 documento
como mínimo
3,3 GB
Rendimiento asignado mínimo por colección con 1 documento como
mínimo
667 unidades de solicitud (RU)
Elasticidad de una colección 0-10 GB
Unidades de solicitud/s máximos por colección 2000
Número de procedimientos almacenados, desencadenadores y UDF
por colección
25 cada uno
Tiempo de ejecución máximo para el procedimiento almacenado y
desencadenador
5 segundos
Almacenamiento de documentos/unidad de capacidad aprovisionados 10 GB
40. Límites y aplicaciones de cuotas para
DocumentDB
ENTIDAD (OFERTA ESTÁNDAR PARA
LA VERSIÓN PRELIMINAR)
Unidades de solicitud/s/unidad de capacidad aprovisionadas 2000
Almacenamiento de documentos máximo por base de datos (5 unidades
de capacidad)
500 GB
Longitud máxima de la propiedad de identificador 255 caracteres
Número predeterminado de elementos por página 100
Elementos máximos por página 1000
Tamaño de solicitud máximo del documento y el adjunto 512KB
Tamaño de solicitud máximo del procedimiento almacenado,
desencadenador y UDF
256KB
Tamaño máximo de respuesta 1MB
41. Límites y aplicaciones de cuotas para
DocumentDB
ENTIDAD (OFERTA ESTÁNDAR PARA
LA VERSIÓN PRELIMINAR)
Número máximo de rutas exclusivas por
colección
100
String
Todas las cadenas se deben ajustar a la codificación UTF-
8. Dado que UTF-8 es una codificación de ancho variable,
los tamaños de las cadenas se determinan mediante los
bytes UTF-8
Longitud máxima de propiedad o valor Sin límite práctico
Número máximo de UDF por consulta 1
Número máximo de JOIN por consulta 2
Número máximo de cláusulas AND por
consulta
5
Número máximo de cláusulas OR por consulta 5
42. Configuración de las políticas de indexación
de Collection
• Indexación automática
• Puedes activarlo o desactivarlo
• Puedes escoger el incluir o excluir documentos específicos (x-ms-indexingdirective)
43. Configuración de las políticas de indexación
de Collection
• Incluir o excluir rutas especificas dentro de los documentos
• Indexación Sincrónica vs. Indexación Asincrónica
• Indexación Sincrónica es predeterminada en el sistema
• Indexación divagada ideal para escenarios de ejecución de inserciones masivas en
colecciones de densa lectura
45. Creando Bases de Datos, Documentos y
Colecciones
• Estableciendo la conexión
• Modelando datos RDBMS
• Modelando datos en DocumentDB
• Creando una Base de Datos
• Creando un Documento
46. Estableciendo la conexión
• Cuenta Endpoint de DocumentDB
• Clave de acceso Primaria y Secundaria
• Proporcionar acceso administrativo a la cuenta
• Puede recuperar las claves con acceso limitado según permisos
Recomendación (Buenas Practicas): No almacenar tokens de acceso
a la aplicación en el código fuente (o en las demos)
57. Operaciones
• Para cada recurso:
• Create
• Replace
• Delete
• Read
• Query
• Read es una operación GET en un ID de recurso especificado, devolviendo un
único recurso.
• Query es una operación POST sobre una colección con un Requests en el
body conteniendo el texto DocumentDB SQL, retornando una posible
colección empty de recursos.
• Query puede ser filtrado solamente en propiedades indexadas
58. Escenarios
DocumentDB SQL
• SELECT <select-list> FROM <from-specification> WHERE <filter-condition>
• Similar al SQL normal
• Sólo apoyado con Self-Join
• Capacidad para llegar al árbol de JSON:
• Valores accesible para condiciones de filtrado
• Lista de selección de Shape
• Funciones definidas por el usuario
• Soporte de LINQ-to-SQL para .NET
61. Performance - Targets de Escalabilidad
• Unidad de Capacidad
• Cantidad especificada de capacidad de almacenamiento y rendimiento
operacional
• Cuota del Collection por cada unidad de capacidad
• Unidad de aprovisionamiento para la escala de rendimiento y almacenamiento
• Configurado a nivel de cuenta de base de datos
• Compartible entre todas las bases de datos y Collections en la cuenta de base de
datos
• Almacenamiento es SSD respaldado
• Microsoft ha estado usando las bases de datos con terabytes de
almacenamiento (Diseñado para Petabytes)
62. Performance - Targets de Escalabilidad
Hipótesis:
• Documento de 1 KB con 10 propiedades
• Nivel de consistencia de sesión
• Indexación automática
Operación de Base de Datos
Operaciones / Segundos
(Unidades de Solicitudes)
Read por documento 2000
Insert, Replace, Update por documento 500
Consulta simple (Retornando un documento) 1000
Procedimiento Almacenado con 50 Inserts 20
Solicitudes son neutralizadas si el consumo excede al objetivo que posee la
unidad de capacidad total
63. Escenarios integrados
• Hay se encuentran las relaciones entre
entidades.
• Hay se albergan algunas relaciones entre
entidades.
• No hay datos integrados que cambia con poca
frecuencia.
• Hay datos integrados que no va a crecer sin
límite.
• Hay datos integrados que son esenciales para
datos en un documento.
Ejemplos de cuándo no integrar
• Como un blog publicar comentarios o pedidos de
los clientes para la empresa
66. Desarrollo con .NET
• RESTful API
• Download
• Class: DocumentClient
• Class: Resource
• Class: Database
• Class: DocumentCollection
67. Desarrollo con .NET
• Data Model
• Class: Document
• Class: ResourceResponse<T>
• Read
• Delete
• Replace
68. Desarrollo con .NET
• Read From a Feed
• DocumentDB Queries
• SQL Query
• LINQ Query
• LINQ Lambda With Paging
69. RESTful API
• Interfaz base en DocumentDB
• Utilizado por todas las bibliotecas
cliente
• Operaciones estándar con todos
los recursos DocumentDB:
• CREATE, DELETE, PUT, GET, POST
• Devuelve la URL del recurso
permanente en su creación
• Autenticación HMAC utilizando la
clave de gestión o de recursos
• Headers de petición DocumentDB
70. Download
• NET API alojados en NuGet
• Paquete de instalación
Microsoft.Azure.Documents.Client
(Preview)
• Instala los paquetes
DocumentDB y JSON.NET
71. Class: DocumentClient
• Construido con Endpoint URL y la key de gestión para la
cuenta de la base de datos
• Proporciona métodos de Async/Await para las
operaciones CRUD (Create, Read, Update & Delete)
sobre recursos DocumentDB
• Gestiona la conexión a DocumentDB
// Create DocumentClient
String documentDbAddress =
"https://{account}.documents.azure.com";
String authorizationKey = "key==";
Uri documentDbUri = new Uri(documentDbAddress);
DocumentClient documentClient =
new DocumentClient(documentDbUri, authorizationKey);
72. Class: Resource
• Clase base para todas las clases
de recursos de DocumentDB
• Expone lo siguiente:
• ETag - Utilizada para la
concurrencia optimista
• SelfLink – Ruta URL para recursos
• ResourceID – ID interno (Base64
encoded) para recursos
• ID – ID de los recursos,
proporcionada o generada
73. Class: Database
• Derivado desde los recursos
• Agrega propiedades exponiendo Collections y Users
// Create database
Database database = new Database { Id = databaseId };
ResourceResponse<Database> response = await
documentClient.CreateDatabaseAsync(database);
database = response;
String selfLink = database.SelfLink;
String collections = database.CollectionsLink;
String users = database.UsersLink;
74. Class: DocumentCollection
• Derivado desde los recursos
• Agrega propiedades exponiendo DocumentsLink,
StoredProceduresLink, TriggersLink,
UserDefinedFunctionsLink
// Create document collection
DocumentCollection documentCollection =
new DocumentCollection { Id = "SomeId" };
ResourceResponse<DocumentCollection> response =
await
documentClient.CreateDocumentCollectionAsync(
database.SelfLink, documentCollection);
documentCollection = response;
75. Data Model
• Utiliza librería JSON.NET para la
serialización
• Clase simple
• Ninguna clase especial base
• Todas las propiedades públicas se
serializan en JSON
• Evidente asignación de .NET a
JSON
• IList, etc. -> Array
• Int32, etc. -> Integer
• Float, etc. -> Float
• DateTime -> String
• Byte[] -> String
76. Class: Document
• Derivado desde los recursos
• Agrega la propiedad a exponer
AttachmentsLink
// Insert document
ResourceResponse<Document> response =
await
documentClient.CreateDocumentAsync(
documentCollection.SelfLink,
someDocumentEntity);
Document document = response;
77. Class: ResourceResponse<T>
• Encapsula la respuesta de una
operación de recurso
DocumentDB
• Provee información de cuotas y
uso dependiendo de los recursos
• Contiene los Headers de respuesta
incluyendo HTTP StatusCode
• Expone implícitamente el recurso
escrito desde el response
78. Read
• Una operación de lectura
devuelve un solo documento
ResourceResponse<Document>
response =
await
documentClient.ReadDocumentAs
ync(documentLink);
Album album =
JsonConvert.DeserializeObject<Alb
um>(response.Resource.ToString());
79. Delete
Album album = new Album() {
AlbumName = "Let It Bleed",
BandName = "Rolling Stones",
ReleaseYear = "1969“
};
Document document = await
documentClient.CreateDocumentAsync(
documentCollection.SelfLink, album);
ResourceResponse<Document>
secondResponse = await
documentClient.DeleteDocumentAsync(
document.SelfLink);
80. Replace
dynamic readResponse = await
documentClient.ReadDocumentAsync(documentLink);
RequestOptions requestOptions = new RequestOptions() {
AccessCondition = new AccessCondition() {
Type = AccessConditionType.IfMatch,
Condition = readResponse.Resource.ETag
}
};
Album album = (Album)readResponse.Resource;
album.ReleaseYear = "1990";
ResourceResponse<Document> replaceResponse = await
documentClient.ReplaceDocumentAsync(
documentLink, album, requestOptions);
81. Read From a Feed
• La API de .NET puede devolver todos los recursos en una colección como paginada "Feed."
String continuation = String.Empty;
Do {
FeedOptions feedOptions = new FeedOptions {
MaxItemCount = 10,
RequestContinuation = continuation
};
FeedResponse<dynamic> response = await
documentClient.ReadDocumentFeedAsync(
documentCollectionLink, feedOptions);
continuation = response.ResponseContinuation;
} while (!String.IsNullOrEmpty(continuation));
82. DocumentDB Queries
• DocumentDB soporta consultas en todos
los niveles de recursos, incluyendo:
• Database, DocumentCollection, and
Document
• .NET API soporta los siguientes tipos de
consultas:
• SQL
• LINQ SQL
• LINQ Lambda
La clase DocumentQueryable expone
métodos de extensión helper para crear
varios tipos de consulta
83. SQL Query
foreach (var album in
documentClient.CreateDocumentQuery
<Album>(
documentCollection.SelfLink,
"SELECT * FROM albums a WHERE
a.bandName = 'Radiohead'")) {
Console.WriteLine("Album name: {0}",
album.AlbumName);
}
Tenga en cuenta que "albums" es el
nombre del DocumentDB Collection
84. LINQ Query
IQueryable<Album> albums =
from a in
documentClient.CreateDocumentQuery
<Album>(
documentCollection.SelfLink)
where a.BandName == "Radiohead"
select a;
foreach (var album in albums) {
Console.WriteLine("Album name: {0}",
album.AlbumName)
}
85. LINQ Lambda With Paging
FeedOptions feedOptions = new FeedOptions() {
MaxItemCount = 10
};
var query =
documentClient.CreateDocumentQuery<Album>(
documentCollection.SelfLink, feedOptions)
.Where(a => a.BandName == "Radiohead")
.AsDocumentQuery();
do {
foreach (Album album in await query.ExecuteNextAsync())
{
Console.WriteLine("Album name: {0}",
album.AlbumName);
}
} while (query.HasMoreResults);
87. Procedimientos Almacenados, Triggers y
Funciones
• Creando un Procedimiento Almacenado
• Registrando un Procedimiento Almacenado
• Ejecutando un Procedimiento Almacenado
• Consistencia
• Niveles de Consistencia
• Indexando
88. • JavaScript como un día
moderno de T-SQL
• Lenguaje de programación de
alto nivel
• Transacciones atómicas
• JavaScript permite optimización
cuando se trata de documentos
JSON
• Procesamiento por lotes
• Compilación previa
• Secuencia
• Lógica de negocio encapsulada
• 5 segundo de timout
93. Niveles de Consistencia
• Strong
• Write es visible sólo después de
que se ha comprometido de
forma duradera por la mayoría de
las réplicas de quórum
• Menor nivel de rendimiento de
Read/Write
• Bounded Staleness
• Garantiza el fin de la propagación
de Writes
• Reads podría retrasarse detrás o
más allá de las Writes
94. Niveles de Consistencia
• Session
• Tu puedes ver tus Writes
• Latencia de Writes bajo
• Eventual
• NoSQL clásico
• Consistencia débil
• Rendimiento rápido, Baja latencia
95. Indexando
• Especificado en el nivel del
Collection
• Soporta indexación lenta
• Todo es indexado por defecto
• Soporta dos modos:
• Automatic Indexing:
• Esto es tunable para documentos
individuales y rutas dentro de un
documento, aplicando inclusión o
exclusión de una ruta establecida
• Los Índices de precisión pueden
especificarse para cadenas y
números
96. Indexando
• Indexing Mode:
• Consistent - Por índices
predeterminados
sincrónicamente actualización
en Insertn Replace o Delete
• Lazy - Actualización del índice
asíncrono (Dirigido a los
escenarios de Bulk Ingestion)
• Opcional In o Out en la creación
de los objetos Collection
97. Indexando
• Alcance - Es apropiado para los
números que necesitan filtrarse
con >=, >, <, <=
• Hash - Excelente para los
cadenas
101. Conclusiones
• Base de datos documental
totalmente gestionado para
almacenar entidades JSON
• Alta escalabilidad y performance
• Gran variedad de bibliotecas de
desarrollo cliente
• .Net, Node.js, JavaScript, Python
• Soportado sólo en el nuevo portal
de Azure