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 같은 Scalar 함수를 사용할 수 있지만 테이블 함수는 허용되지 않습니다. 윈도우 함수는 차원 및 팩트에서는 허용되지만 메트릭에서는 허용되지 않습니다.
행 수준 식(차원 및 팩트)에 대한 규칙¶
차원 및 팩트에서 행 수준 식에는 다음 규칙이 적용됩니다.
동일한 테이블 참조: 행 수준 식은 자체 테이블의 열을 직접 참조할 수 있습니다.
예를 들어,
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
로 정의할 수 있습니다. 그러나 더 세분화된 메트릭을 참조할 때는 집계가 필요합니다.