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_ACTIVOvsCFG_HISTORICO).
- Diccionario Recursivo (
Catalogo):- Implementa una estructura de árbol en una única tabla relacional mediante una relación reflexiva (
catalogo_idhacia su propia clave primaria). - Provee el método estático
getOpciones($slugPadre)optimizado mediante almacenamiento en caché en Redis.
- Implementa una estructura de árbol en una única tabla relacional mediante una relación reflexiva (
- 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 columnacat_statusapunta 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á ensecurity_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"