Snowflake가 의미 체계 뷰를 검증하는 방법¶
의미 체계적 뷰를 정의할 때 Snowflake는 유효성 검사 규칙 세트를 준수하는지 확인합니다. 이러한 규칙은 의미 체계 모델이 잘 형성되고 올바르게 함수할 수 있도록 보장합니다.
이러한 규칙은 다음 섹션에서 설명합니다.
일반 유효성 검사 규칙¶
일반적으로 의미 체계 뷰에는 다음 규칙이 적용됩니다.
필수 요소: 의미 체계 뷰는 1개 이상의 차원 또는 메트릭을 정의해야 합니다.
예를 들어, TPC-H 의미 체계 뷰에는 최소한 1개의 차원(예:
customer_name) 또는 메트릭(예:order_average_value)이 필요합니다.기본 키 및 외래 키: 기본 키 및 외래 키 정의에서 물리적 기본 테이블 열 또는 기본 테이블 열을 직접 참조하는 논리 테이블에 정의된 식을 사용해야 합니다(예:
t1.fact AS t1.col).예를 들어, TPC-H 스키마에서
c_custkey를customer테이블의 기본 키로,o_custkey를orders테이블의 외래 키로 사용할 수 있습니다.c_custkey및o_custkey는 물리적 기본 테이블의 열입니다.테이블 별칭 참조: 관계 또는 식에서 테이블을 참조할 때는 정의된 별칭을 사용해야 합니다.
예를 들어, 테이블 별칭을
orders AS snowflake_sample_data.tpch.orders_table로 정의하는 경우 메트릭 정의에orders_table이 아닌orders라는 테이블 별칭을 사용해야 합니다.논리 테이블에 별칭을 지정하지 않으면 모든 식에서 논리 테이블 이름을 사용해야 합니다.
관계 유효성 검사 규칙¶
의미 체계 뷰의 관계에는 다음 규칙이 적용됩니다.
다대일 관계: 관계는 외래 키 제약 조건처럼 작동합니다.
예를 들어, 관계를
orders (o_custkey) REFERENCES customers (c_custkey)로 정의하면orders에서customers로의 다대일 관계를 생성하게 되며(많은 주문이 한 고객에게 속할 수 있음), 여기서c_custkey는 기본 키가 되어야 합니다.전이 관계: Snowflake는 자동으로 간접 관계를 도출합니다.
예를 들어,
line_items및orders사이의 관계를 정의하고orders및customer사이의 또 다른 관계를 정의하면 Snowflake는line_items및customer사이에도 관계가 있다는 것을 이해합니다.순환 관계 없음: 순환 관계는 전이 경로를 통해서도 정의할 수 없습니다.
예를 들어,
orders에서customer로의 관계와customer에서orders로의 다른 관계를 정의할 수 없습니다.자체 참조 금지: 현재 테이블은 자신을 참조할 수 없습니다(예: 직원이 다른 직원을 자신의 관리자로 참조할 수 있는 직원 관리자 계층 구조).
다중 경로 관계 제한: 두 테이블 간에 여러 관계를 정의할 수 있지만 제한이 있습니다.
예를 들어,
line_items이order_key와 다른 열을 통해orders와 연관되어 있는 경우, 해당 테이블은 서로의 의미 식을 참조할 수 없습니다.참고
두 테이블을 조인하는 데 사용할 수 있는 경로가 여러 개 있는 경우 각 경로에 대해 별도의 논리 테이블과 관계를 정의해야 합니다. 자세한 내용은 두 테이블을 조인하는 서로 다른 경로에 대해 서로 다른 논리 테이블 정의 섹션을 참조하십시오.
일대일 관계 제한: 일대일 관계에는 제한이 있습니다.
예를 들어,
id가 기본 키이거나orders에서 고유한 값을 갖는 관계orders(id) REFERENCES order_summary를 정의한다고 가정합니다.order_summary은orders의미 식에서 의미 식을 참조할 수 없지만,orders는order_summary에서 의미 식을 참조할 수 있습니다.
식 유효성 검사 규칙¶
팩트, 차원 및 메트릭의 의미 체계 식에는 다음 규칙이 적용됩니다.
식에 대한 일반 규칙¶
일반적으로 의미 체계 식에는 다음 규칙이 적용됩니다.
식 유형: 차원 및 팩트는 행 수준 식(집계되지 않음)이고 메트릭은 집계 수준 식입니다.
예를 들어,
customer_name은 차원(행 수준)이고order_average_value는 메트릭(집계 수준)입니다.테이블 연결: 모든 의미 체계 식은 테이블과 연결되어야 합니다.
예를 들어,
customer_name은customer.customer_name으로,order_average_value는orders.order_average_value로 정의해야 합니다.동일한 테이블 참조: 식은 한정된 이름 또는 한정되지 않은 이름을 사용하여 동일한 논리 테이블의 기본 테이블 열 또는 다른 식을 참조할 수 있습니다.
예를 들어,
orders테이블에서orders.shipping_month를 다음과 같이 정의할 수 있습니다MONTH(o_shipdate)(정규화되지 않은 열 이름 사용)MONTH(orders.o_shipdate)(정규화된 이름 사용)
교차 테이블 제한: 식은 다른 테이블의 기본 테이블 열이나 관련 없는 논리 테이블의 식을 참조할 수 없습니다.
예를 들어,
customer.customer_name은orders테이블의 식을 직접 참조할 수 없으며, 둘 사이에 관계가 없으면 참조할 수 없습니다. 여러 테이블에 걸쳐 데이터 작업을 하려면 반드시 그래야 합니다.논리 테이블 간의 관계를 정의합니다(예:
customer및orders~c_custkey사이).소스 테이블(예:
orders.total_value)에 팩트를 정의합니다.연결된 논리 테이블에서 이러한 식을 참조하십시오(예:
customer.order_value는orders.total_value참조 가능).
이름 확인: 의미 체계 식과 열의 이름이 모두 같은 경우 해당 이름에 대한 참조는 의미 체계 식에 대한 참조로 해석됩니다.
예를 들어,
region차원을 정의하고region열도 있는 경우 식의region은 열이 아닌 차원으로 해석됩니다. 식이 정의에서 동일한 이름을 참조하는 경우는 예외입니다(예:customer.c_name AS customers.c_name). 참조는 정의 식 자체가 아닌 열로 확인됩니다.식 참조 주기: 식 간에 순환 참조를 생성할 수 없습니다.
예를 들어,
orders.customer_value를 기반으로customer.total_value를 정의한 다음orders.customer_value를 기반으로customer.total_value를 정의할 수 없습니다.테이블 참조 주기: 식 정의에서 논리 테이블 간에는 순환 참조를 생성할 수 없습니다.
예를 들어,
orders.customer_value를 기반으로customer.total_value를 정의한 다음orders.customer_count를 기반으로customer.c_custkey.를 정의할 수 없습니다함수 사용법: 차원에 YEAR* / DAY* / WEEK* / MONTH / QUARTER 등의 스칼라 함수를 사용할 수 있지만 테이블 함수는 허용되지 않습니다.
행 수준 식(차원 및 팩트)에 대한 규칙¶
차원 및 팩트에서 행 수준 식에는 다음 규칙이 적용됩니다.
동일한 테이블 참조: 행 수준 식은 자체 테이블의 열을 직접 참조할 수 있습니다.
예를 들어,
customers.customer_name을customers.c_name으로 직접 정의할 수 있습니다.동일하거나 더 낮은 세분성: 행 수준 식은 동일하거나 더 낮은 세부 수준에서 다른 행 수준 식을 직접 참조할 수 있습니다.
예를 들어,
customer는orders보다 세분성이 낮으므로(한 고객이 여러 주문을 가질 수 있음)orders.order_details은customer.customer_name을 참조할 수 있습니다.더 높은 세분성 참조: 더 높은 세부 수준에서 행 수준 식을 참조할 때 행 수준 식은 집계를 사용해야 합니다.
예를 들어,
orders는customer보다 세분성이 높으므로(한 고객이 여러 주문을 가질 수 있음)customer.total_orders은COUNT(orders.o_orderkey)을 참조해야 합니다.집계 참조:
orders.order_type같은 차원은orders.order_average_value같은 메트릭을 참조할 수 없지만,customer.customer_segment는orders.order_average_value를 참조할 수 있으며, 이는customer가 주문보다 세분성이 낮기 때문입니다.
집계 수준 식(메트릭)에 대한 규칙¶
다음 규칙은 메트릭의 집계 수준 식에 적용됩니다.
기본 집계: 메트릭은 집계 함수를 사용해야 합니다.
예를 들어,
orders.order_average_value는AVG(orders.o_totalprice)를 사용해야 합니다.동일하거나 더 낮은 세분성: 세분성이 같거나 낮은 행 수준 식을 참조할 때 메트릭은 단일 집계를 사용해야 합니다.
예를 들어,
line_items은 주문보다 세분성이 낮으므로orders.total_value는SUM(line_items.discounted_price)를 사용할 수 있습니다.더 높은 세분성 참조: 더 높은 세부 수준에서 행 수준 식을 참조할 때 메트릭은 중첩 집계를 사용해야 합니다.
예를 들어,
orders는customer보다 세분성이 높으므로customer.average_order_value는AVG(SUM(orders.o_totalprice))를 사용해야 합니다.기타 집계 참조: 메트릭은 집계 없이 동일하거나 더 낮은 세부 수준에서 다른 메트릭을 직접 참조할 수 있습니다.
예를 들어,
orders.profit_margin은 추가 집계 없이orders.total_revenue / orders.total_cost로 정의할 수 있습니다. 그러나 더 세분화된 메트릭을 참조할 때는 집계가 필요합니다.
윈도우 함수 메트릭에 대한 규칙¶
이러한 규칙은 윈도우 함수 메트릭 에 적용됩니다.
윈도우 함수 메트릭은 행 수준 계산(팩트 및 차원)에서 사용할 수 없습니다.
윈도우 함수 메트릭은 다른 메트릭의 정의에 사용할 수 없습니다.