resources/views/pages/frontend/docs/uml-clases-eav-catalogos.md
Última modificación: 24 Oct, 2026

2.2 Clases: Patrón EAV & Catálogos

Este diagrama modela la extensibilidad del perfil de usuario mediante el patrón Entity-Attribute-Value (EAV) y la arquitectura recursiva del diccionario maestro de datos en Mañuti.


1. Explicación y Semántica del Diagrama

El diseño resuelve dos retos de modelado empresarial sin alterar esquemas relacionales fijos:

  • Patrón EAV (ConfiguracionUsuario):
    • Permite asociar pares clave-valor dinámicos al usuario (avatar, teléfono móvil, dirección, paginación de grillas).
    • Mantiene soporte para Cifrado Dinámico AES-256 en atributos sensibles.
    • Gestiona un histórico inmutable vinculando cada atributo a un estado de vigencia (CFG_ACTIVO vs CFG_HISTORICO).
  • Diccionario Recursivo (Catalogo):
    • Implementa una estructura de árbol en una única tabla relacional mediante una relación reflexiva (catalogo_id hacia su propia clave primaria).
    • Provee el método estático getOpciones($slugPadre) optimizado mediante almacenamiento en caché en Redis.
  • Configuración Global (ConfiguracionSistema):
    • Almacén centralizado de tipo Clave-Valor para parametrizar umbrales de seguridad, políticas operativas y modo mantenimiento.

2. Cómo se Lee este Diagrama

  • Usuario "1" *-- "*" ConfiguracionUsuario: Composición fuerte. Si un usuario se elimina físicamente, sus configuraciones extendidas se destruyen en cascada.
  • ConfiguracionUsuario --> Catalogo: Relación semántica donde la columna cat_status apunta a la tabla maestra de catálogos para gobernar la vigencia.
  • Catalogo "1" o-- "*" Catalogo: Agregación recursiva. Un nodo catálogo padre agrupa múltiples opciones hijas que comparten su contexto taxonómico.

3. Implementación en el Framework Mañuti

  • Métodos Helper en Usuario:
    • $user->getConfig('clave', $default): Resuelve el valor vigente y ejecuta el descifrado al vuelo si la clave está en security_pii_fields.
    • $user->setConfig('clave', $valor): Marca el valor previo como histórico (CFG_HISTORICO) e inserta el nuevo registro activo (CFG_ACTIVO).
  • Caché en Catalogo:
    • Catalogo::getOpciones('SYS_ESTATUS_USUARIO') lee desde Redis (cat_slug_...) con TTL de 24 horas y purgado automático ante modificaciones en el panel administrativo.

4. Diagrama Mermaid

classDiagram
    class Usuario {
        +id: BigInt
        +nombres: String
        +correo: String
        +getConfig(clave, default): Mixed
        +setConfig(clave, valor): Void
    }

    class ConfiguracionUsuario {
        +id: BigInt
        +usuario_id: BigInt
        +clave: String
        +valor: Text
        +cat_status: BigInt
    }

    class ConfiguracionSistema {
        +id: BigInt
        +clave: String
        +valor: Text
        +tipo_dato: String
        +getValor(clave): Static
    }

    class Catalogo {
        +id: BigInt
        +catalogo_id: BigInt
        +catalogo: String
        +etiqueta: String
        +valor: String
        +orden: Integer
        +activo: Boolean
        +getOpciones(slugPadre): Collection
    }

    %% Relaciones
    Usuario "1" *-- "*" ConfiguracionUsuario : tiene
    ConfiguracionUsuario --> Catalogo : cat_status
    Catalogo "1" o-- "*" Catalogo : Hijos (Recursiva)

    %% Notas
    note for ConfiguracionUsuario "Modelo EAV para extender perfil\n(Avatar, Teléfono, Preferencias)\nVersionado por cat_status"
    note for Catalogo "Patrón Adjacency List\nAutoreferencial para diccionarios"

Enlaces Relacionados

Edita este documento en >> uml-clases-eav-catalogos.md
← Volver a la Landing Page