NoSQL(Not only SQL)

    ¿Que es NoSQL?

    El término NoSQL abarca una cantidad de tecnologías de base de datos que nacieron de la necesidad de la industria del software, de trabajar con grandes volúmenes de datos, con un alto nivel de concurrencianecesidades altas de procesamiento y desempeño bajo estas premisas.

    Clasificación

  • Basadas en documentos
  • Basadas en grafos
  • De llave-valor
  • De columnas anchas o familias de columnas

Las bases de datos NoSQL se han clasificado mayormente por la forma como se almacenan o se acceden los datos(Modelo de datos). Las más comunes son:

Ventajas

  • Modelo flexible de datos(Sin esquema)
  • Escalabilidad
  • Mayor desempeño

Desventajas

  • No existe un estándar para realizar las consultas
  • Curva de aprendizaje un poco mayor

    Aspectos a considerar...

  • Modelo de datos
  • Modelo de consultas o querys
  • Modelo de consistencia
  • Soporte comercial
  • Fortaleza de la comunidad
  • Drivers para los diferentes lenguajes de programación

    Couchbase - Features

    Couchbase - Database

// IOS:
CBLManager *manager = [CBLManager sharedInstance];
NSError *error;
self.database = [manager databaseNamed: @"my-database" error: &error];
if (!self.database) {
    [self handleError: error];
}
//Android
try {
     Manager manager = new Manager(new AndroidContext(mContext), Manager.DEFAULT_OPTIONS);
     Database db = manager.getExistingDatabase("my-database");
     if(db != null) {
}
 } catch (IOException e) {
     Log.e(TAG, "Cannot delete database", e);
     return;
 }

    Couchbase - Document

{
   "address": "Cra 12 N 12 - 24",
   "city": "Medellín",
   "code": "123123",
   "conctact": "Daniel Mejía",
   "country": "Colombia",
   "discount": "0.3",
   "email": "exito@exito.com",
   "identifier": "911212333",
   "lastUpdate": "2014-12-15 00:00:00",
   "name": "Exito",
   "phone": "345 23 12",
   "sellerCode": "33331"
}
{
   "id": "MDEyNzI4TQ==",
   "rev": "2-000003c2fc708d000000000000000000",
   "expiration": 0,
   "flags": 0
}

    Couchbase - Crear documento

//Android
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("type", "list");
properties.put("title", title);
properties.put("created_at", currentTimeString);
properties.put("owner", "profile:" + userId);
properties.put("members", new
ArrayList<String>());
Document document = database.createDocument();
document.putProperties(properties);
//IOS
NSString* owner = [@"profile:" stringByAppendingString: userId];
NSDictionary* properties = @{@"type":       @"list",
                             @"title":      title,
                             @"created_at": currentTimeString,
                             @"owner":      owner,
                             @"members":    @[]};
CBLDocument* document = [database createDocument];
NSError* error;
if (![document putProperties: properties error: &error]) {
    [self handleError: error];
}

    Couchbase - Leer documento

//Android
Document doc = database.getDocument(myDocId);
// We can directly access properties from the document object:
doc.getProperty("title");
// Or go through its properties dictionary:
Map<String, Object> properties = doc.getProperties();
String owner = (String) properties.get("owner");
//IOS
CBLDocument* doc = [database documentWithID: _myDocID];
// We can directly access properties from the document object:
NSString* title = doc[@"title"];
// Or go through its properties dictionary:
NSDictionary* properties = doc.properties;
NSString* owner = properties[@"owner"];

    Couchbase - Actualizar documento

//Android
Document doc = database.getDocument(myDocId);
doc.update(new Document.DocumentUpdater() {
    @Override
    public boolean update(UnsavedRevision newRevision) {
        Map<String, Object> properties = newRevision.getUserProperties();
        properties.put("title", title);
        properties.put("notes", notes);
        newRevision.setUserProperties(properties);
        return true;
    }
});
//IOS
CBLDocument* doc = [database documentWithID: _myDocID];
NSMutableDictionary* p = [doc.properties mutableCopy];
p[@"title"] = title;
p[@"notes"] = notes;
NSError* error;
if (![doc putProperties: p error: &error]) {
    [self handleError: error];
}

    Couchbase - Eliminar documento

//Android
Document doc = database.getDocument(myDocId);
doc.update(new Document.DocumentUpdater() {
    @Override
    public boolean update(UnsavedRevision newRevision) {
        newRevision.setIsDeletion(true);
        Map<String, Object> properties = newRevision.getUserProperties();
        properties.put("deleted_at", currentTimeString);
        newRevision.setUserProperties(properties);
        return true;
    }
})
//IOS
CBLDocument* doc = [database documentWithID: _myDocID];
NSError* error;
if (![doc deleteDocument: &error]) {
    [self handleError: error];
}

    Couchbase - Vistas(Views)

Son índices de los documentos que se encuentran en la base de datos

Couchbase no tiene un lenguaje como SQL para los querys, se basa en una técnica llamada map/reduce inspirado en las funciones map and reduce usadas en la programación funcional.

    Couchbase - Vistas(Views)

El principal componente de una vista es su función map

  • Esta escrita en el mismo lenguaje de nuestra app
  • Toma como parametro el JSON del documento y emite cualquier numero de llaves-valor para ser indexadas.
  • La vista genera indices por cada uno de los documentos en la base de datos.
  • Es ordenada por las llaves.

Una vista tambien puede contener una función reduce:

 Si está presente, se usa durante los querys para combinar multiples filas en una(Ej. Count, average, group)

//IOS
CBLView* phoneView = [db viewNamed: @"phones"];
[view setMapBlock: MAPBLOCK({
    for (NSString* phone in doc[@"phones"]) {
        emit(phone, doc[@"name"]);
    }
}) version: @"2"];
//Android
View phoneView = database.getView("phones");
phoneView.setMap(new Mapper() {
    @Override
    public void map(Map<String, Object> document, Emitter emitter) {
        List<String> phones = (List) document.get("phones");
        for (String phone : phones) {
            emitter.emit(phone, document.get("name"));
        }
    }
}, "2");

Map

//IOS
CBLView* phoneView = [db viewNamCBLView* phoneView = [db viewNamed: @"phones"];
[view setMapBlock: MAPBLOCK({
    for (NSString* phone in doc[@"phones"]) {
        emit(phone, doc[@"name"]);
    }
}) reduceBlock:^id(NSArray *keys, NSArray *values, BOOL rereduce) {
    return @(values.count);
}) version: @"2"];
ed: @"phones"];
[view setMapBlock: MAPBLOCK({
    for (NSString* phone in doc[@"phones"]) {
        emit(phone, doc[@"name"]);
    }
}) version: @"2"];

Map/Reduce

    Couchbase - Querys

CBLQuery* query = [[[IGDBManager sharedInstance] allClients] createQuery];
        NSMutableArray* clients = [NSMutableArray new];
        
        [query runAsync:^(CBLQueryEnumerator *result, NSError *error) {
            if (result && !error){
                for(CBLQueryRow *row in result){
                    IGClient * client = [[IGClient alloc] init];
                    [client updateWithDictionary:row.document.properties];
                    [clients addObject:client];
                }
                block([NSArray arrayWithArray:clients], nil);
            }else {
                block(nil, [IGError defaultCouchBaseError]);
            }
        }];
CBLView * view = [self.database viewNamed: @"allClients"];
    [view setMapBlock: MAPBLOCK({
        if ([doc[@"type"] isEqualToString:@"client"]) {
            if (doc[@"code"])
                emit(doc[@"code"], nil);
        }
    }) version: @"1"];
    return view;

    Entonces, ¿SQL o NoSQL?

Principalmente depende del escenario al que nos enfrentemos:

  • Cliente
  • Cantidad de datos
  • Cantidad de usuarios concurrentes
  • Desempeño
  • Presupuesto
  • Agilidad en el desarrollo

Recursos

NoSQL

By AresDev

NoSQL

  • 282