domingo, 5 de octubre de 2025

Programando en C# no.10 (usando xUnit)

Las pruebas unitarias nos ayudan a validar el funcionamiento de nuestro código. Se basan en el TDD o desarrollo basado en pruebas.

La filosofía del TDD se basa en:

  1. Escribir pruebas que fallen, se le da un color rojo. 
  2. Escribir pruebas que pasen, en color verde. 
  3. Refactorización, en azul.

Nosotros usaremos xUnit.

xUnit.net es una herramienta de prueba unitaria gratuita y de código abierto para .NET Framework (que se puede usar para C#, F# o Visual Basic).

Es similar a JUnit, pero para proyectos .NET.

Podemos hacer una breve comparativa.

Concepto xUnit (.NET/C#) JUnit (Java)
Lenguaje  C#  Java
Anotación de prueba [Fact] [Theory] @Test
Assert  Assert.Equal(), Assert.True()  Assertions.assertEquals(), etc.
Setup/Teardown  Constructor, IDisposable  @BeforeEach, @AfterEach
Organización  Por clase y métodos públicos  Por clase y métodos anotados
Ejecución  dotnet test  mvn test, gradle test, etc.

Instalamos algunos paquetes necesarios con Nuget (solo en caso de no tenerlos):

$ dotnet add package xunit
$ dotnet add package xunit.runner.visualstudio
$ dotnet add package Microsoft.NET.Test.Sdk

Comenzemos con una prueba sencilla. Una clase tiene un método para sumar dos números enteros. Crearemos una sencilla prueba para probar ese método.

1. Crear directorio del proyecto y ubicarnos en el.

$ mkdir Calculadora
$ cd Calculadora

2. Crear una solución con este comando:

$ dotnet new sln

3. Crear un proyecto de biblioteca:

$ dotnet new classlib -n Calculadora.Core

En este crearemos una clase llamada ``Calculadora.cs`` que tendrá el método de la suma de dos números enteros (y que posteriormente pondremos a prueba).

namespace Calculadora.Core;

public class Calculadora
{
    public int Sumar(int a, int b)
    {
        return a + b;
    }
}

4. Crear un proyecto de pruebas:

$ dotnet new xunit -n Calculadora.Tests

En este crearemos una clase ``CalculadoraTests.cs`` donde escribiremos dos métodos para probar el método de suma de la clase anterior.

using Xunit;
using Calculadora.Core; 

namespace Calculadora.Tests;

public class CalculadoraTests
{
    [Fact]
    public void Sumar_DosNumerosEnteros_RetornaSumaCorrecta()
    {
        // Arrange
        var calculadora = new Calculadora.Core.Calculadora(); 
        int a = 3;
        int b = 5;
        int esperado = 8;

        // Act
        int resultado = calculadora.Sumar(a, b);

        // Assert
        Assert.Equal(esperado, resultado);
    }

    [Fact]
    public void Sumar_NumerosNegativos_RetornaSumaCorrecta()
    {
        // Arrange
        var calculadora = new Calculadora.Core.Calculadora(); 
        int a = -2;
        int b = -3;
        int esperado = -5;

        // Act
        int resultado = calculadora.Sumar(a, b);

        // Assert
        Assert.Equal(esperado, resultado);
    }
}

Para los programadores Java que han usado JUnit esto les parecerá familiar.

5. Agregamos ambos proyectos a la solución:

$ dotnet sln add Calculadora.Core/Calculadora.Core.csproj
$ dotnet sln add Calculadora.Tests/Calculadora.Tests.csproj

6. Agregamos una referencia del proyecto Calculadora.Core al proyecto de pruebas Calculadora.Tests:

$ cd Calculadora.Tests
$ dotnet add reference ../Calculadora.Core/Calculadora.Core.csproj

7. Nos ubicamos en la raíz del proyecto (Calculadora):

Calculadora/
├── Calculadora.Core/
│   ├── Calculadora.cs
│   └── Calculadora.Core.csproj
├── Calculadora.Tests/
│   ├── CalculadoraTests.cs
│   └── Calculadora.Tests.csproj
└── Calculadora.sln

8. Abrimos una terminal y ejecutamos la prueba:

$ dotnet test

Salida:

Iniciando la ejecución de pruebas, espere...
1 archivos de prueba en total coincidieron con el patrón especificado.

Correctas! - Con error:     0, Superado:     2, Omitido:     0, Total:     2, Duración: 8 ms - Calculadora.Tests.dll (net8.0)

¡Hemos creado nuestras primeras pruebas unitarias con xUnit!

Si tienes problemas ejecuta estos comandos uo por uno para limpiar, compilar y ejecutar el proyecto:

$ dotnet clean
$ dotnet restore
$ dotnet build
$ dotnet test

Enlaces:

https://learn.microsoft.com/es-es/dotnet/core/testing/unit-testing-csharp-with-xunit
https://es.wikipedia.org/wiki/XUnit
https://xunit.net/?tabs=cs
https://dev.to/maadcode/introduccion-a-xunit-una-poderosa-herramienta-para-unit-testing-en-net-34b0

Creando un proyecto backend con C#

Si, soy un oso, pero también un programador C#

En está ocasión veremos cómo crear un proyecto backend con C#.

Debemos tener instalado Dotnet. En caso de no tenerlo, lo puedes descargar desde este sitio: https://dotnet.microsoft.com/en-us/download

Abrimos una terminal y tecleamos:

$ dotnet new webapi -n proyecto-backend
$ cd proyecto-backend

Esto nos creará un proyecto llamado ``proyecto-backend``. La estructura será similar a esto:

proyecto-backend/
  appsettings.Development.json
  appsettings.json
  bin/
  obj/
  Program.cs
  Properties/
  proyecto-backend.csproj
  proyecto-backend.http
  proyecto-backend.sln

Veamos el programa principal. El cual se trata de una API de descripciones climáticas.

Program.cs

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

var summaries = new[]
{
    "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};

app.MapGet("/weatherforecast", () =>
{
    var forecast =  Enumerable.Range(1, 5).Select(index =>
        new WeatherForecast
        (
            DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
            Random.Shared.Next(-20, 55),
            summaries[Random.Shared.Next(summaries.Length)]
        ))
        .ToArray();
    return forecast;
})
.WithName("GetWeatherForecast")
.WithOpenApi();

app.Run();

record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary)
{
    public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}

Ahora echemoslo a andar:

$ dotnet build
$ dotnet run

Abrimos el navegador en la ruta: http://localhost:5071/weatherforecast

Nos mostrará un JSON:

[
{
"date": "2025-10-06",
"temperatureC": 7,
"summary": "Freezing",
"temperatureF": 44
},
{
"date": "2025-10-07",
"temperatureC": -3,
"summary": "Hot",
"temperatureF": 27
},
{
"date": "2025-10-08",
"temperatureC": 11,
"summary": "Freezing",
"temperatureF": 51
},
{
"date": "2025-10-09",
"temperatureC": 29,
"summary": "Warm",
"temperatureF": 84
},
{
"date": "2025-10-10",
"temperatureC": -5,
"summary": "Mild",
"temperatureF": 24
}
]

Ahora creemos otra sencilla API con C#.

Creando una sencilla API con C#

Crearemos un servicio sencillo que nos permita generar un JSON con la siguiente estructura:

[
{
	"animal": "gato",
	"raza:":"felino",
	"nombre":"Don Panther",
	"id": 1
},

{
	"animal": "gato",
	"raza:":"felino",
	"nombre":"El Guererais",
	"id": 2
},

{
	"animal": "gato",
	"raza:":"felino",
	"nombre":"Caramelo",
	"id": 3
}

]

Crearemos una capeta ``model`` donde tendremos dos clases:

  • Felino.cs 
  • Gato.cs (que hereda de Felino.cs)

Felino.cs

using System;

namespace model
{
    public class Felino
    {


        private long id;
        private string nombre;
        private string raza;



        public void comer()
        {
            Console.WriteLine("El felino come");
        }

        public long Id
        {
            get; set;
        }

        public string Nombre
        {
            get; set;
        }
        
        public string Raza
        {
            get; set;
        }

    }
}

Gato.cs

using System;

namespace model
{
    public class Gato : Felino
    {


        public Gato(long id, string nombre, string raza)
        {
            this.Id = id;
            this.Nombre = nombre;
            this.Raza = raza;
        }


        public void comer()
        {
            Console.WriteLine("El gato come");
        }

    }
}

Ahora el programa principal lucirá así:

Program.cs

using model;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

var gatos = new List<Gato>
{
    new Gato(1, "Don Panther", "felino"),
    new Gato(2, "El Guererais", "felino"),
    new Gato(3, "Caramelo", "felino")
};

app.MapGet("/gatos", () =>
{
    var resultado = gatos.Select(g => new {
        raza = g.Raza,
        nombre = g.Nombre,
        id = g.Id
    });

    return Results.Json(resultado);
})
.WithName("GetGatos")
.WithOpenApi();

app.Run();

Construyamos y ejecutemos la aplicación:

$ dotnet build
$ dotnet run

Abrimos el navegador en la ruta: http://localhost:5071/gatos

Nos mostrará nuestro JSON:

[
{
"raza": "felino",
"nombre": "Don Panther",
"id": 1
},
{
"raza": "felino",
"nombre": "El Guererais",
"id": 2
},
{
"raza": "felino",
"nombre": "Caramelo",
"id": 3
}
]

Si queremos ver la página de Swagger de nuestra aplicación abrimos la siguiente URL: http://localhost:5071/swagger/index.html


¡Hemos creado una sencilla API con C#!

Continuaremos con este tema en próximas entregas

Enlaces:

https://dotnet.microsoft.com/


domingo, 28 de septiembre de 2025

Ktor: un framework para aplicaciones asincrónicas

Ktor es un framework para aplicaciones asincrónicas del lado del servidor y del lado del cliente. Su lenguaje de programación base es Kotlin.

Nos permite crear microservicios hasta todo tipo de aplicaciones cliente HTTP multiplataforma. Veamos un ejemplo de código en Ktor:

fun main() {
	embeddedServer(Netty, port = 8000) {
		routing {
			get ("/") {
				call.respondText("Hola, mundo!")
			}
		}
	}.start(wait = true)
}

¿Cómo comenzar? Simple, iremos al sitio: https://start.ktor.io/

En el Project Artifact colocaremos: com.inforhomex.ktor-helloword

El sitio te permite colocar plugins y ver un preview del proyecto a descargar:

Damos clic en el botón Download para descargar el proyecto. Lo descomprimimos y lo colocamos en algún directorio de nuestra máquina.

Es importante tener Gradle instalado. Pues con este construiremos el proyecto y echaremos a andar.

Abrimos la clase principal del proyecto creado

Application.kt

package com.inforhomex

import io.ktor.server.application.*

fun main(args: Array<String>) {
    io.ktor.server.netty.EngineMain.main(args)
}

fun Application.module() {
    configureRouting()
}

Editamos la clase ``Routing.kt``

package com.inforhomex

import io.ktor.server.application.*
import io.ktor.server.response.*
import io.ktor.server.routing.*

fun Application.configureRouting() {
    routing {
        get("/") {
            call.respondText("Hola, mundo!")
        }
    }
}

Podemos usar Visual Studio Code:

Compilando y ejecutando el proyecto.

Abrimos una terminal y nos ubicamos en el proyecto:

$ gradle build

Con esto construimos el proyecto y ahora lo ejecutamos:

$ gradle run

Si todo va bien, abrimos un navegador en la ruta: http://127.0.0.1:8080

Salida:

Hola, mundo!

¡Hemos creado nuestra primera aplicación sencilla con Ktor!

Continuaremos con este tema en próximas entregas.

Enlaces:

https://ktor.io/


sábado, 27 de septiembre de 2025

Conociendo Apache Tapestry

Según el sitio oficial, Tapestry es: un framework orientado a componentes para la creación de aplicaciones web altamente escalables en Java.

Como buen framework promete:

  • Ser altamente productivo. 
  • Implementar eficientemente el manejo de errores. 
  • Inyección de dependencia. 
  • Configuración vía anotaciones. 
  • Alta escalabilidad. 
  • Compatibilidad con Selenium. 
  • Con una arquitectura abierta y extensible. 
  • Java puro, sin reflexión. 
  • Puedes usar Java, Groovy o Scala como lenguaje de programación base.

Se puede descargar desde us sitio oficial: https://tapestry.apache.org/download.html

También se puede crear un proyecto usando Maven. La dependencia es la siguiente:

<dependency>
  <groupId>org.apache.tapestry</groupId>
  <artifactId>tapestry-core</artifactId>
  <version>5.8.7</version>
</dependency>

Creando un proyecto con Tapestry

Requisitos:

  1. Tener Maven instalado. 
  2. Tener Java 21 o más instalado.

Abrimos una terminal y tecleamos:

$ mvn archetype:generate -Dfilter=org.apache.tapestry:quickstart

Donde:

groupId= com.inforhomex
artifactId= tapestry-demo
version= 1.0-SNAPSHOT
package= com.inforhomex.demo
packageInPathFormat= com/inforhomex/demo
package= com.inforhomex.demo
groupId= com.inforhomex
artifactId= tapestry-demo
version= 1.0-SNAPSHOT

Nos ubicamos en el proyecto creado:

$ cd tapestry-demo

Ejecutamos la aplicación con Jetty:

$ mvn jetty:run

Abrimos el navegador en la ruta: http://localhost:8080/

Con esto hemos creado nuestra primera aplicación con Tapestry.

También podemos optar por clonar el proyecto base y probar las aplicaciones que vienen:

$ git clone https://github.com/apache/tapestry-5.git
$ cd tapestry-5

Nota: es necesario contar con Gradle instalado.

En conclusión: Tapestry es un framework Java para desarrollo web que se enfoca en componentes reutilizables y una arquitectura elegante. Sin embargo existen otros framework que a mi criterio llevan la delantera como Spring Framework con su Spring Boot, Quarkus, Micronaut y hasta Helidon.

Enlaces:

https://tapestry.apache.org/
https://github.com/apache/tapestry-5

martes, 23 de septiembre de 2025

Vibe Coding: programando vía I.A.

2025 se ha vuelto el año de la Inteligencia Artificial. Herramientas para diseño gráfico, arquitectura, generación de imágenes, audio y vídeo, editores de código que la integran (VsCode, FireBase, etc.) y demás.

Empresas que estaban reacias en implementarla ahora hasta solicitan que sus desarrolladores tengan algún tipo de especialidad o certificación como Github Copilot.

¿Qué consecuencias tendrá la implementación de herramientas I.A. en las empresas?

¿Significará que el programador quedará obsoleto?

¿Debo ser experto en Github Copilot antes de tener buenas bases de programación?

¿Será mejor buscar cómo convertirme en Youtuber o Influencer (gente que vive de sus seguidores y no trabaja)?

Preguntas y preguntas que debemos plantearnos seriamente.

Como dijimos en un post anterior, quien se duerma en sus laureles es probable que si sea reemplazado. Pero no por una I.A. sino por un programador que se actualice constantemente. Que tome cursos para mejorar sus habilidades y tener otros conocimientos. Y además sepa usar las herramientas I.A. como Github Copilot. Que sepa plantear problemas y sepa lo que quiera como resultado.

Solo el programador que no conozca el lenguaje con el que quiere trabajar será el primero en desaparecer.

Si dice que sabe Java y Spring Boot, pero en realidad no sabe y espera volverse experto en 3 días estará perdido, acabado. Si le dan el trabajo, se volverá loco al ver que por sí solo Java es un universo por aprender. Entenderá (a la mala) que hacer microservicios solo es una parte de Spring framework. Es más que hacer peticiones GET, POST, PUT y DELETE.

La I.A. no le hará la vida más fácil. Se la puede complicar. Si no conoce el lenguaje que dijo conocer al 100% verá las respuestas de copilot, grok etc. como un lenguaje indescifrable e incomprensible.

Solo el programador que sí conoce un lenguaje y que ha desarrollado aplicaciones de la vida real sobrevivirá en un mundo repleto de herramientas con I.A.

Sabrá cómo pedir y qué resultados debe arrojar. Le ahorrará el trabajo en las configuraciones, en el código que es tedioso realizar.

El trabajo de semanas podrá realizarse en días u horas (dependiendo de la complejidad, no todo es magia).

Además podrá documentar el código de su proyecto en tan solo unos minutos.

Podrá crear guías o manuales de usuario.

Podrá crear test unitarios antes del despliegue a producción.

Podrá usar herramientas como Doker y Kubernetes y ahorrarse mucho trabajo en su administración.

El Vibe Coding es una realidad, nos guste o no. Si la sabemos aprovechar será de mucha ayuda.

Si no, entonces el tiempo lo dirá.

Enlaces:

https://codemonkeyjunior.blogspot.com/2025/03/como-ser-un-mejor-programador-en-un.html
https://codemonkeyjunior.blogspot.com/2025/07/las-leyes-no-escritas-de-la.html
https://codemonkeyjunior.blogspot.com/2025/06/vibe-coding-la-programacion-via-ia-el.html
https://alquimistadecodigo.blogspot.com/2023/03/chatgpt-usando-una-ia-como-asistente.html
https://codemonkeyjunior.blogspot.com/2025/04/firebase-studio-el-visual-studio-code.html

sábado, 20 de septiembre de 2025

Conociendo Akka

¿Qué es Akka?

Es una plataforma (o framework) inspirado por Erlang que busca el desarrollo simple de aplicaciones escalables y multihilo.

Permite crear servicios transaccionales, duraderos y en tiempo real que distribuyen lógica y datos de forma conjunta.

Se puede usar con Java o Scala distintivamente.

Donde la concurrencia no se basa en la memoria compartida entre varios hilos y los métodos de sincronización (como en Java) sino que está basado en el sistema Actor-Modelo para ello.

Donde un actor es un objeto con el que puedes interactuar enviándole mensajes: cada actor puede procesar mensajes y enviarle mensajes a otros actores. Además de que los actores pueden tener un estado interno pero la comunicación sólo ocurre pasando mensajes y nunca a través de estructuras compartidas.

Donde una máquina virtual JVM pueden correr millones de actores a la vez construyendo una jerarquía padre (supervisor)-hijo con los padres monitorizando el comportamietno de los hijos. Permitiendo una forma sencilla splitear nuestros actores entre varios nodos de un cluster.

Un sencillo ejemplo con Akka

Iniciaremos creando unproyecto con Maven:

$ mvn archetype:generate -DgroupId=com.codemonkey -DartifactId=akka-hello-world -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Nos ubicamos en el directorio creado:

$ cd akka-hello-world

Editamos el archivo pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.codemonkey</groupId>
    <artifactId>akka-hello-world</artifactId>
    <version>1.0</version>
    <dependencies>
        <dependency>
            <groupId>com.typesafe.akka</groupId>
            <artifactId>akka-actor-typed_2.13</artifactId>
            <version>2.6.21</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.12.1</version>
                <configuration>
                    <source>21</source>
                    <target>21</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Construimos el proyecto:

$ mvn clean install -X

Observemos la clase principal.

HelloWorld.java

package com.codemoneky;

import akka.actor.typed.ActorSystem;
import akka.actor.typed.Behavior;
import akka.actor.typed.javadsl.AbstractBehavior;
import akka.actor.typed.javadsl.ActorContext;
import akka.actor.typed.javadsl.Behaviors;
import akka.actor.typed.javadsl.Receive;

public class HelloWorld extends AbstractBehavior<String> {

    public static Behavior<String> create() {
        return Behaviors.setup(HelloWorld::new);
    }

    private HelloWorld(ActorContext<String> context) {
        super(context);
    }

    @Override
    public Receive<String> createReceive() {
        return newReceiveBuilder()
                .onMessage(String.class, this::onMessage)
                .build();
    }

    private Behavior<String> onMessage(String message) {
        System.out.println("Mensaje recibido: " + message);
        return this;
    }

    public static void main(String[] args) {
        ActorSystem<String> system = ActorSystem.create(HelloWorld.create(), "HelloWorldSystem");
        system.tell("Hola Mundo");
        // Termina el sistema después de enviar el mensaje
        system.terminate();
    }
}

Esta clase mostrará un mensaje "Hola Mundo".

Compilamos el proyecto:

$ mvn compile

Ejecutamos:

$ mvn exec:java -Dexec.mainClass="com.codemonkey.HelloWorld"

¡Hemos creado nuestra primera aplicación con Akka!

En pocas palabras, Akka sirve para construir aplicaciones concurrentes, distribuidas y escalables en Java o Scala. Basado en el modelo de actores, facilita la gestión de procesos paralelos, comunicación asíncrona y sistemas tolerantes a fallos. Es ideal para aplicaciones en tiempo real, como chats, streaming, o microservicios, ya que simplifica la concurrencia y permite manejar grandes volúmenes de datos o usuarios de forma eficiente.

Enlaces:

https://akka.io/
https://emanuelpeg.blogspot.com/2022/09/por-que-usar-akka.html
https://www.bairesdev.com/blog/introduction-to-akka-an-open-source-library/
https://scalac.io/technologies/akka/
https://unpocodejava.com/2013/02/19/que-es-akka/


domingo, 14 de septiembre de 2025

NoSQL alternativas a las BD relacionales (2da parte)

 

NoSQL (Not only SQL) es un término que se refiere a bases de datos no relacionales. Una base de datos NoSQL almacena sus datos en un formato no tabular. Entre las más famosas están:

  • MongoDB. 
  • Redis. 
  • Neo4j (orientada a grafos). 
  • CouchDB.
  • Cassandra.
  • Entre otras más.

MongoDB.

Es un sistema de base de datos NoSQL, orientado a documentos y de código abierto.

Redis.

Es un motor de base de datos en memoria, basado en el almacenamiento en tablas de hashes (clave/valor) pero que opcionalmente puede ser usada como una base de datos durable o persistente.

Neo4j.

Es un software libre de Base de datos orientada a grafos, implementado en Java.

CouchDB.

Es una base de datos NoSQL que emplea JSON para almacenar los datos, JavaScript como lenguaje de consulta por medio de MapReduce y HTTP como API.

Cassandra.

Es un software NoSQL distribuido y basado en un modelo de almacenamiento «tabular», de código abierto que está escrito en Java.

NoSQL según https://nosql-database.org/, se refiere a bases de datos "no relacionales" o "no solo SQL": sistemas de almacenamiento de datos que no se basan en el formato tradicional de tablas de filas y columnas de las bases de datos relacionales. Y ofrecen modelos flexibles como documentos, pares clave-valor, gráficos o columnas anchas, según cómo se estructuren y accedan los datos.

Su objetivo no es reemplazar a SQL por completo. Más bien, aborda limitaciones específicas de los sistemas relacionales, especialmente al trabajar con datos no estructurados, grandes volúmenes o arquitecturas distribuidas.

Algunas de las diferencias más importantes entre una BD relacional y una no relacional son:

Estructuras de datos:

  • Las bases de datos SQL utilizan un esquema fijo con tablas, filas y columnas. La estructura debe definirse con antelación y cada registro sigue el mismo formato. 
  • Las bases de datos NoSQL son flexibles en cuanto a esquemas. Los datos pueden almacenarse como documentos JSON, pares clave-valor o gráficos, lo que permite que cada entrada tenga un aspecto diferente.

Escalabilidad:

  • Las bases de datos SQL suelen escalarse verticalmente, lo que implica añadir más potencia a un solo servidor (CPU, RAM, etc.). 
  • Las bases de datos NoSQL están diseñadas para el escalado horizontal: distribuyen los datos entre varios servidores para gestionar tráfico intenso y grandes conjuntos de datos.

Lenguaje de consulta:

  • El lenguaje de consulta estructurado (SQL) se utiliza en bases de datos SQL para interactuar con los datos. 
  • Las variantes de las bases de datos NoSQL dependen del tipo: MongoDB permite el envío de un lenguaje de consulta similar a SQL y también ejecuta consultas completas desde el shell, mientras que Cassandra utiliza su lenguaje de consulta CQL (Cassandra Query Language) integrado.

Transacciones:

  • Los sistemas SQL ofrecen una sólida conformidad con ACID (atomicidad, consistencia, aislamiento y durabilidad), lo que garantiza una estricta fiabilidad de los datos. 
  •  Los sistemas NoSQL varían: algunos admiten ACID a nivel de documento, pero muchos se centran en el rendimiento y la disponibilidad, y en ocasiones solo ofrecen consistencia eventual.

Tipos de BD NoSQL

Bases de datos basadas en documentos. Como MongoDB o CouchDB.

Bases de datos basadas en de clave-valor. Como Redis o DynamoDB.

Bases de datos basadas en almacenaje de columnas anchas. Como Cassandra o HBase.

Bases de datos basadas en grafos. Como Neo4j o ArangoDB.

Las bases de datos NoSQL surgen de la necesidad de resolver los problemas dejados por las bases de datos relaciones. Como lo pueden ser las complejas consultas (JOIN, INNER JOIN, etc.), la inflexibilidad de los datos y hasta su integridad.

Enlaces:

https://www.mongodb.com/
https://neo4j.com/
https://cassandra.apache.org
https://es.wikipedia.org/wiki/NoSQL
https://redis.io/
https://couchdb.apache.org/
https://nosql-database.org/
https://mkyong.com/tutorials/java-mongodb-tutorials/

Programando en C# no.10 (usando xUnit)

Las pruebas unitarias nos ayudan a validar el funcionamiento de nuestro código. Se basan en el TDD o desarrollo basado en pruebas. La ...

Etiquetas

Archivo del blog