Por qué importan las bases de datos en FiveM
Todo servidor serio de FiveM necesita almacenamiento persistente. Inventarios de jugador, cuentas bancarias, propiedad de vehículos, contactos del teléfono y registros de trabajos tienen que sobrevivir a los reinicios. MySQL es el sistema de base de datos estándar en el ecosistema de FiveM, y MariaDB es un fork popular que ofrece mejor rendimiento. Entender cómo montar, consultar y optimizar tu base de datos es esencial para construir servidores de rol fiables capaces de aguantar cientos de jugadores concurrentes sin perder datos.
Configurar oxmysql
El recurso oxmysql es el estándar moderno para conectar con MySQL en FiveM, sustituyendo a las librerías más antiguas mysql-async y ghmattimysql. Para configurarlo, descarga la última release, colócala en tu carpeta de resources y configura la cadena de conexión en tu server.cfg con set mysql_connection_string. La cadena sigue el formato mysql://user:password@host/database y admite parámetros adicionales para connection pooling, timeouts y SSL. Asegúrate de que oxmysql arranca antes que cualquier recurso que dependa de él colocándolo temprano en el orden de ensure.
Escribir consultas
oxmysql ofrece varios métodos de consulta: MySQL.query para SELECT que devuelven filas, MySQL.update para UPDATE y DELETE que devuelven el número de filas afectadas, MySQL.insert para INSERT que devuelve el último insert ID y MySQL.scalar para consultas que devuelven un único valor. Usa siempre consultas parametrizadas con el placeholder ? para evitar inyecciones SQL. Pasa los parámetros como una tabla en el segundo argumento en lugar de concatenar valores directamente en la cadena de la consulta.
Patrones async y promesas
Todas las operaciones de oxmysql son asíncronas para evitar bloquear el hilo del servidor durante la comunicación con la base de datos. Puedes usar sintaxis de callback pasando una función como último argumento o la sintaxis basada en promesas con MySQL.query.await dentro de un Citizen.CreateThread. La sintaxis await se lee más limpia y evita el anidamiento de callbacks, pero recuerda que solo puede usarse dentro de corrutinas. Para la carga inicial de datos al arrancar el servidor, usa la función MySQL.ready para asegurarte de que la conexión está establecida antes de lanzar las primeras consultas.
Buenas prácticas de diseño del esquema
Diseña tus tablas con índices apropiados sobre las columnas que consultes con frecuencia, como los identificadores de jugador. Usa el tipo de datos adecuado para cada columna para minimizar almacenamiento y mejorar velocidad. Guarda datos JSON en columnas TEXT cuando necesites esquemas flexibles, pero evita consultar dentro de estructuras JSON a menudo porque se salta la optimización por índices. Crea relaciones de foreign key entre tablas relacionadas para mantener integridad de datos y plantéate usar transacciones cuando varios inserts o updates relacionados deban tener éxito o fallar a la vez.
Optimización y mantenimiento
Monitoriza el rendimiento revisando los slow query logs y analizando los planes de ejecución con EXPLAIN. Cachea en memoria del servidor, usando tablas Lua, los datos a los que se accede con frecuencia para reducir las idas y vueltas a la base de datos. Implementa connection pooling mediante la configuración de oxmysql para gestionar consultas concurrentes de forma eficiente. Programa tareas de mantenimiento regulares como optimizar tablas y limpiar registros huérfanos de jugadores borrados. Respalda tu base de datos a diario con mysqldump o soluciones de backup automatizadas para evitar pérdidas catastróficas por fallos de hardware o tablas corruptas.
