Blog

Datenmodellierung in Looker: PDT vs. DBT

Anna Wnuczko

Aktualisiert Oktober 15, 2025
12 Minuten

Ein datengesteuerter Ansatz hilft Unternehmen dabei, Entscheidungen auf der Grundlage von Fakten und nicht von Wahrnehmungen zu treffen. Eines der wichtigsten Elemente, die diesen Ansatz unterstützen, ist ein genaues Datenmodell, das die Beziehungen zwischen verschiedenen Informationsquellen strukturiert darstellt. Die Berichterstattung auf der Grundlage eines präzisen Datenmodells kann Einblicke in den aktuellen Zustand eines Unternehmens, in Risiken und potenzielle Vorteile laufender und anstehender Initiativen liefern. Gute Datenmodelle sollten klar strukturiert sein, qualitativ hochwertige Daten liefern und dokumentiert sein, da die Datendefinitionen in einem Unternehmen möglicherweise nicht einheitlich sind.

Warum Looker?


Looker ist eine der Business Intelligence-Plattformen, die Unternehmen nutzen, um ihre Daten zu untersuchen und zu visualisieren. Sie verfügt über eine benutzerfreundliche Oberfläche, mit der Anwender individuelle Berichte und Dashboards erstellen können. Diese Business Intelligence-Plattform ermöglicht die Vereinheitlichung von Analysen über mehrere Datenquellen hinweg und hilft Unternehmen, datengesteuerte Organisationen zu werden.

PDTs - der traditionelle Ansatz für die Looker-Datenmodellierung


Eine der wichtigsten Funktionen von Looker ist eine SQL-basierte Modellierungssprache namens LookML. Sie ermöglicht es Ihnen, Daten zu transformieren, Beziehungen zwischen Entitäten zu definieren und Beschreibungen für ein gemeinsames Wörterbuch hinzuzufügen. Sie ermöglicht auch das Hinzufügen von Tests, um die Genauigkeit der Ergebnisse zu überprüfen. Looker ermöglicht die Speicherung der Ergebnisse einer SQL-Abfrage in einer Datenbanktabelle in einem Warehouse. Diese Funktion wird als persistente abgeleitete Tabelle (PDT) bezeichnet. Diese Art von abgeleiteter Tabelle kann dazu verwendet werden, die Leistung der Berichterstattung zu verbessern, da die Ergebnisse der Abfrage, die die PDT erstellt, in Ihrer Datenbank gespeichert werden. Die Tabelle wird nur bei Bedarf neu erstellt, z.B. wenn neue Datensätze in der Quelltabelle erstellt werden.

dbt - ein neues Konzept der Datenumwandlung für Looker


Neben PDT gibt es ein weiteres Tool zur Modellierung von Daten, das sich mit Looker abstimmen lässt - dbt. Mit diesem Framework können Sie Transformationen in SQL-Sprache erstellen, Tests hinzufügen und haben eine sehr benutzerfreundliche Dokumentation. Es ist nicht als Ersatz für LookML gedacht, kann aber in einigen Szenarien in Looker integriert werden. Ähnlich wie bei PDT von Looker können Sie transformierte Tabellen in Ihrer Datenbank speichern und festlegen, unter welchen Bedingungen die Ergebnisse aktualisiert werden sollen.

BigQuery - Data Warehouse für Looker


Es spielt keine Rolle, ob wir dbt oder PDT für einen beliebigen Modellierungsansatz verwenden. Looker benötigt das Data Warehouse als Speicher für die Daten. In diesem Artikel haben wir Google BigQuery verwendet. Es unterstützt beide PDTs und lässt sich problemlos in dbt integrieren. Das Warehouse unterstützt den Dialekt von SQL. Es ermöglicht dem Benutzer, Transformationsabfragen zu erstellen und zu testen, bevor sie in ein PDT- oder dbt-Modell eingefügt werden. Außerdem gibt es einen schnellen Einblick in die Abfrageleistung und die Anzahl der generierten Zeilen. Sobald die umgewandelte Tabelle in der Datenbank gespeichert ist, können Sie den Verlauf der Nutzung überprüfen.


Welches Tool ist besser und wann? Lassen Sie uns diese beiden Tools anhand realer Beispiele vergleichen, damit Sie verstehen, welcher Ansatz für bestimmte Szenarien besser geeignet ist.

Anwendungsfall: Datenmodellierung in PDT vs. dbt


In dieser Demonstration zeigen wir Ihnen, wie Sie Ihre Unternehmensdaten für zukünftige Analysen in Looker modellieren. Wir erstellen einen Bericht, der aus der Sicht der Benutzeroberfläche gleich aussieht, aber am Backend zeigen wir Ihnen zwei verschiedene Ansätze für die Datenmodellierung - mit PDT und dbt. Wir fügen auch einen Qualitätstest hinzu und zeigen die Möglichkeiten der Dokumentation. Wir hoffen, damit die Frage beantworten zu können, welcher Ansatz für bestimmte Szenarien besser geeignet ist.


In beiden Fällen ist die Datenquelle ein öffentlicher Datensatz namens "theLook eCommerce", der auf Google Marketplace verfügbar ist. Unser Ziel ist es, einen einfachen Zugang zu den monatlichen Einnahmen des Unternehmens im Jahr 2023 zu erhalten.

Ansatz 1 - Modellierung von Daten in der Looker PDT-Funktion


Zunächst möchten wir Ihnen den Datenfluss vorstellen. Der Datensatz ist in BigQuery gespeichert. Um den Umsatz zu berechnen, benötigen wir 3 Rohtabellen: `Aufträge`, `Auftragsartikel` und `Nutzer`. Die Tabellen werden in Looker mithilfe der PDT-Funktion umgewandelt und das Ergebnis wird in BigQuery als Tabelle gespeichert.


Der Datenfluss sieht wie folgt aus:
data-flow-looker-xebia
Alle Transformationen, Filter und Beziehungen werden im Looker-Code definiert. Unser Ziel ist es, ein PDT zu erstellen. Nachfolgend stellen wir Ihnen einen Codeschnipsel vor:

 view: fact_revenue_pdt {
  derived_table: {
    sql: WITH
        fact_revenue AS (
        SELECT
          o.created_at AS order_date,
          u.ID AS customer_id,
          SUM(oi.sale_price*o.num_of_item) AS revenue
        FROM
          `dbt-models.e_commerce.order_items` AS oi
        LEFT JOIN
          `dbt-models.e_commerce.orders` AS o
        ON
          oi.order_id = o.order_id
        LEFT JOIN
          `dbt-models.e_commerce.users` AS u
        ON
          oi.user_id = u.id
        WHERE
          EXTRACT(YEAR
          FROM
            o.created_at) >= 2023
          AND oi.status NOT IN ('Cancelled',
            'Returned')
        GROUP BY
          1,
          2 )
      SELECT
        GENERATE_UUID() AS primary_key,
        order_date,
        customer_id,
        SUM(revenue) AS revenue
      FROM
        fact_revenue
      GROUP BY
        1,
        2,
        3 ;;
    sql_trigger_value: SELECT MAX(created_at) FROM `dbt-models.e_commerce.order_items`;;


  }


  dimension: primary_key {
    description: "The primary key for this table"
    hidden: yes
    type: string
    sql: ${TABLE}.primary_key ;;
  }


  dimension_group: order {
    type: time
    timeframes: [date, month, year]
    sql: ${TABLE}.order_date ;;
  }


  dimension: customer_id {
    value_format_name: id
    type: number
    sql: ${TABLE}.customer_id ;;
  }


  dimension: revenue {
    hidden: yes
    type: number
    sql: ${TABLE}.revenue ;;
  }


  measure: total_revenue {
    description: "Revenue in USD"
    type: sum
    value_format: "$0.00"
    sql: ${revenue} ;; 
 }


  measure: count_customer_id {
    description: "Field added for testing purpose"
    hidden: yes
    type: count_distinct
    sql: ${TABLE}.customer_id ;;
    }
}


Im Code beziehen wir uns auf die ursprünglichen Namen des Datensatzes, der Tabellen und Spalten. Wir bereinigen und aggregieren die Daten und das Ergebnis dieser Abfrage-Neuerstellung wird im BigQuery Warehouse gespeichert. Jedes Mal (außer beim PDT-Neuaufbau), wenn jemand einen Bericht ausführt, der die auf dieser PDT-Abfrage basierende Erkundung verwendet, wird er mit den abgeleiteten Tabellenergebnissen und nicht mit den rohen Tabellen ausgeführt.


Im Looker-Modell wird sie als eigenständige Explore-Datei dargestellt. In diesem speziellen Fall ist es nicht erforderlich, die Rohtabellen separat als Ansichten darzustellen; alle Transformationen wurden in einer PDT-Ansichtsdatei vorgenommen. Nachfolgend finden Sie einen Codeschnipsel eines Modellobjekts.

connection: "dbt_annaw"


include: "/views/raw_sources/fact_revenue_pdt.view.lkml"
include: "/views/raw_sources/tests.lkml"


datagroup: ecommerce_etl {
  sql_trigger: SELECT max(created_at) FROM `dbt-models.e_commerce.order_items`;;
  max_cache_age: "24 hours"
}


explore: fact_revenue_pdt {
  label: "Fact Revenue"
}


Ein wichtiger Hinweis zum Hinzufügen von Primärschlüsseln in Ansichten: In Looker ist es entscheidend, dass die symmetrischen Aggregationen richtig berechnet werden. In unserem Fall haben wir keinen nativen Primärschlüssel, so dass es eine gute Praxis ist, einen zu erstellen, indem wir eine UUID in einer abgeleiteten Tabelle erzeugen oder mehrere Spalten aus Tabellen zusammenfassen. Mit Looker können wir einen Test für die Eindeutigkeit von Spalten hinzufügen. In unserem Fall sieht ein Codeschnipsel für die Kundentabelle wie folgt aus:

test: customer_id_is_unique {
  explore_source: fact_revenue_pdt {
    column: customer_id {}
    column: count_customer_id {}
    sorts: [count: desc]
    limit: 1
  }
  assert: customer_id_is_unique {
    expression: ${fact_revenue_pdt.count_customer_id} = 1 ;;
  }
}


Wie Sie sehen, ist das Schreiben von Tests in Looker für einfache Überprüfungen etwas kompliziert. Hier testen wir unsere Daten auch im BI-Tool, und wir glauben, dass es besser ist, dies im ersten Schritt zu tun.


Ein weiterer Aspekt bei der Erstellung eines guten Modells ist die Dokumentation. Mit LookML können Benutzer Beschreibungen hinzufügen, die für Geschäftsanwender sichtbar sind, und Kommentare im Code für Entwickler. Um jedoch einen vollständigen Überblick über Ihre PDT-Details zu erhalten, muss der Benutzer über Administratorrechte verfügen. Das Beispiel für unseren Fall sieht wie folgt aus:
Voller Ausblick-looker-xebia

Ansatz 2 - Modellierung von Daten in dbt


Bei dem Ansatz, bei dem dbt verwendet wird, wird der Datensatz in BigQuery gespeichert. Wir werden genau dieselben Tabellen verwenden, um Transformationen in der dbt-Modelldatei durchzuführen.
Der Datenfluss für dieses Szenario sieht wie folgt aus:
modellierung-daten-dbt-fluss-xebia
Um das dbt-Modell auszuführen, müssen wir zunächst die Konfiguration vornehmen. Sie finden den gesamten Weg Schritt für Schritt mit Befehlen in diesem Artikel: Aufstehen und loslegen: Datenpipeline mit BigQuery und dbt.


Alle Transformationen, Filter und Beziehungen werden in der dbt-Modellcodedatei namens `fact_revenue.sql` definiert. Die Abfrage sieht fast genauso aus wie bei der zuvor in PDT erstellten Transformation

config {
  materialized: 'table',  
  strategy: 'timestamp',
  updated_at: 'created_at'
}


WITH
  fact_revenue AS (
  SELECT
    o.created_at AS order_date,
    u.ID AS customer_id,
    SUM(oi.sale_price*o.num_of_item) AS revenue
  FROM
    `bigquery-public-data.thelook_ecommerce.order_items` AS oi
  LEFT JOIN
    `bigquery-public-data.thelook_ecommerce.orders` AS o
  ON
    oi.order_id = o.order_id
  LEFT JOIN
    `bigquery-public-data.thelook_ecommerce.users` AS u
  ON
    oi.user_id = u.id
  WHERE
oi.status NOT IN ('Cancelled',
      'Returned')
  GROUP BY
    1,
    2 )
SELECT
  GENERATE_UUID() AS primary_key,
  order_date,
  customer_id,
  SUM(revenue) AS revenue
FROM
  fact_revenue
GROUP BY
  1,
  2,
  3


Zusätzlich haben wir in dbt Feldbeschreibungen und Tests für die Eindeutigkeit des Primärschlüssels in der Datei shema.yml hinzugefügt. Der gesamte Code sieht wie folgt aus:

version: 2


models:


  - name: fact_revenue
    description: "Table contains revenue data"
    columns:
      - name: primary_key
        description: "The primary key for this table"
        tests:
          - unique
      - name: revenue
        description: "Revenue in USD"


Das Hinzufügen von Tests in dbt ist sehr einfach. Neben einfachen Tests können Sie auch die Möglichkeiten des Pakets `dbt-expectations` erweitern. Ein weiterer Vorteil der Verwendung von dbt und der Beschreibung von Spalten ist, dass Sie eine augenfreundliche Dokumentation mit Beziehungsdiagrammen, durchgeführten Tests, kompiliertem Code und vielem mehr erstellen können.


Die Beispieldokumentation für die Tabelle fact_revenue sieht so aus und ist auch für Benutzer mit anderen Rollen als der eines Entwicklers verfügbar.
dokumentation-fakten-einnahmen-xebia
Sie können neu erstellte Objekte schnell überprüfen und den Code, der Transformationen und angewandte Tests erstellt, kontrollieren.


Eine exponierte dbt-Tabelle als Ansicht in Looker sieht anders aus als PDT. Die Transformationsabfrage ist nicht sichtbar, da sie in der dbt-Abfrage definiert ist. Wir verweisen lediglich auf die neu erstellte Tabelle `fact_revenue`. Welche Quelltabellen, welche Filter angewendet wurden und wie der Umsatz berechnet wurde, ist nicht sichtbar. Das könnte den Prozess der Fehlersuche im Looker-Bericht als Code verlängern, da die Entwickler den Code mit einem separaten Tool überprüfen müssen. Unten finden Sie das gesamte View-Objekt:

view: fact_revenue {


  sql_table_name: `dbt-models.e_commerce.fact_revenue` ;;




  dimension: primary_key {
    primary_key: yes
    hidden: yes
    description: "The primary key for this table"
    type: string
    sql: ${TABLE}.primary_key ;;
  }


  dimension_group: order {
    type: time
    timeframes: [date, month, year]
    sql: ${TABLE}.order_date ;;
  }


  dimension: customer_id {
    value_format_name: id
    type: number
    sql: ${TABLE}.customer_id ;;
  }


  dimension: revenue {
    hidden: yes
    type: number
    sql: ${TABLE}.revenue ;;
  }


  measure: total_revenue {
    description: "Revenue in USD"
    type: sum
    value_format: "$0.00"
    sql: ${revenue} ;;  
  }


}


Diese Tabelle, die als Ansicht dargestellt wird, wird auch als eigenständige Erkundung in Looker dargestellt. Der Endbenutzer wird keinen Unterschied in der Benutzeroberfläche zwischen einer auf PDT basierenden Erkundung und einer dbt-Tabelle bemerken, welcher Ansatz ist also besser?

Ergebnisse


Wie bereits erwähnt, wird der Endbenutzer keine Unterschiede im generierten Bericht feststellen, selbst wenn wir 2 verschiedene Modellierungsansätze verwendet haben. Nachfolgend sehen Sie einen generierten Bericht.
report-xebia-modeling-approachespng
Die Codeausschnitte, die in der obigen Grafik generiert wurden, sehen ebenfalls sehr ähnlich aus - der Unterschied liegt im Namen der Quelle.

Looker PDT

SELECT
    (FORMAT_TIMESTAMP('%Y-%m', fact_revenue_pdt.order_date )) AS fact_revenue_pdt_order_month,
    COALESCE(SUM(fact_revenue_pdt.revenue ), 0) AS fact_revenue_pdt_total_revenue
FROM `dbt-models.looker_scratch.LR_65NLV1704627695961_fact_revenue_pdt` AS fact_revenue_pdt
WHERE ((( fact_revenue_pdt.order_date  ) >= ((TIMESTAMP('2023-01-01 00:00:00'))) AND ( fact_revenue_pdt.order_date  ) < ((TIMESTAMP(DATETIME_ADD(DATETIME(TIMESTAMP('2023-01-01 00:00:00')), INTERVAL 1 YEAR))))))
GROUP BY
    1
ORDER BY
    1 DESC

dbt

SELECT
    (FORMAT_TIMESTAMP('%Y-%m', fact_revenue.order_date )) AS fact_revenue_order_month,
    COALESCE(SUM(fact_revenue.revenue ), 0) AS fact_revenue_total_revenue
FROM `dbt-models.e_commerce.fact_revenue`  AS fact_revenue
WHERE ((( fact_revenue.order_date  ) >= ((TIMESTAMP('2023-01-01 00:00:00'))) AND ( fact_revenue.order_date  ) < ((TIMESTAMP(DATETIME_ADD(DATETIME(TIMESTAMP('2023-01-01 00:00:00')), INTERVAL 1 YEAR))))))
GROUP BY
    1
ORDER BY
    1 DESC


Schlussfolgerung: Wann lohnt es sich, dbt anstelle von PDT zu verwenden?


Unter Berücksichtigung der oben dargestellten Unterschiede wollen wir uns auf einige Aspekte konzentrieren, um beide Methoden zu vergleichen.


Wie klar ist die Struktur des Modellcodes?


Wie in beiden Fällen oben dargestellt, haben wir die gleiche Logik und SQL-Abfrage verwendet, um eine Faktentabelle zu erstellen. Bei PDT befindet sich jedoch der gesamte Code mit den Bedingungen an einer Stelle im Looker-Repository, während der Entwickler für die dbt-Tabelle beide Quellen zum Debuggen oder Refactoring verwenden müsste. Da es sich bei PDT um eine systemeigene Funktion handelt, ist es vielleicht praktischer, die Datenquellen zu überprüfen.


Kosten für zusätzliches Werkzeug


Es könnte ein Szenario geben, in dem ein Unternehmen auch andere Analysetools verwendet. In diesem Fall ermöglicht es dbt dem Benutzer, Modelle zu erstellen, die als Datenquellen wiederverwendet werden können. Für unsere Demo haben wir eine Umsatzfaktentabelle erstellt, die von mehreren Teams in einem Unternehmen als KPI verwendet werden kann. Daher wird die Durchführung von Transformationen in dbt bequemer sein.


Wechsel zu einer anderen BI-Plattform


Es ist auch möglich, dass ein Unternehmen eines Tages beschließt, ein BI-Tool zu ändern und den Code für das Modell neu zu schreiben. Es wird praktischer sein, den Code von dbt wiederzuverwenden als Looker und seine Syntax. Außerdem glauben wir, dass dbt einfach zu erlernen und in der Produktion zu implementieren ist. Es ist auch einfach, die Analysten zu schulen, die die dbt-Modelle pflegen, was bedeutet, dass es eine gute Investition sein könnte.


Genauigkeit des Datenmodells


Für beide Ansätze können wir Tests implementieren, um die Ergebnisse zu validieren. Allerdings ist das Hinzufügen von Tests in dbt bei der Entwicklung viel einfacher. Für die meisten Fälle können wir sie in der Konfiguration mit 2 Zeilen wiederverwendbarem Code definieren. Außerdem ist es wichtig, Fehler so früh wie möglich zu erkennen. Der Flow mit dbt erlaubt es dem Benutzer, dies zu tun, bevor die Daten in Looker landen.


Muster der Dokumentation


Beide Methoden erlauben das Hinzufügen von Kommentaren zu exponierten Metriken. Wir sind jedoch der Meinung, dass dbt eine benutzerfreundlichere Dokumentation der transformierten Tabellen liefert. Es ist auch auf den ersten Blick ersichtlich, welche Tests implementiert wurden und wie die Definitionen der Spalten lauten. dbt ist außerdem ein offenes Framework und es besteht weniger Gefahr, dass die Organisation den Zugang zur Dokumentation des Modells verliert, wenn Looker durch eine andere Plattform ersetzt wird.


Wenn wir das berücksichtigen, können wir auch sehen, dass das Wechseln zwischen 2 Dokumentationsquellen nicht sehr praktisch und gut entschlüsselt sein könnte. In den meisten Fällen dürften Looker-Felder ausreichen.


Die Flexibilität bei der Erzeugung von Aggregaten


Alle Aggregate müssen in Looker definiert werden. Wir können dies nicht auf DBT übertragen, da alle voraggregierten Daten bei diesem Ansatz zu Dimensionen werden.


Für den einfachen Fall, den wir in diesem Artikel vorgestellt haben, tendieren wir zu einer Kombination aus dbt und Looker, da wir mehr Möglichkeiten haben, Daten während der Entwicklung zu validieren und zu dokumentieren. Es ist auch eine sichere Option, um wiederverwendbaren Code zu haben, falls Sie zu einem anderen Berichtssystem als Looker wechseln müssen.


Zusammenfassend lässt sich sagen, dass wir empfehlen, beides zu verwenden. Wenn etwas in DBT modelliert werden kann, ist es von Vorteil, solche Tabellen außerhalb von Looker zu verwenden. Es gibt jedoch einige Anwendungsfälle, wie z.B. parametrisierte und flüssige Abfragen, die in LookML modelliert werden müssen.


Haben Sie noch Fragen? Kontaktieren Sie uns einfach.

Verfasst von

Anna Wnuczko

Contact

Let’s discuss how we can support your journey.