Tablas HANA - .hdbtable y CDS

Definir esquemas de datos con sintaxis CDS en SAP HANA

📋

.hdbtable

¿Qué es?

  • Archivo de definición de tabla en SAP HANA
  • Usa sintaxis CDS (Core Data Services)
  • Similar a entidades con campos y tipos
  • Se despliega automáticamente con HANA deployment

Ubicación típica:

db/src/tables/ProductRatings.hdbtable

Beneficios:

  • Versionado con el código
  • Migraciones automáticas
  • Integraciones con APIs OData
🔧

Sintaxis CDS

Elementos básicos:

  • namespace: Identificador único (ej: com.logali)
  • entity: Define la tabla
  • key: Campo primario
  • Tipos: String, Integer, Decimal, Date, Time, Boolean

Anotaciones comunes:

  • @cds.persistence.name: Nombre en BD
  • @title: Etiqueta legible
  • @readonly: Campo de solo lectura
  • @mandatory: Campo obligatorio
💡 Tip: Las anotaciones ofrecen metadatos que Fiori y otros tools usan automáticamente.

Caso: Tabla de Ratings

Estructura típica:

  • id: UUID (clave primaria)
  • productoId: Referencia a producto
  • usuarioId: Quién escribió la review
  • puntuacion: 1-5 estrellas
  • comentario: Texto libre (long string)
  • fecha: Cuándo se creó (timestamp)

Información adicional:

  • Útil para e-commerce, marketplaces, productos SaaS
  • Comentarios son buscables con índice fulltext
  • Permite análisis de sentimiento
🔍

.hdbfulltextindex

¿Para qué?

  • Indexa campos de texto para búsquedas rápidas
  • Permite búsquedas tipo "contiene palabra"
  • Ejemplo: "encuéntrame reviews con 'pantalla rota'"

Configuración:

  • Apunta a la tabla y campo (ej: comentario)
  • Define idioma (es, en, de, etc.)
  • Se indexa automáticamente al insertar

Cuándo usar:

  • Campos con texto libre > 100 caracteres
  • Búsquedas frecuentes en ese campo
  • NO para campos pequeños (IDs, números)

📝 Ejemplo Completo: Tabla ProductRatings

1. Archivo .hdbtable

db/src/tables/ProductRatings.hdbtable
namespace com.logali.ecommerce; entity ProductRatings { key id : UUID; // Referencias productoId : String; usuarioId : String; // Datos de rating puntuacion : Integer enum { 1; 2; 3; 4; 5; }; comentario : String; // Texto libre para fulltext index // Auditoría fechaCreacion : Timestamp default getCurrentTimestamp(); activo : Boolean default true; }

2. Archivo .hdbfulltextindex

db/src/indexes/ProductRatings_Comments.hdbfulltextindex
index "com.logali.ecommerce::ProductRatings.Comment" on ( "ProductRatings"("comentario") ) type TEXT LANGUAGE 'SPANISH' FUZZY SEARCH ENABLED
📌 Nota: FUZZY SEARCH permite encontrar palabras similares (ej: "pantala" encuentra "pantalla"). LANGUAGE = SPANISH activa stemming y stopwords en español.

3. Consultas de Ejemplo

Búsqueda simple por puntuación:

SELECT * FROM "ProductRatings" WHERE puntuacion >= 4 AND activo = true ORDER BY fechaCreacion DESC;

Búsqueda fulltext en comentarios:

SELECT id, productoId, puntuacion, comentario FROM "ProductRatings" WHERE CONTAINS(comentario, 'pantalla rota', FUZZY(0.8)) AND puntuacion <= 2;

Agregar: Rating promedio por producto:

SELECT productoId, AVG(puntuacion) as promedio, COUNT(*) as totalReviews FROM "ProductRatings" WHERE activo = true GROUP BY productoId;
💡 Tip: CONTAINS() es la función específica para búsquedas fulltext. FUZZY(0.8) permite 20% de tolerancia en coincidencias.

4. Despliegue

cf deploy // Desde raíz del proyecto SAP
📌 Flujo: SAP HANA lee .hdbtable → crea tabla en BD → lee .hdbfulltextindex → crea índice. Todo automático con el despliegue.

5. Exponerla como API OData

// En el archivo .cds principal (db/data-model.cds) using { com.logali.ecommerce.ProductRatings } from './tables/ProductRatings'; service ReviewService { entity Ratings as projection on ProductRatings; }
✅ Resultado: Automáticamente expone GET /odata/v4/ReviewService/Ratings con búsqueda OData estándar ($filter, $search, $orderby).