Patrones de base de datos: DAO/VO
omegaUp utiliza el patrón DAO/VO (Objeto de acceso a datos/Objeto de valor) para todas las interacciones de la base de datos.
Descripción general del patrón
Objetos de valor (VO)
- Mapear directamente a las tablas de la base de datos.
- Una clase de VO por mesa.
- Generado automáticamente a partir del esquema.
- Ubicado en
frontend/server/src/DAO/VO/
Objetos de acceso a datos (DAO)
- Clases estáticas para operaciones de bases de datos.
- Una clase DAO por mesa
- Métodos:
search(),getByPK(),save(),delete() - Ubicado en
frontend/server/src/DAO/
Ejemplo de uso
Buscando usuarios
// Create a VO with search criteria
$user = new Users();
$user->setEmail('user@example.com');
// Search using DAO
$results = UsersDAO::search($user);
// Process results
if (count($results) > 0) {
$foundUser = $results[0];
echo "User ID: " . $foundUser->getUserId();
echo "Username: " . $foundUser->getUsername();
}
Creando un registro
// Create new VO
$problem = new Problems();
$problem->setTitle('My Problem');
$problem->setAlias('my-problem');
$problem->setAuthorId($userId);
// Save using DAO
ProblemsDAO::save($problem);
Obteniendo la clave principal
// Get user by ID
$user = UsersDAO::getByPK($userId);
if ($user !== null) {
echo $user->getUsername();
}
Principios clave
Sin SQL directo en los controladores
Los controladores nunca escriben SQL directamente. Usan DAO:
// ✅ Good: Using DAO
$runs = RunsDAO::searchByUserId($userId);
// ❌ Bad: Direct SQL
$runs = $conn->query("SELECT * FROM Runs WHERE user_id = ...");
Evite consultas O(n)
Cree consultas manuales para viajes sencillos de ida y vuelta:
// ❌ Bad: Multiple queries
foreach ($users as $user) {
$runs = RunsDAO::searchByUserId($user->userId);
}
// ✅ Good: Single query
$userIds = array_map(fn($u) => $u->userId, $users);
$runs = RunsDAO::searchByUserIds($userIds);
Generación automática
Las clases VO y DAO se generan automáticamente a partir del esquema de la base de datos:
- Modificar el esquema de la base de datos (agregar migración)
- Ejecute
./stuff/update-dao.sh - Se regeneran las clases VO y DAO.
Documentación relacionada
- Arquitectura de backend - Estructura de backend
- Esquema de base de datos - Descripción general del esquema
- Pautas de codificación - Pautas de PHP