Introducción
El personal de soporte necesita una línea de tiempo para cada ticket y un resumen que también incluya los tickets sin eventos. Usted relacionará las filas de actividad con los tickets, escribirá un informe SQL reutilizable y añadirá un índice respaldado por un plan de consulta. Que una respuesta parezca rápida con un conjunto de datos pequeño no demuestra que la ruta de acceso sea eficiente.
Este laboratorio independiente proporciona el esquema básico de tickets utilizado en las clases anteriores. Usted creará la relación, el informe y el índice por su cuenta, usando una base de datos D1 desechable.
Use su propia cuenta de aprendizaje y una VM nueva. La configuración prepara Node.js 22.22.0 y después ejecuta npm install para instalar Wrangler 4.131.1 localmente en el proyecto, junto con las dependencias de evaluación, en /home/labex/project/ticket-database. Las versiones de las dependencias directas están fijadas; la instalación crea su propio archivo de bloqueo. Durante la configuración no se inicia ninguna sesión en la nube ni se ejecuta trabajo sobre la base de datos evaluada. En una máquina personal, instale la misma versión de Wrangler con npm install --save-dev wrangler@4.131.1 dentro de su proyecto.
Este ejercicio utiliza registros sintéticos pequeños dentro de las asignaciones gratuitas de D1. El uso existente de la cuenta se incluye en esas asignaciones. No necesita un dominio adquirido. Conserve esta VM hasta comprobar tanto la eliminación de los recursos como el cierre de sesión.
Autorice esta VM y seleccione la cuenta
En este paso, conectará este terminal nuevo a su propia cuenta de aprendizaje. Iniciar sesión en el Dashboard por sí solo no autoriza la VM. Los permisos de D1 permiten crear, modificar y eliminar bases de datos. Revise la página de consentimiento real, incluido el acceso en segundo plano (Background Access), antes de autorizar.
Abra el proyecto preparado e inspeccione la CLI cuya versión está fijada:
cd /home/labex/project/ticket-database
npx wrangler --version
Debe aparecer 4.131.1. Inicie la autorización mediante dispositivo; --device muestra un código para el navegador y --browser=false le permite elegir cómo abrir el navegador:
npx wrangler login --device --browser=false --scopes account:read user:read d1:write
Abra en el navegador la URL que se muestra, introduzca el código actual, confirme su cuenta de aprendizaje y los permisos, y autorice el acceso. Espere a que el terminal confirme que la operación se realizó correctamente. Nunca pegue contraseñas ni tokens en los archivos del proyecto.
npx wrangler whoami --json
Compruebe loggedIn: true y lea los valores name e id de la cuenta, incluso si solo aparece una cuenta. Copie el ID previsto en la configuración siguiente. La variable de shell siguiente usa 6 bytes aleatorios, es decir, 12 caracteres hexadecimales, para evitar colisiones con otros estudiantes. Un documento aquí (here-document) escribe el JSON entre las líneas JSON; $RUN se expande dentro de él.
La barra invertida delante de $schema conserva esa clave JSON literalmente; $RUN sigue expandiéndose al nombre único de esta ejecución.
RUN=labex-c04-d04-$(openssl rand -hex 6)
cat > wrangler.jsonc <<JSON
{
"\$schema": "./node_modules/wrangler/config-schema.json",
"name": "$RUN",
"account_id": "YOUR_ACCOUNT_ID",
"main": "src/index.js",
"compatibility_date": "2026-09-15",
"workers_dev": true,
"preview_urls": false
}
JSON
Reemplace YOUR_ACCOUNT_ID antes de ejecutar el bloque. Mantenga abierto este terminal para que RUN siga disponible. name identifica esta ejecución; account_id selecciona la cuenta para las operaciones en la nube. El archivo es JSON normal, que también es válido como JSONC. Escribirlo no implementa ningún Worker.
Relacione la actividad con los tickets
En este paso, añadirá una tabla de actividad para representar varios eventos de un ticket. Una clave externa vincula ticket_id de una actividad con un ticket real e impide que un evento apunte a un registro principal inexistente. La configuración proporciona el esquema conocido de tickets para que pueda concentrarse en las relaciones y las consultas.
Cree una base de datos desechable en la nube. --binding DB proporciona al código de la aplicación un nombre corto, --update-config registra su nombre real y UUID en wrangler.jsonc, y --use-remote=false mantiene el desarrollo en el entorno local:
npx wrangler d1 create "$RUN-db" --binding DB --update-config --use-remote=false
Lea el nombre y el ID creados y, después, inspeccione el enlace guardado:
cat wrangler.jsonc
La entrada DB debe indicar la base de datos de esta ejecución. Un enlace (binding) es una conexión configurada entre el código y un recurso. Su UUID identifica la base de datos en la nube, mientras que --local utiliza una base de datos SQLite independiente en esta VM. Incluya siempre --local o --remote en los comandos SQL.
Lea y aplique localmente los tickets proporcionados:
cat schema.sql
npx wrangler d1 execute DB --local --file schema.sql
Escriba el esquema de actividad y el conjunto de datos fijo. Los valores enteros de las marcas de tiempo son valores sintéticos de ordenación, no horas actuales:
cat > activity.sql <<'SQL'
CREATE TABLE activity (
id INTEGER PRIMARY KEY,
ticket_id INTEGER NOT NULL REFERENCES tickets(id),
action TEXT NOT NULL,
created_at INTEGER NOT NULL
);
INSERT INTO activity (id, ticket_id, action, created_at) VALUES
(1, 1, 'opened', 100),
(2, 1, 'assigned', 200),
(3, 2, 'opened', 110),
(4, 2, 'closed', 300);
INSERT INTO tickets (id, subject, source) VALUES (3, 'No activity yet', 'seed');
SQL
Aplíquelo localmente:
npx wrangler d1 execute DB --local --file activity.sql
Los tickets 1 y 2 tienen dos eventos cada uno; el ticket 3 no tiene ninguno. En el paso siguiente verá cómo incluir ese ticket con cero eventos en un resumen.
Escriba un informe sobre la actividad de los tickets
En este paso, combinará filas de dos tablas. Una unión (join) relaciona filas mediante una relación. t y a son alias cortos para los nombres de las tablas. LEFT JOIN conserva cada ticket aunque no tenga actividad; COUNT(a.id) cuenta solo los identificadores de actividad coincidentes. GROUP BY agrupa los eventos por ticket y AS event_count asigna un nombre a la columna calculada.
Escriba una consulta de informe reutilizable y de solo lectura. Guardar una consulta en un archivo SQL permite ejecutar el mismo informe local y remotamente:
cat > report.sql <<'SQL'
SELECT t.id, t.subject, COUNT(a.id) AS event_count
FROM tickets AS t
LEFT JOIN activity AS a ON a.ticket_id = t.id
GROUP BY t.id, t.subject
ORDER BY t.id;
SQL
Ejecute el informe:
npx wrangler d1 execute DB --local --file report.sql
Debe obtener los recuentos 2, 2 y 0 para los tickets 1, 2 y 3. Una unión interna eliminaría el ticket 3; contar * contaría su fila de marcador sin coincidencia. Lea los eventos cronológicos de un ticket:
npx wrangler d1 execute DB --local --command "SELECT action, created_at FROM activity WHERE ticket_id = 1 ORDER BY created_at;"
Debe obtener opened en 100 y después assigned en 200. El informe responde cuántos eventos tiene cada ticket; la consulta filtrada responde qué eventos pertenecen a un ticket concreto.
Use un plan de consulta para justificar un índice
En este paso, añadirá una estructura de búsqueda para la línea de tiempo de actividad. Un índice almacena valores consultables en un orden que puede evitar el análisis de filas no relacionadas. Utiliza almacenamiento y añade trabajo cuando cambian los valores indexados, por lo que debe crearlo para una consulta concreta.
Inspeccione el plan antes de añadir el índice. EXPLAIN QUERY PLAN describe la estrategia de acceso de SQLite; no mide el tiempo transcurrido:
npx wrangler d1 execute DB --local --command "EXPLAIN QUERY PLAN SELECT action, created_at FROM activity WHERE ticket_id = 1 ORDER BY created_at;"
Busque un análisis de activity y, posiblemente, una estructura temporal para ordenar los resultados. Cree un índice combinado con ticket_id en primer lugar y created_at en segundo:
cat > index.sql <<'SQL'
CREATE INDEX idx_activity_ticket_created ON activity(ticket_id, created_at);
SQL
npx wrangler d1 execute DB --local --file index.sql
npx wrangler d1 execute DB --local --command "EXPLAIN QUERY PLAN SELECT action, created_at FROM activity WHERE ticket_id = 1 ORDER BY created_at;"
El plan debe mencionar ahora idx_activity_ticket_created para la búsqueda. El formato exacto puede variar. El conjunto de datos fijo es demasiado pequeño para realizar comparaciones de tiempo útiles; aquí, la evidencia es la ruta de acceso elegida.
Añada un evento nuevo después de crear el índice y vuelva a ejecutar el informe:
npx wrangler d1 execute DB --local --command "INSERT INTO activity (id, ticket_id, action, created_at) VALUES (5, 1, 'replied', 400);"
npx wrangler d1 execute DB --local --file report.sql
El ticket 1 ahora tiene tres eventos. Un índice debe conservar la corrección de las escrituras además de favorecer las lecturas.
Ejecute el informe y la consulta indexada en D1
En este paso, instalará el esquema y el índice revisados en la base de datos remota del laboratorio. Los archivos locales por sí solos no crean un esquema remoto.
npx wrangler d1 execute DB --remote --file schema.sql
npx wrangler d1 execute DB --remote --file activity.sql
npx wrangler d1 execute DB --remote --file index.sql
Cuando se le solicite, confirme únicamente la base de datos de este laboratorio. Añada la misma actividad final, inspeccione el informe y el plan de consulta remoto:
npx wrangler d1 execute DB --remote --command "INSERT INTO activity (id, ticket_id, action, created_at) VALUES (5, 1, 'replied', 400);"
npx wrangler d1 execute DB --remote --command "$(cat report.sql)"
npx wrangler d1 execute DB --remote --command "EXPLAIN QUERY PLAN SELECT action, created_at FROM activity WHERE ticket_id = 1 ORDER BY created_at;"
$(cat report.sql) pasa el texto del informe como consulta. En remoto, --file utiliza el flujo de importación e informa de los metadatos de la importación en lugar de mostrar una tabla con el resultado de un SELECT. Los recuentos remotos son 3, 2 y 0, y el plan indica el nombre de su índice. Esto demuestra el resultado y la ruta de acceso en D1 sin suponer una mejora de tiempo concreta. Si lo desea, abra la base de datos D1 de esta ejecución en el Dashboard para realizar una comprobación de solo lectura de la tabla y el esquema; conserve el plan de la CLI como evidencia del índice.

Este ejemplo muestra las cinco filas de actividad remotas y sus relaciones mediante ticket_id. El nombre generado de la base de datos identifica esta ejecución de ejemplo; el tuyo será distinto. Los números de created_at son valores sintéticos de ordenación, no marcas de tiempo actuales. Esta tabla es una referencia visual de las filas; la salida de EXPLAIN QUERY PLAN de la CLI anterior confirma el uso del índice, no una mejora de tiempo.
Elimine los recursos desechables
En este paso, eliminará únicamente los recursos de este laboratorio mientras la VM aún está autorizada. Termine primero todas las comprobaciones funcionales. Conserve la configuración hasta completar la verificación de la eliminación.
npx wrangler d1 delete DB
Inspeccione la solicitud de confirmación y confirme únicamente la base de datos de esta ejecución. Después, enumere las bases de datos:
npx wrangler d1 list --json
El nombre y el UUID de la base de datos que registró deben estar ausentes en una respuesta correcta. Es posible que permanezcan otros recursos. Un error de autenticación o de red no permite llegar a una conclusión: resuelva el problema de acceso y repita la lectura antes de continuar. Ejecute la verificación de este paso mientras aún tenga la sesión iniciada.
Finalice la autorización de esta VM
En este paso, finalizará la autorización solo después de que la comprobación independiente de la eliminación se complete correctamente. El cierre de sesión elimina la autorización de Wrangler almacenada en esta VM; cerrar una VM por sí solo no limpia los recursos de la nube.
npx wrangler logout
npx wrangler whoami --json
Debe aparecer loggedIn: false. Esta consulta sin autenticación puede finalizar con un código distinto de cero; eso solo es normal cuando la respuesta estructurada indica explícitamente que ha cerrado sesión. Complete la verificación y después cierre el entorno del laboratorio.
Resumen
Practicó cómo consultar e indexar la actividad de los tickets. Comprobó resultados observables de la base de datos, mantuvo explícitos la cuenta seleccionada y el estado local, y eliminó los recursos desechables antes de cerrar sesión.



