Snowflake가 시맨틱 뷰를 검증하는 방법
Snowflake가 시맨틱 뷰를 검증하는 방법
Snowflake는 시맨틱 뷰를 정의할 때 일련의 검증 규칙을 준수하는지 확인해요. 이 규칙들은 시맨틱 모델이 올바르게 구성되어 제대로 동작하도록 보장해 줘요.
출처: Snowflake 문서
본문
Snowflake는 시맨틱 뷰를 정의할 때 일련의 검증 규칙을 준수하는지 확인해요. 이 규칙들은 시맨틱 모델이 잘 구성되었고 올바르게 동작할 것임을 보장해 줘요.
이 규칙들은 다음 섹션에서 설명해요:
일반 검증 규칙
다음 규칙들은 시맨틱 뷰 전반에 적용돼요:
- 필수 요소: 시맨틱 뷰는 최소한 하나의 dimension 또는 metric을 정의해야 해요. 예를 들어 TPC-H 시맨틱 뷰는 최소한 하나의 dimension(예:
customer_name) 또는 하나의 metric(예:order_average_value)이 필요해요. - 기본 키와 외래 키: 기본 키와 외래 키 정의에서는 물리적 기본 테이블 컬럼 또는 기본 테이블 컬럼을 직접 참조하는 논리 테이블의 표현식(예:
t1.fact AS t1.col)을 사용해야 해요. 예를 들어 TPC-H 스키마에서c_custkey를customer테이블의 기본 키로,o_custkey를orders테이블의 외래 키로 사용할 수 있어요.c_custkey와o_custkey는 물리적 기본 테이블의 컬럼이에요. - 테이블 별칭 참조: 관계나 표현식에서 테이블을 참조할 때는 정의된 별칭(alias)을 사용해야 해요. 예를 들어 테이블 별칭을
orders AS snowflake_sample_data.tpch.orders_table로 정의했다면, 메트릭 정의에서 테이블 별칭인orders(orders_table이 아니라)를 사용해야 해요. 논리 테이블의 별칭을 지정하지 않았다면 어떤 표현식에서든 논리 테이블 이름을 사용해야 해요.
관계(relationship) 검증 규칙
다음 규칙들은 시맨틱 뷰의 관계에 적용돼요:
- 다대일(Many-to-one) 및 일대일(One-to-one) 관계: 관계는 외래 키 제약 조건처럼 동작해요. 논리 테이블
table_1이col_1을 기본 키로 식별한다고 가정해 보죠:
관계를TABLES ( table_1 AS my_table_1 PRIMARY KEY (col_1) ...table_2 (col_2) REFERENCES table_1 (col_1)로 정의하면,col_1은 기본 키여야 하고col_2는 외래 키 역할을 해야 해요.table_2의 여러 행이col_2에서 같은 값을 사용한다면,table_2에서table_1로의 다대일 관계를 만드는 거예요. 예를 들어orders (o_custkey) REFERENCES customers (c_custkey)는orders에서customers로의 다대일 관계를 만들어요(한 고객에게 여러 주문이 속할 수 있음).table_2의 각 행이col_2에서 고유한 값을 가진다면,table_2에서table_1로의 일대일 관계를 만드는 거예요. 예를 들어customer_details_extended (e_custkey) REFERENCES customer_details (c_custkey)는customer_details_extended에서customer_details로의 일대일 관계를 만들어요(고객의 확장 세부 정보 한 행은 키c_custkey의 고객 세부 정보 한 행에 속함).- 일대일 관계에 수행되는 검증:
- 행 수준 표현식은 같은(또는 더 낮은) 세분성(granularity)의 다른 행 수준 표현식을 참조할 수 있어요. 예를 들어
customer_details와customer_details_extended가 일대일 관계이고, 각각의 행 수준 표현식은 특정 고객 하나를 가리켜요. 행 수준 표현식이 같은 세분성이므로 각각은 행 수준 표현식에서 서로를 직접 참조할 수 있어요. 결과적으로customer_details의 행 수준 표현식은customer_details_extended의 행 수준 표현식의 메트릭이나 집계를 참조할 수 없어요(그 반대도 마찬가지). - 집계 수준 표현식은 단일 집계(single aggregate)를 사용해 같은 세분성의 행 수준 표현식을 참조해야 해요. 예를 들어
customer_details또는customer_details_extended의 집계 수준 표현식은 다른 엔티티를 참조할 때 단일 집계를 사용해야 해요. 또한customer_details와customer_details_extended의 메트릭은 집계 없이 두 엔티티의 다른 메트릭을 직접 참조해야 해요. 이 규칙들은 엔티티 간 관계가customer_details REFERENCES customer_details_extended로 정의됐든customer_details_extended REFERENCES customer_details로 정의됐든 적용돼요.
- 행 수준 표현식은 같은(또는 더 낮은) 세분성(granularity)의 다른 행 수준 표현식을 참조할 수 있어요. 예를 들어
- 전이 관계(Transitive relationships): Snowflake는 간접 관계를 자동으로 유도해요. 예를 들어
line_items와orders사이의 관계와orders와customer사이의 관계를 정의하면, Snowflake는line_items와customer사이에도 관계가 있다는 것을 이해해요.- 일대일 관계는 다른 일대일 및 다대일 관계와 상호작용할 때 전이성을 존중해요:
- 논리 테이블
customers와customer_details가 일대일 관계이고,customer_details와customer_details_extended가 일대일 관계라면,customers와customer_details_extended도 일대일 관계인 것으로 자동으로 유추되어 검증 중에도 그렇게 취급돼요. - 논리 테이블
customers와customer_details가 일대일 관계이고,customer_details와regions가 다대일 관계라면,customers는regions에 대해 전이적으로 다대일인 것으로 유추되며, 이는 표현식 검증 중customers에게regions보다 더 높은 세분성을 부여해요.
- 논리 테이블
- 일대일 관계는 다른 일대일 및 다대일 관계와 상호작용할 때 전이성을 존중해요:
- 순환 관계 금지: 전이 경로를 통해서라도 순환 관계를 정의할 수 없어요. 예를 들어
orders에서customer로의 관계와customer에서orders로의 관계를 동시에 정의할 수 없어요. - 자기 참조 금지: 현재 테이블은 자기 자신을 참조할 수 없어요(직원들이 다른 직원을 관리자로 참조할 수 있는 직원 관리자 계층처럼).
- 다중 경로 관계 제약: 두 테이블 사이에 여러 관계를 정의할 수 있지만 제한이 있어요. 예를 들어
line_items가orders와order_key및 다른 컬럼을 통해 둘 다 관련되어 있다면, 이 테이블들은 서로의 시맨틱 표현식을 참조할 수 없어요.참고: 두 테이블을 조인하는 데 사용할 수 있는 경로가 여러 개라면, 이 관계들을 정의하고 메트릭을 정의할 때 어떤 경로를 사용할지 지정해야 해요. 자세한 내용은 Specifying the relationship for a metric when multiple relationship paths exist를 참고해요.
표현식 검증 규칙
다음 규칙들은 fact, dimension, metric의 시맨틱 표현식에 적용돼요:
표현식에 대한 일반 규칙
다음 규칙들은 시맨틱 표현식 전반에 적용돼요:
- 표현식 유형: dimension과 fact는 행 수준(비집계) 표현식이고, metric은 집계 수준 표현식이에요. 예를 들어
customer_name은 dimension(행 수준)이고order_average_value는 metric(집계 수준)이에요. - 테이블 연관: 모든 시맨틱 표현식은 테이블과 연관되어야 해요. 예를 들어
customer_name은customer.customer_name으로,order_average_value는orders.order_average_value로 정의해야 해요. - 같은 테이블 참조: 표현식은 한정된(qualified) 이름이나 한정되지 않은(unqualified) 이름을 사용해 같은 논리 테이블의 기본 테이블 컬럼이나 다른 표현식을 참조할 수 있어요. 예를 들어
orders테이블에서orders.shipping_month를MONTH(o_shipdate)(한정되지 않은 컬럼 이름 사용) 또는MONTH(orders.o_shipdate)(한정된 이름 사용)로 정의할 수 있어요. - 교차 테이블 제한: 표현식은 다른 테이블의 기본 테이블 컬럼이나 관련 없는 논리 테이블의 표현식을 참조할 수 없어요. 예를 들어
customer.customer_name은 그들 사이에 관계가 없으면orders테이블의 표현식을 직접 참조할 수 없어요. 테이블 간 데이터로 작업하려면 다음을 해야 해요:- 논리 테이블 간 관계를 정의해요(예:
c_custkey를 통한customer와orders사이). - 소스 테이블에 fact를 정의해요(예:
orders.total_value). - 연결된 논리 테이블에서 이 표현식들을 참조해요(예:
customer.order_value가orders.total_value를 참조할 수 있음).
- 논리 테이블 간 관계를 정의해요(예:
- 이름 해석(Name resolution): 시맨틱 표현식과 컬럼이 같은 이름을 가지면, 그 이름에 대한 참조는 시맨틱 표현식으로 해석돼요. 예를 들어
regiondimension을 정의하고region컬럼도 있다면, 표현식에서region은 컬럼이 아니라 dimension으로 해석돼요. 예외는 표현식이 정의에서 같은 이름을 참조할 때예요(예:customer.c_name AS customers.c_name). 이 경우 참조는 정의하는 표현식 자체가 아니라 컬럼으로 해석돼요. - 표현식 참조 순환 금지: 표현식 간에 순환 참조를 만들 수 없어요. 예를 들어
customer.total_value를orders.customer_value를 기반으로 정의한 다음orders.customer_value를customer.total_value를 기반으로 정의할 수 없어요. - 테이블 참조 순환 금지: 표현식 정의에서 논리 테이블 간 순환 참조를 만들 수 없어요. 예를 들어
customer.total_value를orders.customer_value를 기반으로 정의한 다음orders.customer_count를customer.c_custkey를 기반으로 정의할 수 없어요. - 함수 사용: dimension에서 YEAR* / DAY* / WEEK* / MONTH / QUARTER 같은 스칼라 함수를 사용할 수 있지만, 테이블 함수는 허용되지 않아요.
행 수준 표현식(차원과 fact) 규칙
다음 규칙들은 dimension과 fact의 행 수준 표현식에 적용돼요:
- 같은 테이블 참조: 행 수준 표현식은 자체 테이블의 컬럼을 직접 참조할 수 있어요. 예를 들어
customers.customer_name은customers.c_name으로 직접 정의할 수 있어요. - 같거나 더 낮은 세분성: 행 수준 표현식은 같거나 더 낮은 세분성의 다른 행 수준 표현식을 직접 참조할 수 있어요. 예를 들어
orders.order_details는customer.customer_name을 참조할 수 있는데,customer가orders보다 더 낮은 세분성이기 때문이에요(한 고객이 여러 주문을 가질 수 있음). - 더 높은 세분성 참조: 더 높은 세분성의 행 수준 표현식을 참조할 때 행 수준 표현식은 집계를 사용해야 해요. 예를 들어
customer.total_orders는COUNT(orders.o_orderkey)를 사용해야 하는데,orders가customer보다 더 높은 세분성이기 때문이에요(한 고객이 여러 주문을 가질 수 있음). - 집계 참조:
orders.order_type같은 dimension은orders.order_average_value같은 metric을 참조할 수 없지만,customer.customer_segment는customer가 orders보다 더 낮은 세분성이므로orders.order_average_value를 참조할 수 있어요.
집계 수준 표현식(메트릭) 규칙
다음 규칙들은 metric의 집계 수준 표현식에 적용돼요:
- 기본 집계: 파생 메트릭(derived metric)이 아닌 metric은 집계 함수를 사용해야 해요. 예를 들어
orders.order_average_value는AVG(orders.o_totalprice)를 사용해야 해요. - 같거나 더 낮은 세분성: 같거나 더 낮은 세분성의 행 수준 표현식을 참조할 때 metric은 단일 집계를 사용해야 해요. 예를 들어
orders.total_value는SUM(line_items.discounted_price)를 사용할 수 있는데,line_items가 orders보다 더 낮은 세분성이기 때문이에요. - 더 높은 세분성 참조: 더 높은 세분성의 행 수준 표현식을 참조할 때 metric은 중첩 집계를 사용해야 해요. 예를 들어
customer.average_order_value는AVG(SUM(orders.o_totalprice))를 사용해야 하는데,orders가customer보다 더 높은 세분성이기 때문이에요. - 다른 집계 참조: metric은 집계 없이 같거나 더 낮은 세분성의 다른 metric을 직접 참조할 수 있어요. 예를 들어
orders.profit_margin은 추가 집계 없이orders.total_revenue / orders.total_cost로 정의할 수 있어요. 단, 더 높은 세분성의 metric을 참조할 때는 집계가 필요해요.
윈도우 함수 메트릭 규칙
다음 규칙들은 윈도우 함수 메트릭에 적용돼요:
- 윈도우 함수 메트릭은 행 수준 계산(fact와 dimension)에서 사용할 수 없어요.
- 윈도우 함수 메트릭은 다른 metric의 정의에 사용할 수 없어요.