Esquemas y Espacios


Mi Problema 🤔

Cuando defino un modelo de datos en Vapor, puedo especificar el schema, que corresponde al nombre de la tabla en la base de datos. Pero mantener todas las tablas en el esquema predeterminado no me escala: para conservar una arquitectura organizada, quiero agrupar mis tablas en diferentes espacios de nombres según criterios funcionales en lugar de concentrarlas todas en un mismo sitio. Así consigo una separación lógica por dominios o módulos de la aplicación.

Mi Solución 🧩

Para asignar una tabla a un espacio de nombres específico, sobrescribo la propiedad estática space en el modelo. Esta propiedad me permite definir el namespace donde residirá la tabla, dándome una organización más granular de la estructura de mi base de datos.

public final class LocationCityModel: Model {
    public static let schema = "cities"
    public static let space: String? = "location"

    @ID() public var id: UUID?
    @Field(.name) public var name: String

    public init() { }
}

Mi Resultado 🎯

Hay un detalle que tuve que acertar: debo declarar la propiedad space como tipo String? (opcional). Cuando la declaré como String (no opcional), no sobrescribió la propiedad heredada del protocolo Model, sino que creó una nueva propiedad con el mismo nombre. Eso hizo que el framework ignorara mi configuración del espacio de nombres y mantuviera las tablas en el esquema predeterminado, sin ninguna indicación de error aparente que me avisara.

Si te preguntas cómo crear estos espacios de nombres automáticamente en la base de datos, explico cómo convertirlo en una migración en Migrate Spaces.

Keep coding, keep running 🏃‍♂️