🗂️ Esquema de Base de Datos
La base de datos de Rial AI está modelada de manera relacional en PostgreSQL y representa las relaciones entre compañías, marcas, usuarios, prendas, proyectos de generación, imágenes, modelos virtuales, publicaciones y control de créditos.
📊 Estructura General
Todos los modelos en nuestra base de datos siguen un patrón consistente que incluye:
id: Identificador incremental para uso interno del desarrolladorpublicId: UUID (identificador único) que se puede compartir con el usuario y frontend de forma seguracreatedAt: Timestamp de creación del registroupdatedAt: Timestamp de última actualización
¿Por qué dos IDs? El
idinterno es secuencial y optimizado para consultas de base de datos, mientras que elpublicIdes un UUID que no revela información sobre la cantidad de registros y es seguro para exponer públicamente.
🏢 Modelos de Organización
Company (Compañía)
Representa a una empresa que puede tener múltiples marcas. Las empresas pueden operar con o sin sistema de créditos.
model Company {
id Int @id @default(autoincrement())
publicId String @unique @default(uuid())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
name String
logo String
credits Int? @default(0)
brands Brand[]
users User[]
}Campos Clave
name: Nombre de la compañíalogo: URL del logo corporativocredits: Saldo actual de créditos (opcional, default: 0)- Nota: Por ahora no manejamos activamente el sistema de créditos
Relaciones
brands[]: Una compañía puede tener múltiples marcasusers[]: Una compañía puede tener múltiples usuarios
Brand (Marca)
Cada marca pertenece a una compañía y contiene sus propias prendas, proyectos, usuarios y modelos virtuales.
model Brand {
id Int @id @default(autoincrement())
publicId String @unique @default(uuid())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
name String
logo String
companyId Int
company Company @relation(fields: [companyId], references: [id])
garments Garment[]
projects Project[]
users User[]
models Model[]
}Campos Clave
name: Nombre de la marcalogo: URL del logo de la marcacompanyId: Referencia a la compañía propietaria
Relaciones
company: Pertenece a una compañíausers[]: Usuarios asignados a la marcagarments[]: Prendas de la marcaprojects[]: Proyectos de generaciónmodels[]: Modelos virtuales personalizados
User (Usuario)
Representa a un miembro de la plataforma con diferentes niveles de acceso y permisos.
model User {
id Int @id @default(autoincrement())
publicId String @unique @default(uuid())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
email String @unique
role UserRole @default(COMPANY_ADMIN)
companyId Int?
brandId Int?
sessionId String @unique
transactions CreditTransaction[]
brand Brand? @relation(fields: [brandId], references: [id])
company Company? @relation(fields: [companyId], references: [id])
}
enum UserRole {
ADMIN
COMPANY_ADMIN
BRAND_ADMIN // no manejado actualmente
}
Campos Clave
email: Email único del usuario (usado para autenticación)role: Nivel de acceso del usuarioADMIN: Acceso completo a toda la plataformaCOMPANY_ADMIN: Administrador de una compañía específicaBRAND_ADMIN: Administrador de una marca específica
sessionId: Identificador único de sesión para autenticación (relacionado con autentificación de supabase)companyId: Referencia opcional a compañía (para COMPANY_ADMIN)brandId: Referencia opcional a marca (para BRAND_ADMIN)
Relaciones
company?: Compañía asociada (opcional)brand?: Marca asociada (opcional)transactions[]: Transacciones de créditos del usuario
👕 Gestión de Prendas
Garment (Prenda)
Representa las prendas subidas por las marcas para ser utilizadas en los proyectos de generación.
model Garment {
id Int @id @default(autoincrement())
publicId String @unique @default(uuid())
name String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
season String?
type GarmentType
brandId Int?
brand Brand? @relation(fields: [brandId], references: [id])
images GarmentImage[]
projects ProjectImage[] @relation("ImageGarments")
result GeneratedImage[]
}
enum GarmentType {
TOP
BOTTOM
FOOTWEAR
ACCESSORY
FACESWAP
}Campos Clave
name: Nombre descriptivo de la prendatype: Categoría de la prendaTOP: Camisetas, blusas, chaquetas, etc.BOTTOM: Pantalones, faldas, shorts, etc.FOOTWEAR: Zapatos, botas, sandalias, etc.ACCESSORY: Bolsos, joyas, sombreros, etc.FACESWAP: Imágenes para reemplazo facial
season: Temporada asociada (opcional) - ej: “Verano 2024”, “Otoño/Invierno 2024”brandId: Referencia a la marca propietaria
Relaciones
brand: Marca propietaria de la prendaimages[]: Imágenes asociadas a la prendaprojects[]: Proyectos donde se utiliza la prendaresults[]: Imágenes generadas usando esta prenda
GarmentImage (Imagen de Prenda)
Almacena las imágenes originales de las prendas subidas por las marcas.
model GarmentImage {
id Int @id @default(autoincrement())
publicId String @unique @default(uuid())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
url String
garmentId Int
garment Garment @relation(fields: [garmentId], references: [id])
}Campos Clave
url: URL de la imagen almacenada en Google Cloud StoragegarmentId: Referencia a la prenda asociada
Relaciones
garment: Prenda a la que pertenece la imagen
🎯 Sistema de Proyectos
Project (Proyecto)
Un proyecto define un proceso de generación de imágenes con un tipo específico y configuraciones particulares.
model Project {
id Int @id @default(autoincrement())
publicId String @unique @default(uuid())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
name String
projectType ProjectType
status ProjectStatus @default(CREATING)
options Json
brandId Int
season String?
description String?
images GeneratedImage[]
brand Brand @relation(fields: [brandId], references: [id])
uploads ProjectImage[]
}
enum ProjectType {
LIFESTYLE
BATCH
LOOKBOOK
FACESWAP
}
enum ProjectStatus {
CREATING
IN_PROGRESS
PENDING_APPROVAL
IN_REVIEW
APPROVED
COMPLETED
CANCELLED
}Campos Clave
name: Nombre descriptivo del proyectoprojectType: Tipo de generaciónLIFESTYLE: Generación contextualizada con escenarios personalizados (en desarrollo)BATCH: Generación masiva de prendas individualesLOOKBOOK: Generación de conjuntos completos (en desarrollo)FACESWAP: Reemplazo de rostros
status: Estado actual del proyectooptions: Configuración en JSON con parámetros específicos del tipo de proyectoseason: Temporada asociada (opcional)description: Descripción detallada del proyecto
Relaciones
brand: Marca propietaria del proyectouploads[]: Imágenes de entrada del proyectoimages[]: Imágenes generadas en el proyecto
ProjectImage (Imagen de Proyecto)
Representa una entrada de generación dentro de un proyecto, es decir, una combinación específica de prendas con su configuración.
model ProjectImage {
id Int @id @default(autoincrement())
publicId String @unique @default(uuid())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
settings Json
projectId Int
images GeneratedImage[]
project Project @relation(fields: [projectId], references: [id])
garments Garment[] @relation("ImageGarments")
SKU String
status ProjectImageStatus @default(IN_PROGRESS)
}
enum ProjectImageStatus {
IN_PROGRESS
PENDING_APPROVAL
REJECTED
APPROVED
}Campos Clave
settings: Configuración específica en JSON (pose, fondo, modelo, etc.)SKU: Código de identificación del productostatus: Estado de aprobación de la imagenprojectId: Referencia al proyecto
Relaciones
project: Proyecto al que pertenecegarments[]: Prendas utilizadas en esta generaciónimages[]: Imágenes generadas para esta entrada
🖼️ Gestión de Imágenes
GeneratedImage (Imagen Generada)
Almacena las imágenes generadas por IA con sistema de versionado y aprobación.
model GeneratedImage {
id Int @id @default(autoincrement())
publicId String @unique @default(uuid())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
url String
status ImageStatus @default(PENDING)
reason String?
uploadId Int
projectId Int
project Project @relation(fields: [projectId], references: [id])
upload ProjectImage @relation(fields: [uploadId], references: [id])
previous GeneratedImage? @relation("PreviousImages", fields: [previousId], references: [id])
previousId Int? @unique
next GeneratedImage? @relation("PreviousImages")
isFinal Boolean @default(true)
garment Garment? @relation(fields: [garmentId], references: [id])
garmentId Int?
}
enum ImageStatus {
PENDING
PENDING_APPROVAL
APPROVED
REJECTED
FAILED
}
Campos Clave
url: URL de la imagen generadastatus: Estado de la imagen en el flujo de aprobaciónreason: Razón de rechazo (si aplica)isFinal: Indica si es la versión final aprobadapreviousId: Referencia a imagen anterior (para versionado)
Sistema de Versionado
Las imágenes pueden tener múltiples versiones. Cuando se solicita una mejora o corrección:
- Se crea una nueva
GeneratedImage - Se establece
previousIdapuntando a la versión anterior - Solo la imagen final puede tener
isFinal = true
Relaciones
project: Proyecto al que perteneceupload: Entrada específica del proyectoprevious?: Versión anterior (para versionado)next?: Versión siguiente (para versionado)garment?: Prenda principal utilizada
👤 Modelos
Model (Modelo)
Representa los modelos del catálogo Rial, que pueden ser globales o específicos de una marca.
model Model {
id Int @id @default(autoincrement())
publicId String @unique @default(uuid())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
name String
gender Gender
age Int
image String
brandId Int?
brand Brand? @relation(fields: [brandId], references: [id])
}
enum Gender {
MALE
FEMALE
OTHER
}Campos Clave
name: Nombre del modelogender: Género del modeloage: Edad aproximada del modeloimage: URL de la imagen de referencia del modelobrandId: Referencia a marca (opcional - si es null, es un modelo global)
Tipos de Modelos
- Modelos Globales:
brandId = null- Disponibles para todas las marcas - Modelos Personalizados:
brandId != null- Exclusivos de una marca específica
Relaciones
brand?: Marca propietaria (opcional)
💳 Sistema de Créditos
Nota: Este sistema está definido en la base de datos pero aún no está implementado en la aplicación.
CreditTransaction (Transacción de Créditos)
Registra todas las compras y usos de créditos en el sistema.
model CreditTransaction {
id Int @id @default(autoincrement())
publicId String @unique @default(uuid())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
amount Int
transactionType TransactionType
userId Int
user User @relation(fields: [userId], references: [id])
}
enum TransactionType {
PURCHASE
USAGE
}Campos Clave
amount: Cantidad de créditostransactionType: Tipo de transacciónPURCHASE: Compra de créditosUSAGE: Uso de créditos para generación
userId: Usuario que realizó la transacción
Relaciones
user: Usuario asociado a la transacción
📰 Gestión de Contenido
Post (Publicación)
Sistema de publicaciones y contenido de prensa para el sitio web y blog.
model Post {
id Int @id @default(autoincrement())
publicId String @unique @default(uuid())
title String
description String
publicationDate DateTime?
image String
file String
tags String[]
type PostType
isPublished Boolean @default(false)
authorName String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
enum PostType {
PUBLICATION
PRESS
}Campos Clave
title: Título de la publicacióndescription: Contenido o descripción del postpublicationDate: Fecha de publicación programadaimage: URL de imagen destacadafile: URL del archivo asociadotags: Array de etiquetas para categorizacióntype: Tipo de publicaciónPUBLICATION: Artículos del blogPRESS: Notas de prensa
isPublished: Estado de publicaciónauthorName: Nombre del autor
🔗 Diagrama de Relaciones
El diagrama de relaciones se encuentra en el siguiente enlace: Diagrama de Relaciones .
