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:
Viele-zu-eins-Beziehungen: Beziehungen funktionieren wie Fremdschlüsseleinschränkungen.
Wenn Sie z. B. eine Beziehung als
orders (o_custkey) REFERENCES customers (c_custkey)definieren, erstellen Sie eine Viele-zu-eins-Beziehung vonorderszucustomers(viele Bestellungen können zu einem Kunden gehören), wobeic_custkeyein Primärschlüssel sein muss.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.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.
Einschränkungen für Eins-zu-eins-Beziehungen: Eins-zu-eins-Beziehungen haben Beschränkungen.
Nehmen Sie beispielsweise an, dass Sie eine Beziehung
orders(id) REFERENCES order_summarydefinieren, bei deridein Primärschlüssel ist oder eindeutige Werte inordershat.order_summarykann sich nicht auf semantische Ausdrücke inordersbeziehen,orderskann sich jedoch auf semantische Ausdrücke inorder_summarybeziehen.
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:
Grundlegende Aggregation: Eine Metrik muss eine Aggregatfunktion verwenden.
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.