Wie Snowflake semantische Ansichten validiert¶
Wenn Sie eine semantische Ansicht definieren, prüft Snowflake, ob sie einer Reihe von Validierungsregeln entspricht. Diese Regeln stellen sicher, dass Ihr semantisches Modell wohlgeformt ist und korrekt funktioniert.
Diese Regeln werden in den nächsten Abschnitten erläutert:
Allgemeine Validierungsregeln¶
Die folgenden Regeln gelten für semantische Ansichten im Allgemeinen:
Erforderliche Elemente: Eine semantische Ansicht muss mindestens eine Dimension oder Metrik definieren.
Zum Beispiel benötigt Ihre semantische Ansicht TPC-H mindestens eine Dimension (wie
customer_name) oder eine Metrik (wieorder_average_value).Primär- und Fremdschlüssel: In den Primär- und Fremdschlüsseldefinitionen müssen Sie physische Basistabellenspalten oder in logischen Tabellen definierte Ausdrücke verwenden, die sich direkt auf eine Basistabellenspalte beziehen (z. B.
t1.fact AS t1.col).Im Schema TPC-H können Sie zum Beispiel
c_custkeyals Primärschlüssel für die Tabellecustomerundo_custkeyals Fremdschlüssel in der Tabelleordersverwenden.c_custkeyundo_custkeysind Spalten in den physischen Basistabellen.Tabellenalias-Referenzen: Wenn Sie in Beziehungen oder Ausdrücken auf Tabellen verweisen, müssen Sie deren definierte Aliasnamen verwenden.
Wenn Sie zum Beispiel den Tabellenalias
orders AS snowflake_sample_data.tpch.orders_tabledefinieren, müssen Sie den Tabellenaliasorders(nichtorders_table) in den Definitionen Ihrer Metriken verwenden.Wenn Sie keinen Alias für eine logische Tabelle angeben, müssen Sie den Namen der logischen Tabelle in allen Ausdrücken verwenden.
Validierungsregeln für Beziehungen¶
Die folgenden Regeln gelten für Beziehungen in semantischen Ansichten:
Many-to-one relationships and one-to-one relationships: Relationships work like foreign key constraints.
Angenommen, die logische Tabelle
table_1identifiziertcol_1als Primärschlüssel:TABLES ( table_1 AS my_table_1 PRIMARY KEY (col_1) ...
Wenn Sie eine Beziehung als
table_2 (col_2) REFERENCES table_1 (col_1)definieren, musscol_1ein Primärschlüssel sein undcol_2als Fremdschlüssel dienen:Wenn mehrere Zeilen in
table_2denselben Wert incol_2aufweisen, erstellen Sie eine n:1-Beziehung zwischentable_2undtable_1.For example,
orders (o_custkey) REFERENCES customers (c_custkey)creates a many-to-one relationship fromorderstocustomers(many orders can belong to one customer with the keyc_custkey).Wenn jede Zeile in
table_2einen eindeutigen Wert incol_2hat, erstellen Sie eine 1:1-Beziehung zwischentable_2undtable_1.Beispiel:
customer_details_extended (e_custkey) REFERENCES customer_details (c_custkey)erstellt eine 1:1-Beziehung zwischencustomer_details_extendedundcustomer_details(eine Zeile mit ausführlichen Details zu einem Kunden gehört zu einer Zeile mit Kundendetails mit dem Schlüsselc_custkey).
Validations performed on one-to-one relationships:
Row-level expressions can refer to other row-level expressions at the same (or lower) granularity.
Beispiel:
customer_detailsundcustomer_details_extendedhaben eine 1:1-Beziehung, wobei sich eine Zeile incustomer_detailsauf eine Zeile incustomer_details_extendedbezieht. Ein Ausdruck auf Zeilenebene in jeder dieser Tabellen bezieht sich auf einen bestimmten Kunden. Jede kann sich in Ausdrücken auf Zeilenebene direkt auf den anderen beziehen, da die Ausdrücke auf Zeilenebene die gleiche Granularität aufweisen.Entsprechend kann sich ein Ausdruck auf Zeilenebene zu
customer_detailsnicht auf eine Kennzahl oder Aggregation eines Ausdrucks auf Zeilenebene zucustomer_details_extendedbeziehen (und umgekehrt).Ausdrücke auf Aggregatebene - müssen sich auf Ausdrücke auf Zeilenebene mit derselben Granularität (bei einem einzigen Aggregat) beziehen.
Zum Beispiel müssen Ausdrücke auf Aggregatebene zu
customer_detailsodercustomer_details_extendedein einziges Aggregat verwenden, wenn sie auf die andere Entität verweisen. Darüber hinaus sollten sich Kennzahlen fürcustomer_detailsundcustomer_details_extendeddirekt auf andere Kennzahlen zu den beiden Entitäten beziehen, ohne eine Aggregation.
Diese Regeln gelten unabhängig davon, ob die Beziehung zwischen den Entitäten als
customer_details REFERENCES customer_details_extendedodercustomer_details_extended REFERENCES customer_detailsdefiniert ist.Transitive Beziehungen: Snowflake leitet automatisch indirekte Beziehungen ab.
Wenn Sie zum Beispiel eine Beziehung zwischen
line_itemsundordersund eine weitere Beziehung zwischenordersundcustomerdefinieren, versteht Snowflake, dass es auch eine Beziehung zwischenline_itemsundcustomergibt.Beachten Sie, dass 1:1-Beziehungen die Transitivität respektieren, wenn Sie mit anderen 1:1- und n:1-Beziehungen interagieren:
Wenn die logischen Tabellen
customersundcustomer_detailseine 1:1-Beziehung und die logischen Tabellencustomer_detailsundcustomer_details_extendedeine 1:1-Beziehung haben, wird für die logischen Tabellencustomersundcustomer_details_extendedautomatisch eine 1:1-Beziehung abgeleitet, und sie werden bei der Validierung auch so behandelt.Wenn die logischen Tabellen
customersundcustomer_detailseine 1:1-Beziehung und die logische Tabellencustomer_detailsundregionseine n:1-Beziehung aufweisen, leitet sich daraus ab, dasscustomerseine transitiv n:1-Beziehung zuregionsaufweist, wodurchcustomersbei der Validierung von Ausdrücken eine höhere Granularität alsregionserhält.
Keine zirkulären Beziehungen: Sie können keine zirkulären Beziehungen definieren, auch nicht durch transitive Pfade.
Sie können zum Beispiel nicht eine Beziehung von
orderszucustomerund eine andere Beziehung voncustomerzuordersdefinieren.Keine Selbstreferenzen: Derzeit kann eine Tabelle nicht auf sich selbst verweisen (wie bei einer Hierarchie von Angestellten und Managern, bei der Angestellte auf andere Angestellte als ihren Manager verweisen können).
Einschränkungen für Mehrweg-Beziehungen: Sie können mehrere Beziehungen zwischen zwei Tabellen definieren, aber es gibt Beschränkungen.
Wenn zum Beispiel
line_itemssowohl überorder_keyals auch über eine andere Spalte mitordersverbunden ist, können diese Tabellen nicht auf die semantischen Ausdrücke der jeweils anderen Tabelle verweisen.Bemerkung
Wenn es mehrere Pfade gibt, die zum Verknüpfen von zwei Tabellen verwendet werden können, sollten Sie für jeden Pfad eigene logische Tabellen und Beziehungen definieren. Weitere Informationen dazu finden Sie unter Definieren verschiedener logischer Tabellen für verschiedene Pfade, die zwei Tabellen verbinden.
Ausdrucks-Validierungsregeln¶
Die folgenden Regeln gelten für semantische Ausdrücke in Fakten, Dimensionen und Metriken:
Allgemeine Regeln für Ausdrücke¶
Die folgenden Regeln gelten für semantische Ausdrücke im Allgemeinen:
Ausdrucksarten: Dimensionen und Fakten sind Ausdrücke auf Zeilenebene (unaggregiert), während Metriken Ausdrücke auf Aggregatebene sind.
Zum Beispiel ist
customer_nameeine Dimension (Zeilenebene), währendorder_average_valueeine Metrik (Aggregatebene) ist.Tabellenzuordnung: Jeder semantische Ausdruck muss mit einer Tabelle verknüpft sein.
Zum Beispiel muss
customer_namealscustomer.customer_nameundorder_average_valuealsorders.order_average_valuedefiniert werden.Referenzen auf dieselbe Tabelle: Ausdrücke können sich auf Spalten der Basistabelle oder andere Ausdrücke derselben logischen Tabelle beziehen, indem sie entweder qualifizierte oder unqualifizierte Namen verwenden.
In der Tabelle
orderskönnten Sie zum Beispielorders.shipping_monthdefinieren alsMONTH(o_shipdate)(unter Verwendung des unqualifizierten Spaltennamens)MONTH(orders.o_shipdate)(unter Verwendung des qualifizierten Namens)
Tabellenübergreifende Beschränkungen: Ausdrücke können sich nicht auf Basistabellenspalten aus anderen Tabellen oder Ausdrücke aus nicht verwandten logischen Tabellen beziehen.
Zum Beispiel kann
customer.customer_namenicht direkt auf einen Ausdruck aus der Tabelleordersverweisen, es sei denn, es besteht eine Beziehung zwischen ihnen. Um mit tabellenübergreifenden Daten zu arbeiten, müssen Sie:Beziehungen zwischen logischen Tabellen definieren (z. B. zwischen
customerundordersbisc_custkey).Einen Fakt in der Quelltabelle definieren (z. B.
orders.total_value).Sich auf diese Ausdrücke aus einer zusammenhängenden logischen Tabelle beziehen (zum Beispiel kann sich
customer.order_valueauforders.total_valuebeziehen).
Namensauflösung: Wenn sowohl ein semantischer Ausdruck als auch eine Spalte denselben Namen haben, werden Referenzen auf diesen Namen in den semantischen Ausdruck aufgelöst.
Wenn Sie zum Beispiel eine Dimension
regiondefinieren und es auch eine Spalteregiongibt, wirdregionin Ausdrücken auf die Dimension aufgelöst, nicht auf die Spalte. Eine Ausnahme ist, wenn ein Ausdruck in seiner Definition auf denselben Namen verweist (zum Beispielcustomer.c_name AS customers.c_name). Der Verweis wird auf die Spalte aufgelöst und nicht auf den definierenden Ausdruck selbst.Ausdrucksreferenzzyklen: Sie können keine zirkulären Referenzen zwischen Ausdrücken erstellen.
Sie können zum Beispiel nicht
customer.total_valueauf der Grundlage vonorders.customer_valueund dannorders.customer_valueauf der Grundlage voncustomer.total_valuedefinieren.Tabellenreferenz-Zyklen: Sie können keine zirkulären Referenzen zwischen logischen Tabellen in Ausdrucksdefinitionen erstellen.
Sie können zum Beispiel nicht
customer.total_valueauf der Grundlage vonorders.customer_valuedefinieren und dannorders.customer_countauf der Grundlage voncustomer.c_custkey.Funktionsnutzung: Sie können skalare Funktionen wie YEAR* / DAY* / WEEK* / MONTH / QUARTER in Dimensionen verwenden, aber Tabellenfunktionen sind nicht erlaubt.
Regeln für Ausdrücke auf Zeilenebene (Dimensionen und Fakten)¶
Die folgenden Regeln gelten für Ausdrücke auf Zeilenebene in Dimensionen und Fakten:
Referenzen auf dieselbe Tabelle: Ein Ausdruck auf Zeilenebene kann direkt auf Spalten aus seiner eigenen Tabelle verweisen.
Zum Beispiel kann
customers.customer_namedirekt alscustomers.c_namedefiniert werden.Gleiche oder niedrigere Granularität: Ein Ausdruck auf Zeilenebene kann direkt auf andere Ausdrücke auf Zeilenebene mit der gleichen oder einer niedrigeren Granularität verweisen.
Zum Beispiel kann
orders.order_detailsaufcustomer.customer_nameverweisen, weilcustomereine geringere Granularität hat alsorders(ein Kunde kann viele Bestellungen haben).Referenzen mit höherer Granularität: Wenn Sie Ausdrücke auf Zeilenebene mit höherer Granularität referenzieren, muss ein Ausdruck auf Zeilenebene eine Aggregation verwenden.
Zum Beispiel muss
customer.total_ordersCOUNT(orders.o_orderkey)verwenden, weilorderseine höhere Granularität hat alscustomer(ein Kunde kann viele Bestellungen haben).Aggregierte Referenzen: Eine Dimension wie
orders.order_typekann sich nicht auf eine Metrik wieorders.order_average_valuebeziehen, abercustomer.customer_segmentkann sich auforders.order_average_valuebeziehen, dacustomereine niedrigere Granularität als Ordnungen hat.
Regeln für Ausdrücke auf Aggregatebene (Metriken)¶
Die folgenden Regeln gelten für Ausdrücke auf Aggregatebene in Metriken:
Basic aggregation: A metric that is not a derived metric must use an aggregate function.
Zum Beispiel muss
orders.order_average_valueAVG(orders.o_totalprice)verwenden.Gleiche oder niedrigere Granularität: Wenn Sie sich auf Ausdrücke auf Zeilenebene mit gleicher oder niedrigerer Granularität beziehen, muss eine Metrik ein einzelnes Aggregat verwenden.
Zum Beispiel kann
orders.total_valueSUM(line_items.discounted_price)verwenden, weilline_itemseine geringere Granularität als Aufträge hat.Referenzen mit höherer Granularität: Wenn Sie sich auf Ausdrücke auf Zeilenebene mit höherer Granularität beziehen, muss eine Metrik eine verschachtelte Aggregation verwenden.
Zum Beispiel muss
customer.average_order_valueAVG(SUM(orders.o_totalprice))verwenden, weilorderseine höhere Granularität hat alscustomer.Andere aggregierte Referenzen: Eine Metrik kann ohne Aggregation direkt auf andere Metriken mit gleicher oder niedrigerer Granularität verweisen.
Zum Beispiel kann
orders.profit_marginalsorders.total_revenue / orders.total_costohne zusätzliche Aggregation definiert werden. Wenn Sie sich jedoch auf Metriken mit höherer Granularität beziehen, ist eine Aggregation erforderlich.
Regeln für Metriken der Fensterfunktion¶
Diese Regeln gelten für Metriken der Fensterfunktion:
Metriken der Fensterfunktion können nicht für Berechnungen auf Zeilenebene (Fakten und Dimensionen) verwendet werden.
Metriken der Fensterfunktion können nicht in den Definitionen anderer Metriken verwendet werden.