Niveles ANSI/SPARC:
┌───────────────────────┐ │ Nivel Externo │ ← Vistas de usuario ├───────────────────────┤ │ Nivel Conceptual │ ← Esquema lógico global ├───────────────────────┤ │ Nivel Interno │ ← Almacenamiento físico └───────────────────────┘
Seguridad:
Concurrencia:
Propiedades ACID:
BEGIN TRANSACTION; UPDATE cuentas SET saldo = saldo - 100 WHERE id = 123; UPDATE cuentas SET saldo = saldo + 100 WHERE id = 456; -- Si ocurre error: ROLLBACK; -- Si todo OK: COMMIT;
Fases de optimización:
Ejemplo de plan de ejecución (EXPLAIN):
| Id | Operation | Name | Rows | |----|--------------------|----------|------| | 0 | SELECT STATEMENT | | 100 | | 1 | HASH JOIN | | 100 | | 2 | TABLE ACCESS FULL| Empleados| 1000 | | 3 | INDEX RANGE SCAN | Dept_IDX | 10 |
Recuperación ante fallos:
Técnica | Mecanismo | Recovery Time |
---|---|---|
Restauración | Desde backups completos + logs | Minutos/Horas |
Reconstrucción | Esquemas Point-in-Time Recovery | Segundos (Hot Standby) |
- Tasa de acierto buffer cache (>95%) - Ratio de esperas por locks (<1%) - Throughput (transacciones/segundo)
Clasificación: | Árboles de decisión, SVM, Random Forest |
Clustering: | K-means, DBSCAN |
Reglas de asociación: | Apriori, FP-Growth |
┌───────────────┐ │ Cubo OLAP │ │ ┌─────┐ │ │ │ * │ │ ← Hechos (medidas) │ └─────┘ │ │ / | \ │ Dimensiones: ┌───┐ ┌───┐ ┌───┐ │Tiempo││Geo.││Prod.│ └───┘ └───┘ └───┘
Característica | Dashboard | Scorecard |
---|---|---|
Propósito | Monitoreo operacional | Gestión estratégica |
Métricas | Indicadores en tiempo real | KPIs alineados a objetivos |
Ejemplo | Ventas por región hoy | % cumplimiento meta anual |
Mejores prácticas:
Extract → [API REST | CSV | JDBC] Transform → [Limpieza | Enriquecimiento | Agregación] Load → [Data Warehouse | Data Lake]
Para una cadena minorista:
Tecnologías sugeridas: Microsoft Power BI + Azure Synapse
"Entornos software para automatizar y dar soporte a actividades del ciclo de vida del desarrollo de sistemas"
Tipo | Ventajas | Ejemplo Actual |
---|---|---|
On-premise | Control total, seguridad | IBM Engineering Lifecycle |
Cloud | Acceso remoto, escalabilidad | Lucidchart |
Open Source | Bajo costo, customizable | ArgoUML |
┌───────────────────────────────────┐ │ HERRAMIENTA CASE │ ├───────────────────────────────────┤ │ ┌───────────┐ ┌─────────────┐ │ │ │Repositorio│ │Generador de │ │ │ │ Central │←─→│ Código │ │ │ └───────────┘ └─────────────┘ │ │ ↑ ↓ │ │ ┌───────────┐ ┌─────────────┐ │ │ │Editores │ │Herramientas │ │ │ │Diagramas │ │ de Pruebas │ │ │ └───────────┘ └─────────────┘ │ └───────────────────────────────────┘
Comparar 3 herramientas CASE modernas:
Criterio | Enterprise Architect | Visual Paradigm | GenMyModel |
---|---|---|---|
Soporte UML 2.5 | ✔️ Completo | ✔️ Completo | ✔️ Básico |
Generación código | 10+ lenguajes | 8 lenguajes | 3 lenguajes |
Precio (USD/año) | 229-599 | 99-1999 | Gratis-299 |
Tarea: Seleccionar la más adecuada para un proyecto fintech con equipo distribuido.
"Lenguajes de cuarta generación orientados a desarrollo rápido de aplicaciones empresariales"
Tipo | Ejemplo | Caso de Uso |
---|---|---|
Compilados | Uniface | Aplicaciones críticas |
Interpretados | FileMaker | Prototipado rápido |
Híbridos | PowerBuilder | Equilibrio rendimiento/flexibilidad |
┌───────────────────────────────────────┐ │ ENTORNO 4GL TÍPICO │ ├───────────────────────────────────────┤ │ ┌────────────┐ ┌──────────────────┐ │ │ │ RAD Tools │ │ Database Gateway │ │ │ └────────────┘ └──────────────────┘ │ │ ↓ ↓ │ │ ┌────────────┐ ┌──────────────────┐ │ │ │ Generadores│ │ Debuggers/ │ │ │ │ de Código │ │ Profilers │ │ │ └────────────┘ └──────────────────┘ │ └───────────────────────────────────────┘
REPORT "Ventas por Región" DATA: CONNECT TO "DB_Ventas" SQL = "SELECT region, SUM(monto) FROM ventas GROUP BY region" BODY: GROUP BY region COLUMNS: region (HEADER "Región") sum_monto (HEADER "Total", FORMAT "$#,##0.00") FOOTER: LINE "Total General: " + grand_total(sum_monto)
Herramienta | Ventaja | Ejemplo Real |
---|---|---|
Oracle Forms | Integración con PL/SQL | Sistemas ERP legacy |
Microsoft Access | Curva de aprendizaje baja | Aplicaciones departamentales |
FileMaker Pro | Multiplataforma (iOS/Web) | Soluciones móviles |
// Crear gráfico dinámico gr_1.Type = ColumnGraph! gr_1.AddSeries("Ventas Q1") gr_1.AddData(1, 1, 45000) gr_1.AddData(1, 2, 52000) gr_1.Title = "Desempeño Trimestral"
Método | Esfuerzo | Flexibilidad |
---|---|---|
Codificación manual | 40 horas | Alta |
4GL tradicional | 8 horas | Media |
Low-Code actual | 2 horas | Limitada |
Problema: Sistema en Progress 4GL sin soporte móvil
Solución: Capa RESTful + Frontend en Vue.js
Resultado: +300% adopción por fuerza de ventas
"Integración directa de instrucciones SQL en lenguajes de programación convencionales"
String query = "SELECT * FROM clientes WHERE saldo > ?"; try (PreparedStatement stmt = conn.prepareStatement(query)) { stmt.setDouble(1, 1000.00); ResultSet rs = stmt.executeQuery(); while (rs.next()) { System.out.println(rs.getString("nombre")); } }
import sqlite3 conn = sqlite3.connect('empresa.db') cursor = conn.cursor() cursor.execute(""" INSERT INTO empleados (id, nombre) VALUES (?, ?) """, (101, 'Ana López')) conn.commit()
Tecnología | Ejemplo | Patrón Clave |
---|---|---|
ORM | Hibernate (Java) | Session.save(cliente) |
Micro ORM | Dapper (.NET) | connection.Query<Cliente>() |
Query Builder | Knex.js (Node) | knex.select().from().where() |
var clientes = dbContext.Clientes .Where(c => c.UltimaCompra > DateTime.Now.AddMonths(-3)) .OrderBy(c => c.Nombre) .ToList();
Traducción SQL generada:
SELECT * FROM Clientes WHERE UltimaCompra > DATEADD(month, -3, GETDATE()) ORDER BY Nombre
// Ejemplo: Lenguaje para reglas de negocio rule "DescuentoVIP" when Cliente.tipo == "VIP" && Carrito.total > 1000 then aplicarDescuento(15%) end
var resultados = from p in productos where p.Precio > 100 join c in categorias on p.CategoriaId equals c.Id select new { p.Nombre, c.Grupo };
Escenario: Sistema de reservas de hotel
String sql = "INSERT INTO reservas (id, fecha_in, fecha_out) " + "VALUES (?, ?, ?)"; // Usar PreparedStatement...
@Entity public class Reserva { @Id private Long id; private LocalDate checkIn; private LocalDate checkOut; } // Uso: em.persist(nuevaReserva);
Reserva.crear() .paraCliente(123) .conHabitacion("SUITE") .del("2023-12-15").al("2023-12-20") .confirmar();
Criterio | SQL Embebido | ORM | DSL |
---|---|---|---|
Seguridad | ▲▲ (con PS) | ▲▲▲ | ▲▲▲ |
Productividad | ▲ | ▲▲ | ▲▲▲ |
Flexibilidad | ▲▲▲ | ▲▲ | ▲ |
"Modelo de componentes COM para acceso universal a datos, superando limitaciones de ODBC"
CoInitialize(NULL); IDBInitialize* pDBInit = NULL; CoCreateInstance(CLSID_SQLOLEDB, NULL, CLSCTX_INPROC_SERVER, IID_IDBInitialize, (void**)&pDBInit); // Configurar propiedades de conexión DBPROPSET dbPropSet[1]; // ... inicialización de propiedades pDBInit->Initialize();
┌─────────────────┐ ┌─────────────────┐ │ Aplicación │ │ Driver │ │ (ODBC API) │←─→│ Administrador │ └─────────────────┘ └─────────────────┘ ↓ ┌─────────────────────┐ │ Driver específico │ │ (MySQL, Oracle...) │ └─────────────────────┘
SQLHENV env; SQLHDBC dbc; SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env); SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc); SQLConnect(dbc, "DSN=miBD", SQL_NTS, "usuario", SQL_NTS, "clave", SQL_NTS);
String url = "jdbc:mysql://localhost:3306/miDB?useSSL=false"; try (Connection conn = DriverManager.getConnection(url, "user", "pass"); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM productos")) { while (rs.next()) { System.out.println(rs.getString("nombre")); } } catch (SQLException e) { e.printStackTrace(); }
Tipo | Implementación | Uso típico |
---|---|---|
Tipo 1 | JDBC-ODBC Bridge | Legacy (deprecated) |
Tipo 4 | Nativo puro | Aplicaciones modernas |
Estándar para embedding SQL estático en Java (ANSI/ISO SQL Part 10)
// SQLJ: #sql { INSERT INTO empleados (id, nombre) VALUES (:id, :nombre) };
Aspecto | ODBC | SQL/CLI |
---|---|---|
Origen | Microsoft | ISO/IEC |
Alcance | Solo Windows | Multiplataforma |
Compatibilidad | Legacy systems | Nuevos desarrollos |
Objetivo: Convertir este código JDBC a SQLJ:
String sql = "UPDATE productos SET precio = ? WHERE id = ?"; try (PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setDouble(1, nuevoPrecio); pstmt.setInt(2, idProducto); int filas = pstmt.executeUpdate(); System.out.println(filas + " registros actualizados"); }
#sql { UPDATE productos SET precio = :nuevoPrecio WHERE id = :idProducto }; System.out.println(SQLJ.getUpdateCount() + " registros actualizados");