Como o Snowflake valida as exibições semânticas¶
O Snowflake verifica a conformidade com um conjunto de regras de validação quando você define uma exibição semântica. Essas regras garantem que seu modelo semântico seja bem formado e funcione corretamente.
Essas regras são explicadas nas próximas seções:
Regras gerais de validação¶
As regras a seguir se aplicam às exibições semânticas em geral:
Elementos obrigatórios: uma exibição semântica deve definir pelo menos uma dimensão ou métrica.
Por exemplo, sua exibição semântica TPC-H precisa de pelo menos uma dimensão (como
customer_name) ou uma métrica (comoorder_average_value).Chaves primárias e estrangeiras: nas definições de chave primária e estrangeira, você deve usar colunas físicas da tabela base ou expressões definidas em tabelas lógicas que se referem diretamente a uma coluna da tabela base (por exemplo,
t1.fact AS t1.col).Por exemplo, no esquema TPC-H, você pode usar
c_custkeycomo chave primária para a tabelacustomereo_custkeycomo chave estrangeira na tabelaorders.c_custkeyeo_custkeysão colunas nas tabelas base físicas.Referências de alias de tabela: ao se referir a tabelas em relações ou expressões, você deve usar os aliases definidos.
Por exemplo, se você definir o alias de tabela
orders AS snowflake_sample_data.tpch.orders_table, deverá usar o alias de tabelaorders(e nãoorders_table) nas definições de suas métricas.Se você não especificar um alias para uma tabela lógica, deverá usar o nome da tabela lógica em todas as expressões.
Regras de validação para relações¶
As regras a seguir se aplicam a relações em exibições semânticas:
Relações de muitos para um: os relacionamentos funcionam como restrições de chave estrangeira.
Por exemplo, quando você define uma relação como
orders (o_custkey) REFERENCES customers (c_custkey), está criando uma relação de muitos para um deordersparacustomers(muitos pedidos podem pertencer a um cliente), em quec_custkeydeve ser uma chave primária.Relações transitivas: o Snowflake deriva automaticamente as relações indiretas.
Por exemplo, se você definir uma relação entre
line_itemseorderse outra relação entreordersecustomer, o Snowflake entenderá que há também uma relação entreline_itemsecustomer.Nenhuma relação circular: você não pode definir relações circulares, mesmo por meio de caminhos transitivos.
Por exemplo, você não pode definir uma relação de
ordersparacustomere outra relação decustomerparaorders.Nenhuma autorreferência: atualmente, uma tabela não pode fazer referência a si mesma (como uma hierarquia de gerentes de funcionários em que os funcionários podem fazer referência a outros funcionários como seus gerentes).
Restrições de relações de vários caminhos: você pode definir várias relações entre duas tabelas, mas há limitações.
Por exemplo, se
line_itemsestiver relacionado aorderspor meio deorder_keye de outra coluna, essas tabelas não poderão se referir às expressões semânticas uma da outra.Nota
Se houver vários caminhos que possam ser usados para unir duas tabelas, defina tabelas lógicas e relacionamentos separados para cada caminho. Para obter mais informações, consulte Definição de tabelas lógicas diferentes para caminhos distintos que unem duas tabelas.
Restrições de relações um para um: os relacionamentos individuais têm limitações.
Por exemplo, suponha que você defina uma relação
orders(id) REFERENCES order_summary, em queidé uma chave primária ou tem valores exclusivos emorders.order_summarynão pode se referir a expressões semânticas emorders, emboraorderspossa se referir a expressões semânticas emorder_summary.
Regras de validação de expressões¶
As regras a seguir se aplicam a expressões semânticas em fatos, dimensões e métricas:
Regras gerais sobre expressões¶
As regras a seguir se aplicam às expressões semânticas em geral:
Tipos de expressão: dimensões e fatos são expressões em nível de linha (não agregadas), enquanto as métricas são expressões em nível de agregação.
Por exemplo,
customer_nameé uma dimensão (nível de linha), enquantoorder_average_valueé uma métrica (nível de agregação).Associação de tabelas: toda expressão semântica deve ser associada a uma tabela.
Por exemplo,
customer_namedeve ser definido comocustomer.customer_name, eorder_average_valuecomoorders.order_average_value.Referências à mesma tabela: as expressões podem se referir a colunas da tabela base ou a outras expressões na mesma tabela lógica usando nomes qualificados ou não qualificados.
Por exemplo, na tabela
orders, você poderia definirorders.shipping_monthcomoMONTH(o_shipdate)(usando o nome da coluna não qualificado)MONTH(orders.o_shipdate)(usando o nome qualificado)
Limitações entre tabelas: as expressões não podem se referir a colunas da tabela base de outras tabelas ou expressões de tabelas lógicas não relacionadas.
Por exemplo,
customer.customer_namenão pode fazer referência direta a uma expressão da tabelaorders, a menos que haja uma relação entre elas. Para trabalhar com dados entre tabelas, você deve:Definir relações entre tabelas lógicas (por exemplo, entre
customereorderspor meio dec_custkey).Definir um fato na tabela de origem (por exemplo,
orders.total_value).Fazer referência a essas expressões a partir de uma tabela lógica conectada (por exemplo,
customer.order_valuepode fazer referência aorders.total_value).
Resolução de nomes: se tanto uma expressão semântica quanto uma coluna tiverem o mesmo nome, as referências a esse nome serão resolvidas para a expressão semântica.
Por exemplo, se você definir uma dimensão
regione houver também uma colunaregion,regionem expressões será resolvido para a dimensão, não para a coluna. Uma exceção acontece quando uma expressão se refere ao mesmo nome em sua definição (por exemplo,customer.c_name AS customers.c_name). A referência é resolvida para a coluna, e não para a própria expressão de definição.Ciclos de referência de expressões: você não pode criar referências circulares entre expressões.
Por exemplo, você não pode definir
customer.total_valuecom base emorders.customer_valuee, em seguida, definirorders.customer_valuecom base emcustomer.total_value.Ciclos de referência de tabela: você não pode criar referências circulares entre tabelas lógicas em definições de expressão.
Por exemplo, você não pode definir
customer.total_valuecom base emorders.customer_valuee, em seguida, definirorders.customer_countcom base emcustomer.c_custkey.Uso de funções: você pode usar funções escalares, como YEAR* / DAY* / WEEK* / MONTH / QUARTER, nas dimensões, mas as funções de tabela não são permitidas.
Regras para expressões em nível de linha (dimensões e fatos)¶
As regras a seguir se aplicam a expressões em nível de linha em dimensões e fatos:
Referências à mesma tabela: uma expressão em nível de linha pode se referir diretamente a colunas de sua própria tabela.
Por exemplo,
customers.customer_namepode ser definido diretamente comocustomers.c_name.Granularidade igual ou inferior: uma expressão em nível de linha pode se referir diretamente a outras expressões em nível de linha com granularidade igual ou inferior.
Por exemplo,
orders.order_detailspode se referir acustomer.customer_nameporquecustomerestá em uma granularidade menor do queorders(um cliente pode ter muitos pedidos).Referências de granularidade superior: ao fazer referência a expressões em nível de linha em uma granularidade superior, uma expressão em nível de linha deve usar agregação.
Por exemplo,
customer.total_ordersdeve usarCOUNT(orders.o_orderkey)porqueordersestá em uma granularidade maior do quecustomer(um cliente pode ter muitos pedidos).Referências agregadas: uma dimensão como
orders.order_typenão pode se referir a uma métrica comoorders.order_average_value, mascustomer.customer_segmentpode se referir aorders.order_average_valueporquecustomerestá em uma granularidade menor do que orders (pedidos).
Regras para expressões em nível de agregação (métricas)¶
As regras a seguir se aplicam a expressões em nível de agregação nas métricas:
Agregação básica: uma métrica deve usar uma função de agregação.
Por exemplo,
orders.order_average_valuedeve usarAVG(orders.o_totalprice).Granularidade igual ou inferior: ao se referir a expressões em nível de linha com granularidade igual ou inferior, uma métrica deve usar uma única agregação.
Por exemplo,
orders.total_valuepode usarSUM(line_items.discounted_price)porqueline_itemsestá em uma granularidade menor do que orders (pedidos).Referências de granularidade superior: ao fazer referência a expressões em nível de linha em uma granularidade superior, uma métrica deve usar a agregação aninhada.
Por exemplo,
customer.average_order_valuedeve usarAVG(SUM(orders.o_totalprice))porqueordersestá em uma granularidade mais alta do quecustomer.Outras referências agregadas: uma métrica pode se referir diretamente a outras métricas com granularidade igual ou inferior sem agregação.
Por exemplo,
orders.profit_marginpode ser definido comoorders.total_revenue / orders.total_costsem agregação adicional. No entanto, ao se referir a métricas de granularidade superior, é necessária uma agregação.
Regras para métricas de função de janela¶
Essas regras se aplicam a métricas de função de janela:
As métricas de função de janela não podem ser usadas por cálculos no nível da linha (fatos e dimensões).
As métricas de função de janela não podem ser usadas nas definições de outras métricas.