Comment Snowflake valide les vues sémantiques¶
Snowflake vérifie qu’il respecte un ensemble de règles de validation lorsque vous définissez une vue sémantique. Ces règles garantissent que votre modèle sémantique est bien formé et qu’il fonctionnera correctement.
Ces règles sont expliquées dans les sections suivantes :
Règles de validation générales¶
Les règles suivantes s’appliquent aux vues sémantiques en général :
Éléments requis : une vue sémantique doit définir au moins une dimension ou une métrique.
Par exemple, votre vue sémantique TPC-H a besoin d’au moins une dimension (comme
customer_name) ou d’une métrique (commeorder_average_value).Clés primaires et étrangères : dans les définitions des clés primaires et étrangères, vous devez utiliser des colonnes physiques de la table de base ou des expressions définies dans les tables logiques qui font directement référence à une colonne de la table de base (par exemple,
t1.fact AS t1.col).Par exemple, dans le schéma TPC-H, vous pouvez utiliser
c_custkeycomme clé primaire de la tablecustomereto_custkeycomme clé étrangère de la tableorders.c_custkeyeto_custkeysont des colonnes des tables de base physiques.Références aux alias de tables : lorsque vous faites référence à des tables dans des relations ou des expressions, vous devez utiliser les alias qui ont été définis pour elles.
Par exemple, si vous définissez l’alias de table
orders AS snowflake_sample_data.tpch.orders_table, vous devez utiliser l’alias de tableorders(et nonorders_table) dans la définition de vos métriques.Si vous ne spécifiez pas d’alias pour une table logique, vous devez utiliser le nom de la table logique dans toutes les expressions.
Règles de validation des relations¶
Les règles suivantes s’appliquent aux relations définies dans les vues sémantiques :
Many-to-one relationships and one-to-one relationships: Relationships work like foreign key constraints.
Supposons que la table logique
table_1identifiecol_1en tant que clé principale :TABLES ( table_1 AS my_table_1 PRIMARY KEY (col_1) ...
Lorsque vous définissez une relation comme
table_2 (col_2) REFERENCES table_1 (col_1),col_1doit être une clé principale, etcol_2doit servir de clé étrangère :Si plusieurs lignes dans
table_2utiliser la même valeur danscol_2, vous créez une relation plusieurs-à-un à partir detable_2danstable_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).Si chaque ligne de
table_2a une valeur unique danscol_2, vous créez une relation « un à un » detable_2àtable_1.Par exemple,
customer_details_extended (e_custkey) REFERENCES customer_details (c_custkey)crée une relation un à un decustomer_details_extendedàcustomer_details(une ligne de détails étendus pour un client appartient à une ligne de détails de client avec la cléc_custkey).
Validations performed on one-to-one relationships:
Row-level expressions can refer to other row-level expressions at the same (or lower) granularity.
Par exemple,
customer_detailsetcustomer_details_extendedont une relation « un à un », où une ligne decustomer_detailsest liée à une ligne danscustomer_details_extended. Une expression au niveau des lignes dans chacune de ces tables fait référence à un client spécifique. Chacune peut faire référence directement aux autres dans les expressions au niveau des lignes, car les expressions au niveau des lignes ont la même granularité.En tant que corollaire, une expression de niveau ligne sur
customer_detailsne peut pas référencer une métrique ou une agrégation d’une expression de niveau ligne surcustomer_details_extended(et vice versa).Les expressions de niveau agrégé doivent faire référence à des expressions au niveau des lignes de la même granularité en utilisant un seul agrégat.
Par exemple, les expressions de niveau agrégé sur
customer_detailsoucustomer_details_extendeddoivent utiliser un seul agrégat lors de la référence à l’autre entité. En outre, les métriques surcustomer_detailsetcustomer_details_extendeddoivent se référer directement à d’autres métriques sur les deux entités, sans aucune agrégation.
Ces règles s’appliquent que la relation entre les entités soit définie comme
customer_details REFERENCES customer_details_extendedoucustomer_details_extended REFERENCES customer_details.Relations transitives : Snowflake déduit automatiquement les relations indirectes.
Par exemple, si vous définissez une relation entre
line_itemsetorderset une autre relation entreordersetcustomer, Snowflake comprend qu’il existe également une relation entreline_itemsetcustomer.Notez que les relations un à un respectent la transitivité lorsqu’elles interagissent avec d’autres relations un à un et plusieurs à un :
Si les tables logiques
customersetcustomer_detailsont une relation un à un et des tables logiquescustomer_detailsetcustomer_details_extendedont une relation un à un, les tables logiquescustomersetcustomer_details_extendedsont automatiquement déduites comme ayant une relation « un à un » et sont traitées comme telles lors de la validation.Si les tables logiques
customersetcustomer_detailsont une relation un à un et les tables logiquescustomer_detailsetregionsont une relation plusieurs-à-un, on suppose quecustomerspasse de plusieurs-à-un àregions, ce qui donne auxcustomersune granularité supérieure auxregionslors de la validation de l’expression.
Pas de relations circulaires : vous ne pouvez pas définir de relations circulaires, même par le biais de chemins transitifs.
Par exemple, vous ne pouvez pas définir une relation de
ordersàcustomeret une autre relation decustomeràorders.Pas d’autoréférences : actuellement, une table ne peut pas faire référence à elle-même (comme dans une hiérarchie de responsables d’employés où les employés peuvent faire référence à d’autres employés en tant que responsables).
Restrictions relatives aux relations multichemins : vous pouvez définir des relations multiples entre deux tables, mais certaines limitations s’appliquent.
Par exemple, si
line_itemsest liée àorderspar l’intermédiaire deorder_keyet d’une autre colonne, ces tables ne peuvent pas faire référence aux expressions sémantiques l’une de l’autre.Note
S’il existe plusieurs chemins qui peuvent être utilisés pour joindre deux tables, vous devez définir des tables logiques et des relations distinctes pour chaque chemin. Pour plus d’informations, voir Définition de différentes tables logiques pour différents chemins qui joint deux tables.
Règles de validation des expressions¶
Les règles suivantes s’appliquent aux expressions sémantiques utilisées dans les faits, les dimensions et les métriques :
Règles générales concernant les expressions¶
Les règles suivantes s’appliquent aux expressions sémantiques en général :
Types d’expression : les dimensions et les faits sont des expressions de niveau ligne (non agrégées), tandis que les métriques sont des expressions de niveau agrégat.
Par exemple,
customer_nameest une dimension (de niveau ligne), tandis queorder_average_valueest une métrique (de niveau agrégat).Association à une table : chaque expression sémantique doit être associée à une table.
Par exemple,
customer_namedoit être défini commecustomer.customer_nameetorder_average_valuecommeorders.order_average_value.Références à la même table : les expressions peuvent faire référence aux colonnes de la table de base ou à d’autres expressions de la même table logique en utilisant des noms qualifiés ou non.
Par exemple, dans la table
orders, vous pouvez définirorders.shipping_monthcomme suit :MONTH(o_shipdate)(en utilisant le nom de colonne non qualifié)MONTH(orders.o_shipdate)(en utilisant le nom qualifié)
Limitations relatives aux tables croisées : les expressions ne peuvent pas faire référence aux colonnes de la table de base d’autres tables ou à des expressions de tables logiques non liées.
Par exemple,
customer.customer_namene peut pas faire directement référence à une expression de la tableorders, sauf s’il existe une relation entre elles. Pour travailler avec des données à l’échelle de plusieurs tables, vous devez :Définir les relations entre les tables logiques (par exemple, entre
customeretorderspar l’intermédiaire dec_custkey).Définir un fait sur la table source (par exemple,
orders.total_value).Faire référence à ces expressions à partir d’une table logique connectée (par exemple,
customer.order_valuepeut faire référence àorders.total_value).
Résolution des noms : si une expression sémantique et une colonne portent le même nom, les références à ce nom sont résolues en fonction de l’expression sémantique.
Par exemple, si vous définissez une dimension
regionet qu’il existe également une colonneregion,regiondans les expressions renvoie à la dimension, et non à la colonne. Une exception est faite lorsqu’une expression fait référence au même nom dans sa définition (par exemple,customer.c_name AS customers.c_name). La référence renvoie à la colonne, plutôt qu’à l’expression de définition elle-même.Cycles de référence d’expressions : vous ne pouvez pas créer de références circulaires entre les expressions.
Par exemple, vous ne pouvez pas définir
customer.total_valuepar rapport àorders.customer_valuepuis définirorders.customer_valuepar rapport àcustomer.total_value.Cycles de référence de tables : vous ne pouvez pas créer de références circulaires entre les tables logiques dans les définitions d’expressions.
Par exemple, vous ne pouvez pas définir
customer.total_valuepar rapport àorders.customer_valuepuis définirorders.customer_countpar rapport àcustomer.c_custkey.Utilisation de la fonction : vous pouvez utiliser des fonctions scalaires comme YEAR* / DAY* / WEEK* / MONTH / QUARTER dans les dimensions, mais les fonctions de table ne sont pas autorisées.
Règles pour les expressions de niveau ligne (dimensions et faits)¶
Les règles suivantes s’appliquent aux expressions de niveau ligne dans les dimensions et les faits :
Références à la même table : une expression de niveau ligne peut faire directement référence aux colonnes de sa propre table.
Par exemple,
customers.customer_namepeut être défini directement commecustomers.c_name.Granularité égale ou inférieure : une expression de niveau ligne peut faire directement référence à d’autres expressions de niveau ligne de granularité égale ou inférieure.
Par exemple,
orders.order_detailspeut faire référence àcustomer.customer_nameparce quecustomerse situe à un niveau de granularité inférieur àorders(un client peut avoir plusieurs commandes).Références à une granularité supérieure : lors du référencement d’expressions de niveau ligne à une granularité supérieure, une expression de niveau ligne doit utiliser l’agrégation.
Par exemple,
customer.total_ordersdoit utiliserCOUNT(orders.o_orderkey)parce queordersa une granularité plus élevée quecustomer(un client peut avoir plusieurs commandes).Références agrégées : une dimension telle que
orders.order_typene peut pas faire référence à une métrique telle queorders.order_average_value, maiscustomer.customer_segmentpeut faire référence àorders.order_average_valueparce quecustomerse situe à un niveau de granularité inférieur à celui des commandes.
Règles pour les expressions de niveau agrégat (métriques)¶
Les règles suivantes s’appliquent aux expressions de niveau agrégat dans les métriques :
Basic aggregation: A metric that is not a derived metric must use an aggregate function.
Par exemple,
orders.order_average_valuedoit utiliserAVG(orders.o_totalprice).Granularité égale ou inférieure : lorsqu’elle fait référence à des expressions de niveau ligne à une granularité égale ou inférieure, une métrique doit utiliser un seul agrégat.
Par exemple,
orders.total_valuepeut utiliserSUM(line_items.discounted_price)parce queline_itemsa une granularité inférieure à celle des commandes.Références à une granularité supérieure : lorsqu’elle fait référence à des expressions de niveau ligne à une granularité supérieure, une métrique doit utiliser l’agrégation imbriquée.
Par exemple,
customer.average_order_valuedoit utiliserAVG(SUM(orders.o_totalprice))parce queordersest à une granularité plus élevée quecustomer.Autres références agrégées : une métrique peut faire directement référence à d’autres métriques de granularité égale ou inférieure sans agrégation.
Par exemple,
orders.profit_marginpeut être défini commeorders.total_revenue / orders.total_costsans agrégation supplémentaire. Cependant, lorsqu’on se réfère à des métriques à une granularité plus élevée, une agrégation est nécessaire.
Règles pour les métriques de la fonction de fenêtre¶
Ces règles s’appliquent aux métriques de la fonction de fenêtre :
Les métriques de fonction de fenêtre ne peuvent pas être utilisées par des calculs au niveau des lignes (faits et dimensions).
Les métriques de fonction de fenêtre ne peuvent pas être utilisées dans les définitions d’autres métriques.