1. Diferencia entre objetos registrados, objetos seriales, y clases persistentes
Puntos Clave
- Objetos Registrados (%RegisteredObject): Objetos transitorios que existen solo en memoria sin persistencia
- Clases Persistentes (%Persistent): Objetos guardados a disco con operaciones CRUD completas y proyección SQL
- Objetos Seriales (%SerialObject): Objetos embebidos serializados dentro de objetos persistentes padre
- Ubicación de Almacenamiento: Registrados (solo memoria), Seriales (embebidos en padre), Persistentes (globals independientes)
Notas Detalladas
Resumen
InterSystems IRIS proporciona tres categorías fundamentales de clase de objeto, cada una sirviendo propósitos arquitectónicos distintos.
Objetos Registrados (%RegisteredObject)
- Naturaleza: Objetos transitorios que existen solo en memoria durante runtime
- Capacidades: Proporcionan la interfaz de objeto central incluyendo métodos para crear instancias, establecer propiedades, e invocar métodos de instancia
- Limitación: No pueden guardarse a disco
- Casos de Uso: Ideal para estructuras de datos temporales, clases de utilidad, y procesamiento en memoria donde no se requiere persistencia
Clases Persistentes (%Persistent)
- Herencia: Extienden %Persistent, que en sí extiende %RegisteredObject, heredando todas las capacidades de interfaz de objeto
- Interfaz de Persistencia: Proporciona métodos como %Save(), %OpenId(), %Delete(), y %Exists() para operaciones CRUD completas
- Almacenamiento: A cada instancia de objeto persistente se le asigna un Object ID (OID) único y se almacena en su propio nodo global usando una estructura $List
- Proyección SQL: Automáticamente proyectada a tablas SQL, haciéndolas accesibles tanto a través de acceso de objeto como consultas SQL
- Almacenamiento Predeterminado: Usa globals nombrados con el nombre de clase anexado con "D" para datos e "I" para índices
Objetos Seriales (%SerialObject)
- Naturaleza: Categoría especial diseñada para embeber dentro de otros objetos
- Sin Identidad Independiente: No tiene existencia independiente ni OID único
- Almacenamiento: Serializado y almacenado como parte de la estructura de datos del objeto padre
- Ejemplo: Una clase Address definida como objeto serial puede embeberse en una clase Customer persistente
- Proyección SQL: Aparecen como múltiples columnas en la tabla padre, con nombres de columna formados combinando el nombre de propiedad, un guion bajo, y cada nombre de propiedad embebida (ej., Home_Street, Home_City)
- Casos de Uso: Ideal para tipos de datos complejos que no tienen significado independiente de su entidad padre
Referencias de Documentación
2. Selecciona índices apropiados para optimización de rendimiento
Puntos Clave
- Índices Estándar: Conjuntos ordenados mapeando valores de propiedad a Object IDs para búsquedas eficientes
- Índices Bitmap: Usan bitstrings comprimidos para columnas de baja cardinalidad y consultas complejas
- Almacenamiento de Índice: Almacenado en globals con sufijo "I", subscriptados por nombre de índice y valores collated
- Regla de Rendimiento: Indexar campos usados en cláusulas WHERE para evitar escaneos completos de tabla
Notas Detalladas
Resumen
La selección de índice es crítica para optimizar rendimiento de consulta en InterSystems IRIS.
Índices Estándar
- Propósito: Crear un mapeo ordenado entre uno o más valores de propiedad y los Object IDs de objetos conteniendo esas propiedades
- Estructura Global: Usa el nombre de clase con una "I" anexada (ej., ^MyApp.PersonI para clase MyApp.Person)
- Diseño de Subscript:
- Primer subscript: Nombre de índice (permite múltiples índices en el mismo global)
- Segundo subscript: Valor de datos collated (collation SQLUPPER predeterminada para ordenamiento insensible a mayúsculas)
- Tercer subscript: Object ID
- Beneficio: Habilita recuperación rápida de objetos coincidiendo criterios específicos sin escanear el extent entero
Índices Bitmap
- Estructura: Usan bitstrings comprimidos donde cada posición de bit corresponde a un Object ID
- Cómo Funcionan: Para un valor indexado dado, el bitmap contiene 1 para filas donde ese valor está presente y 0 donde está ausente
- Mejor Para: Columnas de baja cardinalidad (columnas con pocos valores distintos como State, Status, o Category) y consultas complejas combinando múltiples condiciones
- Funciones Bitstring: $Bit, $BitCount, $BitFind, $BitLogic para operaciones lógicas eficientes (AND, OR) a través de múltiples índices bitmap
- Limitación: Solo funcionan con estructuras de almacenamiento predeterminadas usando Object IDs numéricos asignados por sistema
Estrategia de Selección de Índice
- Cuándo Indexar: Campos frecuentemente usados en cláusulas WHERE, condiciones JOIN, o cláusulas ORDER BY
- Sin Índices: El optimizador de consultas debe realizar escaneos completos de tabla, examinando cada fila para encontrar coincidencias
- Columnas de Alta Cardinalidad: Usar índices estándar para columnas con muchos valores distintos
- Columnas de Baja Cardinalidad: Considerar índices bitmap para columnas con pocos valores distintos
- Conciencia de Sobrecarga: Los índices consumen espacio de almacenamiento e incurren sobrecarga de mantenimiento durante operaciones INSERT, UPDATE, y DELETE
- Tipos de Índice Especiales:
- Índices IDKEY: Definen el identificador único para objetos
- Índices únicos: Aplican restricciones de unicidad sobre campos específicos o combinaciones de campos
Referencias de Documentación
3. Comprende relaciones entre globals, objetos, y SQL
Puntos Clave
- Modelo de Almacenamiento Único: Las tres vistas acceden las mismas estructuras de datos global subyacentes
- Estructura Global: Datos almacenados en formato $List, subscriptados por Object ID en globals ^ClassNameD
- Proyección SQL: Creación automática de tabla con columnas coincidiendo propiedades, filas coincidiendo objetos
- Acceso Bidireccional: Cambios vía objetos, SQL, o globals inmediatamente visibles en todas las vistas
Notas Detalladas
Resumen
InterSystems IRIS implementa una arquitectura de datos unificada única donde globals, objetos, y SQL son tres vistas diferentes del mismo almacenamiento multidimensional subyacente.
Modelo de Almacenamiento de Objeto
- Tipo de Almacenamiento: Cada clase persistente que usa %Storage.Persistent (el predeterminado) almacena instancias de objeto en nodos globales
- Definición de Almacenamiento: Automáticamente gestionada por el compilador de clase, determina cómo las propiedades mapean a estructuras globales
- Nomenclatura Predeterminada: Los datos se almacenan en un global nombrado con el nombre de clase completo más un sufijo "D" (^MyApp.PersonD)
- Estructura de Nodo: Cada instancia de objeto ocupa un solo nodo global subscripted por su Object ID
- Almacenamiento de Propiedad: Todas las propiedades no transitorias se almacenan dentro de ese nodo usando una estructura $List
Proyección SQL
- Creación Automática de Tabla: Cada clase persistente se convierte en una tabla con el mismo nombre
- Mapeo: Las propiedades se convierten en columnas, cada instancia de objeto se convierte en una fila
- Acceso Object ID: Se convierte en la columna ID de la tabla (también accesible como %ID o ROWID)
- Definición Bidireccional: Definir clases primero y obtener tablas SQL automáticamente, o definir tablas vía DDL y obtener clases persistentes automáticamente
- Almacenamiento Idéntico: Las estructuras de almacenamiento son idénticas independientemente del enfoque que uses
Consistencia de Método de Acceso
- Visibilidad Inmediata: Datos insertados vía SQL INSERT son inmediatamente accesibles vía métodos de objeto como %OpenId(), y objetos guardados vía %Save() son inmediatamente consultables vía SQL SELECT
- Acceso Global: Proporciona la vista de nivel más bajo con manipulación directa usando SET, KILL, MERGE, $ORDER, y $QUERY
Elección de Métodos de Acceso
- Acceso Objeto: Para lógica de negocio transaccional con tipado fuerte y encapsulación
- Acceso SQL: Para operaciones basadas en conjunto y reportería
- Acceso Global: Para optimización de bajo nivel o estructuras de datos especializadas
Los tres métodos de acceso mantienen consistencia porque operan sobre el mismo almacenamiento subyacente.
Referencias de Documentación
4. Determina cuándo usar tipos de dato stream apropiadamente
Puntos Clave
- Caso de Uso: Datos excediendo límites de longitud de cadena (documentos, imágenes, videos, texto grande)
- Tipos de Stream: Global streams (almacenados en base de datos) vs. File streams (archivos externos)
- Character vs. Binary: GlobalCharacter/FileCharacter para texto, GlobalBinary/FileBinary para datos binarios
- Temporary Streams: TmpCharacter y TmpBinary para procesamiento transitorio sin persistencia
Notas Detalladas
Resumen
Los tipos de dato stream resuelven el problema de almacenar y manipular datos más grandes que límites de longitud de cadena estándar en InterSystems IRIS. Los streams son esenciales para manejar objetos grandes como documentos, imágenes, videos, archivos XML, o cualquier contenido que exceda el tamaño máximo de cadena.
Jerarquía de Clase Stream
InterSystems IRIS proporciona seis clases stream principales, todas heredando de %Stream.Object que define la interfaz stream común.
Global Streams
- Clases: %Stream.GlobalCharacter y %Stream.GlobalBinary
- Almacenamiento: Datos dentro de la base de datos en nodos globales
- Chunking: El sistema automáticamente divide datos stream en chunks menores a 32KB y escribe en nodos globales secuenciales
- Beneficios: Integración completa de base de datos, respaldo, restauración, mirroring, y participación en procesamiento de transacción
- Character Streams: Manejan datos de texto con conciencia de codificación de caracteres
- Binary Streams: Manejan datos binarios crudos como imágenes o PDFs
- Casos de Uso: Cuando necesitas integración completa de base de datos, consistencia transaccional, y volumen de datos manejable
File Streams
- Clases: %Stream.FileCharacter y %Stream.FileBinary
- Almacenamiento: Archivos externos en el sistema de archivos; la base de datos almacena solo una referencia a la ruta de archivo
- Casos de Uso: Objetos extremadamente grandes, o cuando archivos necesitan compartirse con aplicaciones externas
- Consideraciones:
- Requieren procedimientos de respaldo cuidadosos (tanto base de datos como archivos referenciados)
- No participan en database mirroring
- Introducen dependencias en rutas y permisos de sistema de archivos
Temporary Streams
- Clases: %Stream.TmpCharacter y %Stream.TmpBinary
- Propósito: Proporcionan interfaces stream para datos transitorios que no necesitan persistencia
- Casos de Uso: Pipelines de procesamiento, transformaciones de datos, construcción de respuestas para servicios web
Métodos Stream Comunes
- Procesamiento Secuencial: Read(), Write(), Rewind(), AtEnd()
- Búsqueda: FindAt() para buscar dentro de streams
- Manejo de Error: Siempre verificar valores de retorno de estado y examinar %objlasterror al establecer propiedad Filename
Referencias de Documentación
5. Aprovecha soporte JSON en InterSystems IRIS
Puntos Clave
- Entidades Dinámicas: %DynamicObject y %DynamicArray para estructuras JSON de runtime sin esquemas predefinidos
- Constructores Literales: Usar sintaxis {} y [] para crear objetos y arrays JSON inline
- Serialización: %ToJSON(), %FromJSON(), %FromJSONFile() para convertir entre JSON y objetos
- JSON Adaptor: %JSON.Adaptor habilita cualquier clase para exportar/importar JSON con parámetros de mapeo
Notas Detalladas
Resumen
InterSystems IRIS proporciona soporte JSON nativo completo a través de múltiples enfoques complementarios.
Entidades Dinámicas
- Clases: %Library.DynamicObject y %Library.DynamicArray
- Flexibilidad: Crear y manipular estructuras JSON en runtime sin predefinir esquemas
- Constructores Literales: `set obj = {"name":"John", "age":30}` o `set arr = ["value1", "value2"]`
- Expresiones Dinámicas: Usar paréntesis para evaluación de runtime, ej., `{"date":($ZD($H,3))}`
Operaciones de Entidad Dinámica
Acceso a Propiedad:
- Sintaxis punto: `obj.name`
- Sintaxis método: `obj.%Get("name")`
Modificación:
- `obj.age = 31` o `obj.%Set("age", 31)`
- `obj.%Remove("name")` para remover propiedades
Operaciones Array:
- `%Push()` y `%Pop()` para operaciones de pila
- Los métodos pueden encadenarse para interfaces fluidas
Serialización:
- `%ToJSON()`: Serializar entidad dinámica a cadena JSON canónica
- `%FromJSON()` y `%FromJSONFile()`: Deserializar cadenas o archivos JSON de vuelta a entidades dinámicas
%JSON.Adaptor para Clases Tipadas
- Propósito: Habilitar cualquier clase registrada, serial, o persistente para importar y exportar JSON
- Uso: Agregar %JSON.Adaptor como superclase
- Métodos Ganados: %JSONExport(), %JSONExportToStream(), %JSONExportToString(), %JSONImport()
- Personalización: Parámetros de propiedad para nombres de campo personalizados, inclusión/exclusión, y formato especial
- Bloques XData Mapping: Definir múltiples mapeos para diferentes representaciones JSON
- %JSON.Formatter: Control adicional sobre formato de salida JSON con indentación y saltos de línea
Integración JSON y SQL
- Almacenar JSON en campos VARCHAR
- Usar funciones JSON en consultas SQL
- Crear índices sobre propiedades JSON para consulta eficiente
Este soporte JSON completo hace InterSystems IRIS ideal para aplicaciones modernas dirigidas por API, arquitecturas de microservicios, y escenarios requiriendo datos flexibles sin esquema junto a estructuras relacionales tradicionales.
Referencias de Documentación
Resumen de Preparación para el Examen
Conceptos Críticos a Dominar:
- Jerarquía de Clase de Objeto: Comprender herencia de %RegisteredObject, %Persistent, y %SerialObject y casos de uso
- Selección de Índice: Saber cuándo usar índices estándar vs. bitmap basado en cardinalidad y patrones de consulta
- Modelo de Datos Unificado: Captar cómo globals, objetos, y SQL representan el mismo almacenamiento subyacente
- Selección de Stream: Elegir tipos de stream apropiados basados en tamaño de datos, tipo, y requisitos de almacenamiento
- Enfoques JSON: Diferenciar entre entidades dinámicas y %JSON.Adaptor para diferentes escenarios
Escenarios Comunes de Examen:
- Determinar qué tipo de clase de objeto usar para un requisito de negocio dado
- Seleccionar estrategia de índice óptima para clase persistente con patrones de consulta específicos
- Explicar cómo cambios de objeto son visibles en SQL y viceversa
- Elegir entre global streams y file streams para datos binarios grandes
- Implementar importación/exportación JSON para APIs RESTful y servicios web
Recomendaciones de Práctica Práctica:
- Crear ejemplos de clases registradas, seriales, y persistentes con relaciones
- Definir y probar tanto índices estándar como bitmap, examinando estructura global
- Acceder los mismos datos vía objetos ObjectScript, consultas SQL, y comandos globales directos
- Implementar clases con propiedades stream y practicar lectura/escritura de datos grandes
- Construir clases con %JSON.Adaptor y trabajar con entidades dinámicas para datos sin esquema
- Usar interfaz SQL del Management Portal para examinar estructura global y almacenamiento de índice
- Practicar examinando estructuras globales usando Terminal y utilidad ^%G
Secciones de Documentación Clave:
- GOBJ.pdf: Referencia completa de programación orientada a objetos (Secciones 2, 11, 23, 24)
- GGBL.pdf: Estructura global y detalles de almacenamiento (Sección 6)
- GJSON.pdf: Integración JSON y entidades dinámicas (Secciones 1-6)
- GSQL.pdf: Proyección SQL y optimización de consulta (Secciones 11, 19)
Ayudas de Memoria:
- Jerarquía RPS: Registered (memoria) -> Persistent (disco) -> Serial (embebido)
- Nomenclatura de Índice: ClassD (datos), ClassI (índices), patrón de sufijo global
- Tipos de Stream: Global (en base de datos), File (externo), Tmp (temporal)
- Clases JSON: Dynamic (runtime), Adaptor (mapeo tiempo de compilación)