Dokumentation · Technische Dokumentation

Datenbankschema

Dieses Dokument beschreibt die benutzerdefinierten Datenbanktabellen, die vom ADP Car Market Hub-Plugin erstellt werden. Alle Tabellen werden mit dem dbDelta()-Helper von WordPress verwaltet und bei der Plugin-Aktivierung erstellt. Ihre Schemaversionen werden in wp_options nachverfolgt, sodass dbDelta Spaltenänderungen bei Upgrades sicher anwenden kann.

Wann Sie dieses Dokument lesen sollten

Lesen Sie dieses Dokument, wenn Sie:

  • Backups, Aufbewahrungsfristen oder Compliance-Arbeiten für Plugin-Daten planen müssen.
  • Eigene Berichte auf Basis der Plugin-Tabellen erstellen möchten.
  • Fehlgeschlagene Schema-Upgrades oder fehlende Spalten diagnostizieren müssen.
  • Verstehen möchten, welche Tabellen bei der Deinstallation gelöscht werden und welche nicht.

Für das logische Entitätsmodell, das diese Tabellen verwendet, siehe Datenmodell.

Übersicht

Das Plugin erstellt fünf benutzerdefinierte Tabellen:

Tabellen-SuffixVerwendungszweckSchemaversion-Option
as24_vehiclesFahrzeug-Felddaten, ersetzt den Grossteil der wp_postmeta-Nutzung.as24ci_vehicles_db_version
as24ci_analyticsAnalytics-Ereignisse für Fahrzeugseiten und globale Filteraktionen.as24ci_analytics_db_version
as24ci_search_agentsSuchabo-Registrierungen von Besuchern (Smart Stock Alerts).as24ci_search_agent_db_version
as24ci_content_studio_jobsContent Studio-Generierungsaufträge (eine Zeile pro Auftrag).as24ci_content_studio_db_version
as24ci_content_studio_assetsIm Content Studio generierte Assets, verknüpft mit einem Auftrag über job_id.as24ci_content_studio_db_version

Die tatsächlichen Tabellennamen verwenden das WordPress-Präfix {$wpdb->prefix} (normalerweise wp_). Die Schemaversion der Analytics-Tabelle wird in as24ci_analytics_db_version gespeichert (Konstante AS24CI\Analytics::DB_VERSION_KEY). Die beiden Content Studio-Tabellen teilen sich eine einzige Schemaversion-Option (as24ci_content_studio_db_version, aktueller Wert 1.3.0), die in AS24CI\Content_Studio_Options::DB_VERSION definiert ist und von AS24CI\Content_Studio_Repository::maybe_create_tables() verwaltet wird.

Das Plugin stützt sich auch auf die WordPress-Core-Tabellen wp_posts, wp_postmeta, wp_term_relationships, wp_term_taxonomy und wp_terms für die Custom Post Types as24ci_car und as24ci_lead sowie die 15 Fahrzeug-Taxonomien. Diese Tabellen folgen dem Standard-WordPress-Schema und werden vom Plugin nicht neu definiert.

Alle fünf benutzerdefinierten Tabellen werden bei der Deinstallation automatisch gelöscht (siehe den Abschnitt Verhalten bei Deinstallation unten), unabhängig von der as24ci_delete_data_on_uninstall-Einstellung.



Tabelle: {$wpdb->prefix}as24_vehicles

Eigentümer: AS24CI\Vehicle_Repository. Erstellt via Vehicle_Repository::maybe_create_table() bei der Aktivierung und bei nachfolgenden Durchläufen erneut überprüft. Die aktuelle Schemaversions-Konstante ist 1.1, gespeichert in der Option as24ci_vehicles_db_version.

Die Tabelle enthält eine Zeile pro Fahrzeug, die über die Spalte post_id mit ihrem as24ci_car-Post verknüpft ist. Die Spalte as24_id enthält die AutoScout24-Inseratskennung. Beide Spalten verfügen über eindeutige Indizes.

Spalten

SpalteTypHinweise
idbigint(20) unsignedPrimärschlüssel, Auto-Increment.
post_idbigint(20) unsignedWordPress-Post-ID für das verknüpfte as24ci_car. Eindeutig.
as24_idvarchar(64)AutoScout24-Inseratskennung. Eindeutig. Standardmässig eine leere Zeichenkette.
seller_idvarchar(64)AutoScout24-Verkäuferkennung (Seller ID).
makevarchar(100)
modelvarchar(100)
version_full_namevarchar(255)Vollständige Modellbezeichnung/Version, wie von der API geliefert.
condition_typevarchar(50)Z. B. new, used, demo (Werte spiegeln die Quell-API wider).
body_typevarchar(50)
fuel_typevarchar(50)
transmission_typevarchar(50)
drive_typevarchar(50)
color_exteriorvarchar(100)
color_interiorvarchar(100)
doorstinyint(3) unsignedStandardmässig 0.
seatstinyint(3) unsignedStandardmässig 0.
mileageint(10) unsignedStandardmässig 0.
cubic_capacityint(10) unsignedHubraum des Motors.
range_kmint(10) unsignedElektrische Reichweite in Kilometern.
first_registrationdateNullwert zulässig (Nullable).
first_reg_yearsmallint(5) unsignedJahreskomponente von first_registration. Standardmässig 0.
power_kwsmallint(5) unsigned
power_hpsmallint(5) unsigned
co2_emissionsmallint(5) unsignedg/km.
pricedecimal(10,2)Verkaufspreis.
list_pricedecimal(10,2)Listenpreis/UVP (falls angegeben).
currencychar(3)ISO-4217-Code; standardmässig EUR.
emission_standardvarchar(20)Z. B. Euro 6.
energy_labelchar(5)Energieetikette A-G.
battery_capacitydecimal(6,2)kWh.
vinvarchar(20)Fahrgestellnummer (VIN).
statusvarchar(30)Inseratsstatus, wie von der API geliefert.
is_livetinyint(1)1, wenn das Inserat aktuell live ist, andernfalls 0.
had_accidenttinyint(1)
equipment_codeslongtextJSON-Array mit Ausstattungscodes. Nullwert zulässig.
equipment_standardlongtextJSON-Liste der Serienausstattung. Nullwert zulässig.
equipment_optionallongtextJSON-Liste der Sonderausstattung. Nullwert zulässig.
imageslongtextJSON-Liste von Bild-URLs, wie von der API geliefert.
raw_datalongtextVollständige Quell-Payload, die für Diagnosezwecke aufbewahrt wird.
manual_overrideslongtextJSON-Objekt mit vom Administrator bearbeiteten Feldern, die importierte Werte überschreiben.
content_hashvarchar(64)Hash, der verwendet wird, um Re-Importe unveränderter Inserate zu überspringen.
imported_atdatetimeStandardmässig CURRENT_TIMESTAMP.
updated_atdatetimeStandardmässig CURRENT_TIMESTAMP. Siehe den Implementierungshinweis unten.

Implementierungshinweis: updated_at wird nur mit DEFAULT CURRENT_TIMESTAMP innerhalb des dbDelta-SQL erstellt, da das direkte Hinzufügen von ON UPDATE CURRENT_TIMESTAMP dazu führt, dass dbDelta bei jedem Laden des Plugins ein ALTER erneut ausgibt. Die ON UPDATE-Semantik wird über ein einmaliges ALTER nach der Ausführung von dbDelta angewendet.

Indizes

IndexTypSpaltenZweck
PRIMARYPrimaryidSurrogat-Primärschlüssel.
uk_as24_idUniqueas24_idEine Zeile pro AutoScout24-Inserat.
uk_post_idUniquepost_idEine Zeile pro WordPress-Fahrzeug-Post.
idx_make_modelIndexmake, modelSteuert die Archivfilter für Marke/Modell.
idx_priceIndexpricePreissortierung / Preisspannen-Filterung.
idx_mileageIndexmileageKilometersortierung / Kilometerbereichs-Filterung.
idx_first_reg_yearIndexfirst_reg_yearJahressortierung / Jahresbereichs-Filterung.
idx_fuel_conditionIndexfuel_type, condition_typeHäufiger kombinierter Filter.
idx_status_liveIndexstatus, is_liveAbfragen für Live-Inserate.
idx_content_hashIndexcontent_hashSuchen während der Änderungserkennung.

Sicherheitsnetz für manual_overrides

Nach der Ausführung von dbDelta führt das Repository eine SHOW COLUMNS ... LIKE 'manual_overrides'-Prüfung durch und gibt, falls die Spalte fehlt, ein explizites ALTER TABLE ... ADD COLUMN manual_overrides longtext DEFAULT NULL AFTER raw_data aus. Dies kompensiert gelegentliche Probleme bei der Spaltenerkennung in einigen MySQL/MariaDB-Kombinationen und stellt sicher, dass die manuelle Überschreibungsebene immer einen Ort zum Speichern von Daten hat.

Tabelle: {$wpdb->prefix}as24ci_analytics

Eigentümer: AS24CI\Analytics. Erstellt via Analytics::maybe_create_table() während der Aktivierung und bei jedem Laden der Admin-Seite erneut überprüft (die Methode ist auch an admin_init gekoppelt, sodass bestehende Installationen neue Spalten ohne manuelle Reaktivierung übernehmen).

Spalten

SpalteTypHinweise
idbigint(20) unsignedPrimärschlüssel, Auto-Increment.
post_idbigint(20) unsignedFahrzeug-Post-ID. 0 für globale Ereignisse wie Filtersuchen.
event_typevarchar(20)Ereigniskennung; standardmässig view. Validiert gegen ALLOWED_EVENTS.
extra_datalongtextOptionale JSON-codierte Payload. Nullwert zulässig.
created_atdatetimeStandardmässig CURRENT_TIMESTAMP.

Indizes

IndexTypSpalten
PRIMARYPrimaryid
post_event_dateIndexpost_id, event_type, created_at
event_typeIndexevent_type, created_at
created_atIndexcreated_at

Aufbewahrung (Retention)

Einträge erfolgen nur, wenn Options::ANALYTICS_ENABLED auf 1 gesetzt ist. Ein täglicher Bereinigungsjob läuft über den WP-Cron-Hook as24ci_daily_cleanup (bei der Aktivierung geplant, bei der Deaktivierung entfernt). Das Aufbewahrungsfenster wird über den Admin-Tab für Analytics konfiguriert.


Tabelle: {$wpdb->prefix}as24ci_search_agents

Eigentümer: AS24CI\Search_Agent. Erstellt über Search_Agent::maybe_create_table() bei init (Priorität 1), sodass sie sowohl für Admin- als auch für Frontend-AJAX-Handler verfügbar ist. Die aktuelle Schemaversion ist 1.1, gespeichert in der Option as24ci_search_agent_db_version. Die Erstellung wird durch den Schalter Options::FEATURE_SEARCH_AGENT gesteuert, aber das Schema wird bedingungslos registriert, wenn die Feature-Klasse geladen wird.

Spalten

SpalteTypHinweise
idBIGINT UNSIGNEDPrimärschlüssel, Auto-Increment.
nameVARCHAR(255)Anzeigename des Besuchers; standardmässig eine leere Zeichenkette.
emailVARCHAR(255)E-Mail-Adresse des Besuchers.
criteriaTEXTGespeicherte Suchkriterien (serialisierte Darstellung).
tokenVARCHAR(64)Token für Bestätigungs- und Abmeldelinks.
frequencyVARCHAR(20)Benachrichtigungshäufigkeit; standardmässig daily.
statusVARCHAR(20)Einer von pending, active, inactive, paused. Standardmässig pending.
created_atDATETIMEStandardmässig CURRENT_TIMESTAMP.
confirmed_atDATETIMENullbar; wird gesetzt, wenn der Besucher über Double-Opt-In bestätigt.

Indizes

IndexTypSpalten
PRIMARYPrimaryid
idx_statusIndexstatus
idx_tokenIndextoken

Datenschutz

Da die Tabelle personenbezogene Daten (Name, E-Mail, Suchpräferenzen) enthält, wird sie bei der Deinstallation unabhängig von der Einstellung as24ci_delete_data_on_uninstall gelöscht. Die Website-Betreiber sind für zusätzliche Aufbewahrungs- oder Export-Tools verantwortlich, die durch lokale Datenschutzvorschriften vorgeschrieben sind.

Tabelle: {$wpdb->prefix}as24ci_content_studio_jobs

Eigentümer: AS24CI\Content_Studio_Repository. Erstellt über Content_Studio_Repository::maybe_create_tables() (registriert als eigener Aktivierungs-Hook in der Haupt-Plugin-Datei und auch verzögert von den meisten Repository-Methoden aufgerufen). Enthält eine Zeile pro Content Studio-Generierungsjob. Statuswerte sind draft, queued, processing, ready und failed.

Spalten

SpalteTypHinweise
idbigint(20) unsignedPrimärschlüssel, Auto-Increment.
vehicle_post_idbigint(20) unsignedQuell-Fahrzeug-Post. Standardmässig 0.
vehicle_snapshot_hashvarchar(64)Hash des für den Job verwendeten Fahrzeug-Snapshots.
content_typevarchar(40)Angeforderter Inhaltstyp.
platform_presetvarchar(40)Zielplattform-Preset.
output_formatvarchar(20)Ausgabeformat.
preset_keyvarchar(80)Preset-Katalogschlüssel.
statusvarchar(20)Standardmässig draft.
prompt_payloadlongtextJSON-Prompt-Payload. Nullbar.
providervarchar(40)Standardmässig google.
modelvarchar(80)Provider-Modell.
languagevarchar(20)Ausgabesprache.
tonevarchar(40)Tonalität (Tone of voice).
attemptssmallint(5) unsignedVerarbeitungsversuche. Standardmässig 0.
last_errortextLetzte Fehlermeldung. Nullbar.
created_bybigint(20) unsignedWordPress-Benutzer-ID. Standardmässig 0.
created_atdatetimeStandardmässig CURRENT_TIMESTAMP.
updated_atdatetimeStandardmässig CURRENT_TIMESTAMP.
started_atdatetimeNullbar.
completed_atdatetimeNullbar.

Indizes: PRIMARY (id), vehicle_post_id, status_created (status, created_at), platform_preset, content_type.

Tabelle: {$wpdb->prefix}as24ci_content_studio_assets

Eigentümer: AS24CI\Content_Studio_Repository. Enthält die generierten Assets (Text, Bilder, Textpakete), die zu einem Job gehören, verknüpft über job_id.

Spalten

SpalteTypHinweise
idbigint(20) unsignedPrimärschlüssel, Auto-Increment.
job_idbigint(20) unsignedÜbergeordneter Job. Standardmässig 0.
vehicle_post_idbigint(20) unsignedQuell-Fahrzeug-Post. Standardmässig 0.
asset_typevarchar(40)Asset-Typ.
file_pathtextLokaler Dateipfad. Nullbar.
file_urltextÖffentliche URL. Nullbar.
mime_typevarchar(120)MIME-Typ.
file_sizebigint(20) unsignedBytes. Standardmässig 0.
widthint(10) unsignedBildbreite. Standardmässig 0.
heightint(10) unsignedBildhöhe. Standardmässig 0.
duration_secondsdecimal(8,2)Mediendauer. Standardmässig 0.00.
captionlongtextNullbar.
hashtagslongtextNullbar.
alt_texttextNullbar.
thumbnail_pathtextNullbar.
payload_jsonlongtextStrukturierte Payload (z. B. Textpakete). Nullbar.
scheduled_atdatetimeNullbar.
schedule_statusvarchar(32)Standardmässig unscheduled.
created_atdatetimeStandardmässig CURRENT_TIMESTAMP.

Indizes: PRIMARY (id), job_id, vehicle_post_id, asset_type, created_at, schedule_status, scheduled_at.

Vom Plugin verwendete WordPress-Core-Tabellen

Das Plugin ändert das Schema der WordPress-Core-Tabellen nicht. Es verlässt sich wie folgt auf sie:

  • wp_posts — speichert as24ci_car (Fahrzeuge) und as24ci_lead (Leads) Posts.
  • wp_postmeta — speichert abwärtskompatible Postmeta-Daten für Fahrzeug-Posts (_as24ci_listing_id, _as24ci_content_hash, _as24ci_images_hash, _as24ci_image_ids, _as24ci_manual_image_ids) und den Lead-Status (_as24ci_lead_status).
  • wp_terms, wp_term_taxonomy, wp_term_relationships — speichern die 15 Fahrzeug-Taxonomien, die durch AS24CI\Taxonomies registriert wurden.
  • wp_options — speichert alle Plugin-Einstellungen (Schlüssel definiert als Konstanten auf AS24CI\Options) sowie die Schema-Versionsmarker und die IDs der bei der Aktivierung erstellten Seiten.
  • wp_users und wp_usermeta — werden indirekt über WordPress-Capabilities verwendet; keine Plugin-spezifischen Schreibvorgänge.

Die vom Plugin erstellten benutzerdefinierten Rollen und Capabilities (as24ci_editor, das Capability-Set as24ci_car/as24ci_cars und manage_as24_imports) werden über die standardmässige WordPress-Rollenoption (wp_user_roles) gespeichert.

Deinstallationsverhalten

Das Skript uninstall.php führt immer DROP TABLE IF EXISTS für die fünf benutzerdefinierten Tabellen aus und entfernt die entsprechenden Schema-Versionsoptionen:

  • {$wpdb->prefix}as24_vehicles (und as24ci_vehicles_db_version)
  • {$wpdb->prefix}as24ci_analytics
  • {$wpdb->prefix}as24ci_search_agents (und as24ci_search_agent_db_version)
  • {$wpdb->prefix}as24ci_content_studio_assets
  • {$wpdb->prefix}as24ci_content_studio_jobs (und as24ci_content_studio_db_version)

Bei Multisite-Installationen wechselt das Skript zu jeder Website und wiederholt die Bereinigung. Posts, Anhänge und bei der Aktivierung erstellte Seiten werden nur entfernt, wenn der Administrator as24ci_delete_data_on_uninstall auf 1 gesetzt hat.

Betriebliche Hinweise

  • Schema-Upgrades sind idempotent. Jede Eigentümerklasse überprüft ihre Schema-Versionsoption und bricht vorzeitig ab, wenn die Tabelle bereits der erwarteten Version entspricht. Das Fahrzeug-Repository prüft zusätzlich, ob die Tabelle physisch existiert, bevor es vorzeitig abbricht.
  • Direkte wpdb-Abfragen gegen diese Tabellen existieren im Repository-, Analytics-, Suchagenten- und Deinstallations-Codepfad. Sie sind gegebenenfalls mit PHPCS-Ignore-Kommentaren geschützt. Benutzerdefinierter Code, der das Repository umgeht, sollte das Schema als Teil des internen Vertrags des Plugins betrachten und auf Spaltenänderungen zwischen den Releases vorbereitet sein.
  • Die Spalten raw_data, equipment_* und images enthalten serialisierte Daten. Behandeln Sie diese als opake Blobs und greifen Sie nach Möglichkeit über die Repository-Hilfsmethoden darauf zu.
  • Die Spalte manual_overrides ist die einzige Stelle, an der vom Administrator gesteuerte und vom Importer gesteuerte Zustände gemischt werden. Vermeiden Sie es, direkt in diese Spalte zu schreiben, ohne die Override-Ebene zu nutzen.

Fehlerbehebung

  • maybe_create_table() hat die Fahrzeugtabelle nicht erstellt. Stellen Sie sicher, dass dbDelta() keine Fehler gemeldet hat. Das Repository schreibt Fehler in error_log(), da es ausgeführt wird, bevor der Plugin-Logger verfügbar ist. Ein erneutes Ausführen der Aktivierung (deaktivieren, aktivieren) führt maybe_create_table() erneut aus.
  • Eine neue Spalte fehlt nach einem Plugin-Upgrade. Überprüfen Sie die Schema-Versionsoption für die betroffene Tabelle. Wenn sie dem aktuellen Wert entspricht, aber die Spalte fehlt, löschen Sie die Option, um zu erzwingen, dass dbDelta beim nächsten Laden der Admin-Seite erneut ausgeführt wird. Die Fahrzeugtabelle verfügt für diesen Fall über ein explizites manual_overrides-Sicherheitsnetz.
  • Die Analytics-Tabelle wächst schnell. Verringern Sie das Aufbewahrungsfenster oder deaktivieren Sie Analytics über Options::ANALYTICS_ENABLED. Der tägliche Bereinigungsjob ist erforderlich, um die Tabelle in Grenzen zu halten.
  • Suchagenten-Zeilen bleiben nach der Deinstallation bestehen. Überprüfen Sie, ob WordPress die Methode uninstall.php ausgeführt hat. Wenn nur deactivate() ausgeführt wurde (beispielsweise weil das Plugin deaktiviert, aber nicht gelöscht wurde), bleibt die Tabelle absichtlich bis zur Deinstallation erhalten.

Verwandte Dokumente