Snowflake가 의미 체계 뷰를 검증하는 방법

의미 체계적 뷰를 정의할 때 Snowflake는 유효성 검사 규칙 세트를 준수하는지 확인합니다. 이러한 규칙은 의미 체계 모델이 잘 형성되고 올바르게 함수할 수 있도록 보장합니다.

이러한 규칙은 다음 섹션에서 설명합니다.

일반 유효성 검사 규칙

일반적으로 의미 체계 뷰에는 다음 규칙이 적용됩니다.

  • 필수 요소: 의미 체계 뷰는 1개 이상의 차원 또는 메트릭을 정의해야 합니다.

    예를 들어, TPC-H 의미 체계 뷰에는 최소한 1개의 차원(예: customer_name) 또는 메트릭(예: order_average_value)이 필요합니다.

  • 기본 키 및 외래 키: 기본 키 및 외래 키 정의에서 물리적 기본 테이블 열 또는 기본 테이블 열을 직접 참조하는 논리 테이블에 정의된 식을 사용해야 합니다(예: t1.fact AS t1.col).

    예를 들어, TPC-H 스키마에서 c_custkeycustomer 테이블의 기본 키로, o_custkeyorders 테이블의 외래 키로 사용할 수 있습니다. c_custkeyo_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_itemsorders 사이의 관계를 정의하고 orderscustomer 사이의 또 다른 관계를 정의하면 Snowflake는 line_itemscustomer 사이에도 관계가 있다는 것을 이해합니다.

  • 순환 관계 없음: 순환 관계는 전이 경로를 통해서도 정의할 수 없습니다.

    예를 들어, orders 에서 customer 로의 관계와 customer 에서 orders 로의 다른 관계를 정의할 수 없습니다.

  • 자체 참조 금지: 현재 테이블은 자신을 참조할 수 없습니다(예: 직원이 다른 직원을 자신의 관리자로 참조할 수 있는 직원 관리자 계층 구조).

  • 다중 경로 관계 제한: 두 테이블 간에 여러 관계를 정의할 수 있지만 제한이 있습니다.

    예를 들어, line_itemsorder_key 와 다른 열을 통해 orders 와 연관되어 있는 경우, 해당 테이블은 서로의 의미 식을 참조할 수 없습니다.

  • 일대일 관계 제한: 일대일 관계에는 제한이 있습니다.

    예를 들어, id 가 기본 키이거나 orders 에서 고유한 값을 갖는 관계 orders(id) REFERENCES order_summary 를 정의한다고 가정합니다. order_summaryorders 의미 식에서 의미 식을 참조할 수 없지만, ordersorder_summary 에서 의미 식을 참조할 수 있습니다.

식 유효성 검사 규칙

팩트, 차원 및 메트릭의 의미 체계 식에는 다음 규칙이 적용됩니다.

식에 대한 일반 규칙

일반적으로 의미 체계 식에는 다음 규칙이 적용됩니다.

  • 식 유형: 차원 및 팩트는 행 수준 식(집계되지 않음)이고 메트릭은 집계 수준 식입니다.

    예를 들어, customer_name 은 차원(행 수준)이고 order_average_value 는 메트릭(집계 수준)입니다.

  • 테이블 연결: 모든 의미 체계 식은 테이블과 연결되어야 합니다.

    예를 들어, customer_namecustomer.customer_name 으로, order_average_valueorders.order_average_value 로 정의해야 합니다.

  • 동일한 테이블 참조: 식은 한정된 이름 또는 한정되지 않은 이름을 사용하여 동일한 논리 테이블의 기본 테이블 열 또는 다른 식을 참조할 수 있습니다.

    예를 들어, orders 테이블에서 orders.shipping_month 를 다음과 같이 정의할 수 있습니다

    • MONTH(o_shipdate) (정규화되지 않은 열 이름 사용)

    • MONTH(orders.o_shipdate) (정규화된 이름 사용)

  • 교차 테이블 제한: 식은 다른 테이블의 기본 테이블 열이나 관련 없는 논리 테이블의 식을 참조할 수 없습니다.

    예를 들어, customer.customer_nameorders 테이블의 식을 직접 참조할 수 없으며, 둘 사이에 관계가 없으면 참조할 수 없습니다. 여러 테이블에 걸쳐 데이터 작업을 하려면 반드시 그래야 합니다.

    1. 논리 테이블 간의 관계를 정의합니다(예: customerorders ~ c_custkey 사이).

    2. 소스 테이블(예: orders.total_value)에 팩트를 정의합니다.

    3. 연결된 논리 테이블에서 이러한 식을 참조하십시오(예: customer.order_valueorders.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_namecustomers.c_name 으로 직접 정의할 수 있습니다.

  • 동일하거나 더 낮은 세분성: 행 수준 식은 동일하거나 더 낮은 세부 수준에서 다른 행 수준 식을 직접 참조할 수 있습니다.

    예를 들어, customerorders 보다 세분성이 낮으므로(한 고객이 여러 주문을 가질 수 있음) orders.order_detailscustomer.customer_name 을 참조할 수 있습니다.

  • 더 높은 세분성 참조: 더 높은 세부 수준에서 행 수준 식을 참조할 때 행 수준 식은 집계를 사용해야 합니다.

    예를 들어, orderscustomer 보다 세분성이 높으므로(한 고객이 여러 주문을 가질 수 있음) customer.total_ordersCOUNT(orders.o_orderkey) 을 참조해야 합니다.

  • 집계 참조: orders.order_type 같은 차원은 orders.order_average_value 같은 메트릭을 참조할 수 없지만, customer.customer_segmentorders.order_average_value 를 참조할 수 있으며, 이는 customer 가 주문보다 세분성이 낮기 때문입니다.

집계 수준 식(메트릭)에 대한 규칙

다음 규칙은 메트릭의 집계 수준 식에 적용됩니다.

  • 기본 집계: 메트릭은 집계 함수를 사용해야 합니다.

    예를 들어, orders.order_average_valueAVG(orders.o_totalprice) 를 사용해야 합니다.

  • 동일하거나 더 낮은 세분성: 세분성이 같거나 낮은 행 수준 식을 참조할 때 메트릭은 단일 집계를 사용해야 합니다.

    예를 들어, line_items 은 주문보다 세분성이 낮으므로 orders.total_valueSUM(line_items.discounted_price) 를 사용할 수 있습니다.

  • 더 높은 세분성 참조: 더 높은 세부 수준에서 행 수준 식을 참조할 때 메트릭은 중첩 집계를 사용해야 합니다.

    예를 들어, orderscustomer 보다 세분성이 높으므로 customer.average_order_valueAVG(SUM(orders.o_totalprice)) 를 사용해야 합니다.

  • 기타 집계 참조: 메트릭은 집계 없이 동일하거나 더 낮은 세부 수준에서 다른 메트릭을 직접 참조할 수 있습니다.

    예를 들어, orders.profit_margin 은 추가 집계 없이 orders.total_revenue / orders.total_cost 로 정의할 수 있습니다. 그러나 더 세분화된 메트릭을 참조할 때는 집계가 필요합니다.