Translate
jueves, 9 de abril de 2026
martes, 27 de enero de 2026
Teorema de Brewer (CAP)
El Teorema de Brewer fue propuesto por Eric Brewer en el año 2000 y demostrado formalmente por Seth Gilbert y Nancy Lynch en 2002.
Establece que en un sistema distribuido no es posible garantizar simultáneamente las tres propiedades siguientes:
C — Consistency (Consistencia)
A — Availability (Disponibilidad)
P — Partition Tolerance (Tolerancia a particiones)
📘 En otras palabras:
Un sistema distribuido solo puede cumplir dos de las tres propiedades al mismo tiempo.
🔹 Las tres propiedades explicadas
1. Consistency (Consistencia)
Todos los nodos del sistema ven los mismos datos al mismo tiempo.
Después de una escritura exitosa, cualquier lectura posterior devuelve el valor más reciente.
📘 Ejemplo:
Si un usuario actualiza su saldo bancario en un nodo, otro usuario que consulta desde otro nodo ve inmediatamente el saldo actualizado.
💡 Equivale a la consistencia de una base de datos relacional tradicional.
2. Availability (Disponibilidad)
El sistema responde a todas las solicitudes, incluso si hay fallos en algunos nodos.
Cada petición recibe una respuesta válida —aunque los datos no siempre sean los más recientes.
📘 Ejemplo:
Un servidor cae, pero otros nodos siguen respondiendo a las consultas, aunque con datos levemente desactualizados.
💡 Se prioriza que el sistema siga funcionando sobre la precisión inmediata de los datos.
3. Partition Tolerance (Tolerancia a Particiones)
El sistema sigue funcionando a pesar de fallos en la comunicación entre nodos.
Una “partición” ocurre cuando los nodos se dividen en grupos que no pueden comunicarse entre sí.
📘 Ejemplo:
Si un centro de datos se desconecta de otro, ambos grupos de nodos continúan procesando solicitudes de sus usuarios locales.
💡 En sistemas distribuidos reales, las particiones son inevitables, por lo tanto P siempre debe cumplirse.
🔹 Las combinaciones posibles (el triángulo CAP)
Dado que P es ineludible en sistemas distribuidos, los diseñadores deben elegir entre priorizar Consistencia (C) o Disponibilidad (A) durante una partición.
| Tipo de sistema | Propiedades | Descripción | Ejemplo |
|---|---|---|---|
| CP (Consistent + Partition Tolerant) | Garantiza consistencia, pero puede sacrificar disponibilidad. | Prefiere bloquear operaciones antes que devolver datos desactualizados. | HBase, MongoDB (modo strong), Google Spanner |
| AP (Available + Partition Tolerant) | Garantiza disponibilidad, aunque puede devolver datos antiguos. | Permite leer/escribir aunque haya inconsistencias temporales. | Cassandra, DynamoDB, CouchDB |
| CA (Consistent + Available) | Teóricamente consistente y disponible, pero no tolera particiones (solo en sistemas centralizados). | Solo posible en bases locales o de un solo nodo. | PostgreSQL, MySQL en una sola máquina |
🔹 Ejemplo práctico
Imaginemos un sistema de ventas distribuido entre dos centros de datos:
Un cliente compra un producto en nodo A.
En ese momento, la red se corta (partición).
Otro cliente consulta el stock en nodo B.
Decisión del sistema:
Si prioriza Consistencia (CP) → bloquea la consulta hasta restablecer la conexión (no hay riesgo de datos incorrectos, pero hay demoras).
Si prioriza Disponibilidad (AP) → responde con el stock viejo (el sistema sigue activo, pero los datos pueden ser inconsistentes).
🔹 Implicancias del teorema CAP
No hay una solución única “mejor”: depende del tipo de aplicación.
En la práctica, se buscan equilibrios dinámicos (por ejemplo, consistencia eventual).
Los sistemas modernos (como los basados en microservicios y nube) tienden hacia AP con mecanismos de sincronización posterior.
🔸 Ejemplo de elección según el caso
| Tipo de sistema | Requiere | Ejemplo de prioridad CAP |
|---|---|---|
| Banca / Finanzas | Precisión absoluta | CP |
| Redes sociales / mensajería | Disponibilidad continua | AP |
| ERP / e-commerce con stock centralizado | Balance intermedio | CP o Eventual Consistency |
| Análisis de logs / métricas | Rendimiento sobre consistencia | AP |
🔹 Consistencia eventual (Eventual Consistency)
Es un modelo intermedio que adoptan muchas bases de datos NoSQL distribuidas:
Los datos pueden estar temporalmente inconsistentes, pero eventualmente todos los nodos convergen al mismo estado.
📘 Ejemplo:
En DynamoDB o Cassandra, una actualización puede tardar unos segundos en propagarse, pero luego todos los nodos mostrarán el mismo valor.
🔹 CAP en bases de datos reales
| Base de Datos | Tipo | Propiedades según CAP |
|---|---|---|
| PostgreSQL / MySQL (1 nodo) | Relacional | CA |
| MongoDB (replicación con write concern) | NoSQL | CP configurable |
| Cassandra | NoSQL | AP |
| Amazon DynamoDB | NoSQL | AP (eventual o strong configurable) |
| Google Spanner | SQL distribuido | CP (usa relojes atómicos para consistencia global) |
| Redis Cluster | In-memory | AP |
🔹 Conclusión
El Teorema de Brewer (CAP) demuestra que no existe un sistema distribuido perfecto:
siempre hay que elegir entre consistencia y disponibilidad en presencia de particiones.
Los ingenieros deben decidir qué propiedad es más crítica según las necesidades del negocio:
CP: si la precisión de los datos es esencial.
AP: si la disponibilidad es más importante.
CA: solo en entornos centralizados o sin distribución.
| Propiedad | Significado | Cuando se prioriza |
|---|---|---|
| C – Consistency | Todos los nodos ven el mismo dato al mismo tiempo | Finanzas, stock crítico |
| A – Availability | Siempre responde, aunque los datos no sean los últimos | Redes sociales, mensajería |
| P – Partition Tolerance | Tolera fallas de comunicación | Necesario en sistemas distribuidos |
| Combinaciones posibles | CP, AP, CA (teórica) | Elección según contexto |
jueves, 4 de septiembre de 2025
Uso de la cláusula WITH de oracle
Cuando trabajamos con consultas SQL complejas en Oracle, a menudo tenemos que repetir subconsultas o escribir expresiones largas que hacen que el código sea difícil de leer y mantener.
Para resolver esto, Oracle nos ofrece la cláusula WITH, también conocida como subquery factoring.
La cláusula WITH permite definir subconsultas temporales que luego pueden ser utilizadas dentro de una consulta principal.
Es como declarar variables en programación: escribimos la subconsulta una sola vez, le damos un nombre, y la reutilizamos en la consulta final.
Veamos un ejemplo básico
Supongamos que tenemos una tabla ventas con las columnas:
- id
- producto
- cantidad
- precio
Queremos obtener el total de ventas por producto y luego filtrar aquellos productos con ventas mayores a 1000.
WITH ventas_totales AS (
SELECT producto,
SUM(cantidad * precio) AS total
FROM ventas
GROUP BY producto
)
SELECT producto, total
FROM ventas_totales
WHERE total > 1000;
1. En la parte del WITH definimos ventas_totales como una subconsulta.
2. Luego usamos ventas_totales como si fuera una tabla en la consulta principal.
Las ventajas son:
- Hace que las consultas largas sean más legibles.
- Evita duplicar subconsultas.
- Permite estructurar consultas de forma modular.
Podemos definir más de una subconsulta en el mismo WITH:
WITH
ventas_totales AS (
SELECT producto, SUM(cantidad * precio) AS total
FROM ventas
GROUP BY producto
),
productos_top AS (
SELECT producto
FROM ventas_totales
WHERE total > 1000
)
SELECT p.producto, v.total
FROM productos_top p
JOIN ventas_totales v ON p.producto = v.producto;
Aquí usamos dos subconsultas (ventas_totales y productos_top) y las combinamos en la consulta final.
Desde Oracle 11g, la cláusula WITH también soporta consultas recursivas, muy útiles para recorrer jerarquías (como empleados y jefes, o categorías anidadas).
Ejemplo:
WITH empleados_recursivo (id, nombre, manager_id, nivel) AS (
SELECT id, nombre, manager_id, 1
FROM empleados
WHERE manager_id IS NULL
UNION ALL
SELECT e.id, e.nombre, e.manager_id, er.nivel + 1
FROM empleados e
JOIN empleados_recursivo er ON e.manager_id = er.id
)
SELECT *
FROM empleados_recursivo;
Esto nos da una vista jerárquica de empleados y sus jefes, similar a CONNECT BY, pero más flexible.
Conclusión:
La cláusula WITH en Oracle es una herramienta poderosa para:
- Hacer más claras las consultas complejas.
- Reutilizar resultados intermedios.
- Explorar jerarquías con recursividad.
Cuando tus consultas SQL se vuelvan largas o difíciles de leer, pensá en usar WITH para organizarlas mejor.
viernes, 28 de agosto de 2020
Que lenguaje de programación debo aprender?
Este es un post de opinión no me apoyo en ninguna encuesta o nada, es opinión de lo que voy leyendo. A la vez ya hice post similares pero lo actualice a 2020.
Dicho esto, me pongo a opinar. Si queres aprender un lenguaje de programación, lo que primero que debes hacer es pensar a que te queres dedicar. Dado que la programación tiene varios objetivos y si bien hay lenguajes que son buenos para todo pero no son populares en todo, por lo tanto, dependiendo a que te queres dedicar es el lenguaje que debes aprender.
Voy a listar temas y poniendo los lenguajes.
Backend : Java, C#, Kotlin, Scala, Groovy, PHP, Python, Haskell, Go, SQL, Ruby
Frontend : Javascript, Typescript, Elm
Mobile : Java, Kotlin, C#, Dart
Data science : SQL, Python, Julia, R
Sistemas (bajo nivel) : Rust, Go, C
Sistemas concurrentes : Rust, Go, Scala, Haskell, Erlang, Elixir
Juegos : C, C++, Rust, Go, Lua, Elm, C#
martes, 27 de agosto de 2019
Indice TIOBE de agosto
Como se puede ver Python va subiendo tranquilo, a mi entender esto viene de la mano de las tecnologías de machine learnig que cada vez están más presentes y todas las librerías están en Python.
Otro lenguaje que viene creciendo es Groovy, a mi entender gracias a Spring y pivotal
Dejo link:
https://www.tiobe.com/tiobe-index/
domingo, 24 de febrero de 2019
Relacional vs. HBase Schemas
No hay una asignación uno a uno de las bases de datos relacionales a HBase. En el diseño relacional, el enfoque y el esfuerzo están alrededor de describir la entidad y su interacción con otras entidades.
Pero con HBase, tiene un diseño de esquema de "consulta primero"; todas las posibles consultas deben identificarse primero, y el modelo de esquema debe diseñarse en consecuencia. Debes diseñar tu esquema HBase para aprovechar las fortalezas de HBase. Piense en sus patrones de acceso y diseñe su esquema para que los datos que se leen juntos se almacenen juntos. Recuerde que HBase está diseñado para agrupación. Por lo tanto tenemos que tener en cuenta estos 3 puntos a la hora de diseñar una estema hbase:
- Los datos distribuidos se almacenan y se accede juntos.
- Se centra en las consultas, así que concéntrese en cómo se leen los datos
- Diseño para las consultas.
En una base de datos relacional, la normalización de el esquema tiene como beneficios:
- No tiene que actualizar varias copias cuando se produce una actualización, lo que hace que las escrituras sean más rápidas.
- Reduce el tamaño de almacenamiento al tener una sola copia en lugar de varias copias.
- Sin embargo, esto provoca uniones o joins. Como los datos deben recuperarse de más tablas, las consultas pueden tardar más tiempo.
En un almacén de datos des-normalizado, almacena en una tabla lo que serían múltiples índices en un mundo relacional. La des-normalización puede considerarse como un reemplazo para las uniones. A menudo, con HBase, des-normaliza o duplica datos para que los datos se accedan y almacenen juntos.
Este es un ejemplo de desnormalización en HBase, si sus tablas existen en una relación de uno a varios, es posible modelarlo en HBase como una sola fila. Esto hace que las lecturas sean mucho más rápidas que unir tablas.
La clave de fila corresponde al ID de entidad principal, el Id. para HBase puede ser una familia de columnas para los datos. Este tipo de diseño de esquema es apropiado cuando la única forma de acceder a las entidades secundarias es a través de la entidad principal.
domingo, 2 de diciembre de 2018
Bases de datos orientadas a filas vs orientadas a columnas
|
Filas |
Columnas |
|
Es eficiente para agregar o modificar datos |
Es eficiente para leer datos |
|
Leen páginas que contienen filas enteras. |
Sólo leen las columnas que es necesitan |
|
Son las mejores para OLTP |
No están tan optimizadas para OLTP todavía |
|
Los datos de la fila se almacenan en páginas contiguas en la
memoria o en el disco |
Las columnas se almacenan en páginas en memoria o en disco. |
Supongamos que los registros de una tabla se almacenan en las páginas o registros de la memoria. Cuando es necesario acceder a ellas, estas páginas se llevan a la memoria primaria, si aún no están presentes en la memoria.
Si una fila ocupa una página y necesitamos todas las columnas específicas, como el salario o la tasa de interés de todas las filas para algún tipo de análisis, cada página que contenga las columnas debe ingresarse en la memoria; por lo que esta página en la página de salida dará como resultado una gran cantidad de entradas y salidas, lo que puede resultar en un tiempo de procesamiento prolongado.
En las bases de datos orientadas a columnas, cada columna se almacenará en páginas. Si necesitamos recuperar una columna específica, habrá menos entradas y salidas, ya que solo las páginas que contienen la columna especificada deben incluirse en la memoria principal y leer, y no es necesario que aparezcan y lean todas las páginas que contienen filas / registros. De ahora en adelante en la memoria. Por lo tanto, el tipo de consultas en las que solo necesitamos obtener columnas específicas y no registros o conjuntos completos se realiza mejor en una base de datos orientada a columnas, lo que es útil para el análisis en el que podemos recuperar algunas columnas y realizar algunas operaciones matemáticas, como la suma y media.
martes, 28 de agosto de 2018
6 lenguajes de programación que debes estudiar para Data Science
Quiero compartir un artículo sobre los lenguajes de programación que debes aprender para ser el capo máximo de data science. Ya que este es mi blog y los gustos me los tengo que dar en vida, voy a atreverme a ordenar los lenguajes según la importancia con respecto al data science:
- SQL
- Python
- R
- Scala
- Java
- Julia
En que me baso? en mi opinión, es decir, no puedo se menos científico. Peroooo, tengo una explicación. SQL esta en todos lados, y si el motor de base de datos es noSQL, algún lenguaje de consulta similar a SQL (con sus restricciones) va a tener por esa razón me parece imprescindible saber SQL. Python y R son los más famosos lenguaje en data science por lejos...
Scala y Java por la sacudida que esta dando Spark. Y Julia, porque es un lenguaje que viene creciendo.
Dejo link: https://dzone.com/articles/what-is-data-science-programming-top-7-languages?utm_source=Top%205&utm_medium=email&utm_campaign=Top%205%202018-08-243
martes, 14 de agosto de 2018
¿Cuál es la diferencia entre SQL, NoSQL y NewSQL?
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
miércoles, 18 de julio de 2018
Oracle vs NoSql vs NewSql
![]() ![]()
|
martes, 8 de mayo de 2018
UNION vs UNION ALL
Principalmente el problema es que ambos tienen funcionalidades distintas. El UNION y el UNION ALL parecen funcionar igual pero tienen una pequeña diferencia. El UNION descarta los resultados en común entre los dos SELECT, en cambio, el UNION ALL no hace ningún tipo de verificación.
Por este motivo, el UNION ALL es más eficiente que el UNION.
Si sabemos que las 2 consultas a unir no van a tener repetidos es buena práctica usar el UNION ALL
LAG y LEAD en Oracle
Estas dos funciones “LAG y LEAD” lo permiten sin tener que realizar una self join.
LAG() devuelve el valor de la anterior fila y LEAD() el valor de la siguiente fila.
SELECT DNI,
LEAD(DNI) OVER (ORDER BY DNI) POSTERIOR,
LAG(DNI) OVER (ORDER BY DNI) ANTERIOR
FROM PRUEBA;
DNI POSTERIOR ANTERIOR
0001 0002
0002 0003 0001
0003 0004 0002
0004 0005 0003
0005 0006 0004
0006 0007 0005
sábado, 1 de julio de 2017
Que cursos de codeschool puedo hacer de forma gratuita?
Try C#
jueves, 7 de abril de 2016
Oracle Technology Network
|
| SEV100524063_LRT100524032 |
Oracle Corporation - Worldwide Headquarters, 500 Oracle Parkway, OPL - E-mail Services, Redwood Shores, CA 94065, United States
Su privacidad es importante para nosotros. Puede iniciar sesión en su cuenta para actualizar sus suscripciones a correos electrónicos o puede optar por no recibir los correos electrónicos de Oracle Marketing en cualquier momento. Sepa que desuscribirse de las comunicaciones de Marketing no afecta el envío de comunicaciones importantes de negocios en su relación actual de negocios con Oracle como Actualizaciones de seguridad, Avisos de registros para eventos, Administración de cuentas y Comunicaciones de Soporte/Servicios. |
jueves, 31 de marzo de 2016
SQL Server 2016 se viene con sorpresas
Lo más notorio de la nueva versión es un cambio en el modo en que maneja las tablas en memoria, esto promete ser mucho más eficiente que la forma anterior.
Entre las mejoras podemos nombrar:
- Manejo optimizado de Constraints
- Mejoras en la compilación de Stored Procedure nativos.
- Mejoras en funciones y Triggers nativos.
No vi si hay mejoras en linux, espero que llegue una versión estable tanto para windows como linux.
Dejo link:
https://www.microsoft.com/en-us/server-cloud/products/sql-server-2016/
miércoles, 9 de marzo de 2016
Microsoft SQL Server en Linux ya es una realidad.
No es una broma, es totalmente cierto...
Sip, SQL server corre en linux y ya tiene una versión estable. La verdad es que no se que más decir, solo que tenemos que probarla.
Dejo link: http://blogs.microsoft.com/blog/2016/03/07/announcing-sql-server-on-linux/
jueves, 5 de noviembre de 2015
The Sequel to SQL
La gente de codeschool publicaron varios cursos sobre base de datos, para la gente que quiere perfeccionar su conocimiento en sql.
Les dejo el programa:
COURSE OVERVIEW

LEVEL 1 FREE LEVELAggregate Functions 2 Videos | 10 Challenges
Learn how to use SQL aggregate functions, including COUNT, SUM, and AVG, to do calculations on groups of data.
LEVEL 2Table Constraints 2 Videos | 11 Challenges
Add constraints — like NOT NULL, UNIQUE, FOREIGN KEY, and PRIMARY KEY — to your tables to increase data integrity.
LEVEL 3Normalization and Relationships 2 Videos | 7 Challenges
Apply normalization rules to create tables without duplicate data and build the appropriate relationships.
LEVEL 4Inner Joins, Aliases, and Outer Joins 3 Videos | 7 Challenges
Explore writing a single query to pull data from multiple tables and using aliases to create succinct queries.
LEVEL 5Subqueries 1 Video | 3 Challenges
Dive deeper as you learn how to write queries within queries.
Dejo link:
https://www.codeschool.com/courses/the-sequel-to-sql/
miércoles, 5 de agosto de 2015
Cursos gratuitos en codeschool
![]() |
| |||||
| |||||
| |||||
| |||||
| |||||
| |||||
| |||||
| |||||
| |||||
| |||||
| |||||
| |||||
|






























