Ticket-Aktivitäten abfragen und indizieren

CloudflareBeginner
Jetzt üben

Einführung

Supportmitarbeiter benötigen für jedes Ticket eine Chronik sowie eine Zusammenfassung, die auch Tickets ohne Ereignisse enthält. Sie verknüpfen Aktivitätszeilen mit Tickets, schreiben einen wiederverwendbaren SQL-Bericht und fügen einen durch einen Abfrageplan begründeten Index hinzu. Eine schnell wirkende Antwort bei einem winzigen Datensatz ist kein ausreichender Beleg für einen effizienten Zugriffspfad.

Dieses eigenständige Lab stellt das grundlegende Ticketschema aus früheren Lektionen bereit. Sie erstellen die Beziehung, den Bericht und den Index selbst und verwenden dafür eine temporäre D1-Datenbank.

Verwenden Sie Ihr eigenes Lernkonto und eine frische VM. Die Einrichtung installiert zunächst Node.js 22.22.0 und führt anschließend npm install für Wrangler 4.131.1 als projektspezifische Abhängigkeit sowie alle Abhängigkeiten für die Bewertung unter /home/labex/project/ticket-database aus. Die direkten Abhängigkeitsversionen sind festgelegt; bei der Installation wird eine eigene Lockdatei erstellt. Während der Einrichtung erfolgen weder eine Cloud-Anmeldung noch bewertete Datenbankarbeiten. Installieren Sie auf einem persönlichen Rechner dieselbe Wrangler-Version mit npm install --save-dev wrangler@4.131.1 in Ihrem Projekt.

Für diese Übung werden kleine synthetische Datensätze innerhalb der D1 Free allowances verwendet. Die bereits bestehende Nutzung Ihres Kontos wird auf diese Kontingente angerechnet. Sie benötigen keine gekaufte Domain. Behalten Sie diese VM, bis sowohl die Ressourcenlöschung als auch die Abmeldung überprüft wurden.

Diese VM autorisieren und das Konto auswählen

In diesem Schritt verbinden Sie dieses frische Terminal mit Ihrem eigenen Lernkonto. Eine Anmeldung im Dashboard allein autorisiert die VM nicht. D1-Berechtigungen erlauben das Erstellen, Ändern und Löschen von Datenbanken. Lesen Sie die tatsächliche Zustimmungsseite einschließlich Background Access, bevor Sie die Autorisierung bestätigen.

Öffnen Sie das vorbereitete Projekt und prüfen Sie die festgelegte CLI-Version:

cd /home/labex/project/ticket-database
npx wrangler --version

Erwarten Sie 4.131.1. Starten Sie die Geräteautorisierung. --device zeigt einen Browsercode an, und --browser=false überlässt Ihnen die Wahl des Browsers:

npx wrangler login --device --browser=false --scopes account:read user:read d1:write

Öffnen Sie die angezeigte URL in Ihrem Browser, geben Sie den aktuellen Code ein, bestätigen Sie Ihr Lernkonto und die Berechtigungen und autorisieren Sie den Zugriff. Warten Sie, bis das Terminal den erfolgreichen Abschluss bestätigt. Fügen Sie niemals Passwörter oder Tokens in Projektdateien ein.

npx wrangler whoami --json

Prüfen Sie loggedIn: true. Lesen Sie anschließend den Kontonamen (name) und die Konto-ID (id), auch wenn nur ein Konto aufgeführt ist. Übernehmen Sie die gewünschte ID in die folgende Konfiguration. Die folgende Shell-Variable verwendet 6 zufällige Bytes, also 12 hexadezimale Zeichen, um Namenskonflikte mit anderen Lernenden zu vermeiden. Ein Here-Dokument schreibt den JSON-Inhalt zwischen den Zeilen JSON; $RUN wird darin ersetzt.

Der umgekehrte Schrägstrich vor $schema erhält diesen JSON-Schlüssel unverändert; $RUN wird weiterhin durch den eindeutigen Namen dieses Durchlaufs ersetzt.

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

Ersetzen Sie YOUR_ACCOUNT_ID, bevor Sie den Block ausführen. Lassen Sie dieses Terminal geöffnet, damit RUN verfügbar bleibt. name identifiziert diesen Durchlauf; account_id bestimmt das Konto für Cloud-Operationen. Die Datei ist gewöhnliches JSON und damit auch gültiges JSONC. Durch das Schreiben der Datei wird kein Worker bereitgestellt.

Aktivitäten mit Tickets verknüpfen

In diesem Schritt fügen Sie eine Aktivitätstabelle hinzu, die mehrere Ereignisse für ein Ticket darstellen kann. Ein Fremdschlüssel verknüpft ticket_id einer Aktivität mit einem vorhandenen Ticket. Dadurch kann ein Ereignis nicht auf ein fehlendes übergeordnetes Ticket verweisen. Die Einrichtung stellt das bekannte Ticketschema bereit, damit Sie sich auf Beziehungen und Abfragen konzentrieren können.

Erstellen Sie eine temporäre Cloud-Datenbank. --binding DB gibt dem Anwendungscode einen kurzen Namen, --update-config trägt den tatsächlichen Namen und die UUID in wrangler.jsonc ein, und --use-remote=false hält die Entwicklung lokal:

npx wrangler d1 create "$RUN-db" --binding DB --update-config --use-remote=false

Lesen Sie den erstellten Namen und die ID und prüfen Sie anschließend das gespeicherte Binding:

cat wrangler.jsonc

Der Eintrag DB muss die Datenbank dieses Durchlaufs benennen. Ein Binding ist eine konfigurierte Verbindung zwischen Code und einer Ressource. Die UUID identifiziert die Cloud-Datenbank, während --local eine separate SQLite-Datenbank in dieser VM verwendet. Geben Sie in SQL-Befehlen immer entweder --local oder --remote an.

Lesen Sie das bereitgestellte Ticketschema und wenden Sie es lokal an:

cat schema.sql
npx wrangler d1 execute DB --local --file schema.sql

Schreiben Sie das Aktivitätsschema und den festen Datensatz:

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

Wenden Sie es lokal an:

npx wrangler d1 execute DB --local --file activity.sql

Tickets 1 und 2 haben jeweils zwei Ereignisse; Ticket 3 hat keine. Im nächsten Schritt sehen Sie, wie dieses Ticket ohne Ereignisse in einer Zusammenfassung berücksichtigt wird.

Einen Aktivitätsbericht für Tickets schreiben

In diesem Schritt kombinieren Sie Zeilen aus zwei Tabellen. Ein Join ordnet Zeilen anhand einer Beziehung einander zu. t und a sind kurze Aliase für die Tabellennamen. LEFT JOIN behält jedes Ticket bei, auch wenn es keine Aktivitäten hat; COUNT(a.id) zählt nur passende Aktivitäts-IDs. GROUP BY fasst die Ereignisse pro Ticket zusammen, und AS event_count benennt die berechnete Spalte.

Schreiben Sie eine wiederverwendbare, schreibgeschützte Berichtsabfrage. Wenn Sie eine Abfrage in einer SQL-Datei speichern, können Sie denselben Bericht lokal und remote ausführen:

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

Führen Sie den Bericht aus:

npx wrangler d1 execute DB --local --file report.sql

Erwarten Sie für die Tickets 1, 2 und 3 die Anzahlen 2, 2 und 0. Ein Inner Join würde Ticket 3 auslassen; das Zählen von * würde dessen nicht zugeordnete Platzhalterzeile mitzählen. Lesen Sie die Ereignisse eines Tickets in chronologischer Reihenfolge:

npx wrangler d1 execute DB --local --command "SELECT action, created_at FROM activity WHERE ticket_id = 1 ORDER BY created_at;"

Erwarten Sie zuerst opened bei 100 und anschließend assigned bei 200. Der Bericht beantwortet die Frage, wie viele Ereignisse jedes Ticket hat. Die gefilterte Abfrage beantwortet, welche Ereignisse zu einem bestimmten Ticket gehören.

Einen Index mithilfe eines Abfrageplans begründen

In diesem Schritt fügen Sie eine Suchstruktur für die Aktivitätschronik hinzu. Ein Index speichert durchsuchbare Werte in einer Reihenfolge, die das Scannen nicht relevanter Zeilen vermeiden kann. Er benötigt Speicherplatz und verursacht zusätzlichen Aufwand, wenn sich indizierte Werte ändern. Fügen Sie ihn daher für eine konkrete Abfrage hinzu.

Prüfen Sie den Plan, bevor Sie den Index hinzufügen. EXPLAIN QUERY PLAN beschreibt die Zugriffsstrategie von SQLite; die verstrichene Zeit wird damit nicht gemessen:

npx wrangler d1 execute DB --local --command "EXPLAIN QUERY PLAN SELECT action, created_at FROM activity WHERE ticket_id = 1 ORDER BY created_at;"

Suchen Sie nach einem Scan von activity und möglicherweise nach einer temporären Struktur für die Sortierung. Erstellen Sie einen kombinierten Index, bei dem ticket_id an erster und created_at an zweiter Stelle steht:

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;"

Der Plan sollte nun für die Suche idx_activity_ticket_created nennen. Die genaue Formatierung kann abweichen. Der feste Datensatz ist zu klein für aussagekräftige Zeitvergleiche; der gewählte Zugriffspfad ist hier der Beleg.

Fügen Sie nach dem Erstellen des Index ein neues Ereignis hinzu und führen Sie den Bericht erneut aus:

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

Ticket 1 hat jetzt drei Ereignisse. Ein Index muss korrekte Schreibvorgänge ebenso unterstützen wie Lesevorgänge.

Bericht und indizierte Abfrage in D1 ausführen

In diesem Schritt installieren Sie das geprüfte Schema und den Index in der Remote-Labordatenbank. Lokale Dateien allein erstellen kein Remote-Schema.

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

Bestätigen Sie bei der Nachfrage ausschließlich diese Labordatenbank. Fügen Sie dieselbe abschließende Aktivität hinzu, prüfen Sie den Bericht und den Remote-Abfrageplan:

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) übergibt den Berichtstext als Abfrage. --file verwendet remote den Import-Workflow und gibt Importmetadaten statt einer Ergebnistabelle für SELECT aus. Die Remote-Anzahlen sind 3, 2 und 0, und der Plan nennt Ihren Index. Damit sind Ergebnis und Zugriffspfad in D1 nachgewiesen, ohne eine bestimmte Zeitverbesserung vorauszusetzen. Öffnen Sie diese D1-Datenbank bei Bedarf im Dashboard, um das Tabellen- oder Schemasichtprüfpunkts schreibgeschützt zu kontrollieren. Verwenden Sie den CLI-Plan weiterhin als Beleg für den Index.

Ticketaktivität in D1 Studio

Dieses Beispiel zeigt die fünf entfernten Aktivitätszeilen und ihre Verknüpfungen über ticket_id. Der generierte Datenbankname kennzeichnet diesen Beispieldurchlauf; dein Name wird abweichen. Die Zahlen in created_at sind synthetische Sortierwerte und keine aktuellen Zeitstempel. Diese Tabelle dient als visuelle Referenz für die Zeilen; die obige CLI-Ausgabe von EXPLAIN QUERY PLAN belegt die Indexnutzung, keine Verbesserung der Laufzeit.

Temporäre Ressourcen löschen

In diesem Schritt entfernen Sie nur die Ressourcen dieses Labs, solange die VM noch autorisiert ist. Führen Sie zuerst alle Funktionsprüfungen vollständig durch. Behalten Sie die Konfiguration, bis die Löschung überprüft wurde.

npx wrangler d1 delete DB

Lesen Sie die Nachfrage und bestätigen Sie ausschließlich die Datenbank dieses Durchlaufs. Listen Sie anschließend die Datenbanken auf:

npx wrangler d1 list --json

Der von Ihnen notierte Datenbankname und die UUID dürfen in einer erfolgreichen Antwort nicht mehr erscheinen. Andere Ressourcen können weiterhin vorhanden sein. Ein Authentifizierungs- oder Netzwerkfehler ist nicht aussagekräftig: Stellen Sie den Zugriff wieder her und wiederholen Sie die Abfrage, bevor Sie fortfahren. Führen Sie die Überprüfung dieses Schritts aus, solange Sie noch angemeldet sind.

Die Autorisierung dieser VM beenden

In diesem Schritt beenden Sie die Autorisierung erst, nachdem die unabhängige Löschprüfung erfolgreich war. Durch die Abmeldung wird die auf dieser VM gespeicherte Wrangler-Autorisierung entfernt. Das bloße Schließen einer VM bereinigt keine Cloud-Ressourcen.

npx wrangler logout
npx wrangler whoami --json

Erwarten Sie loggedIn: false. Diese nicht authentifizierte Abfrage kann mit einem Fehlercode beendet werden. Das ist nur dann erwartungsgemäß, wenn die strukturierte Antwort ausdrücklich bestätigt, dass Sie abgemeldet sind. Schließen Sie nach der Überprüfung die Lab-Umgebung.

Zusammenfassung

Sie haben das Abfragen und Indizieren von Ticket-Aktivitäten geübt. Sie haben überprüfbare Datenbankergebnisse kontrolliert, das ausgewählte Konto und den lokalen Zustand eindeutig festgelegt und die temporären Ressourcen vor der Abmeldung entfernt.