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 라는 테이블 별칭을 사용해야 합니다.

    논리 테이블에 별칭을 지정하지 않으면 모든 식에서 논리 테이블 이름을 사용해야 합니다.

관계 유효성 검사 규칙

의미 체계 뷰의 관계에는 다음 규칙이 적용됩니다.

  • Many-to-one relationships and one-to-one relationships: Relationships work like foreign key constraints.

    논리 테이블 ``table_1``이 ``col_1``을 기본 키로 식별한다고 가정해 보겠습니다.

    TABLES (
      table_1 AS my_table_1 PRIMARY KEY (col_1)
      ...
    
    Copy

    관계를 :code:`table_2 (col_2) REFERENCES table_1 (col_1)`로 정의하는 경우 ``col_1``은 기본 키여야 하며, ``col_2``는 외래 키 역할을 해야 합니다.

    • ``table_2``의 여러 행이 ``col_2``에서 동일한 값을 사용하는 경우 ``table_2``에서 ``table_1``로의 다대일 관계가 생성됩니다.

      For example, orders (o_custkey) REFERENCES customers (c_custkey) creates a many-to-one relationship from orders to customers (many orders can belong to one customer with the key c_custkey).

    • ``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` 키가 있는 고객 세부 정보의 한 행에 속함).

  • Validations performed on one-to-one relationships:

    • Row-level expressions can refer to other row-level expressions at the same (or lower) granularity.

      예를 들어, customer_details``customer_details_extended``는 일대일 관계를 가지며, 여기서 ``customer_details``의 한 행은 ``customer_details_extended``의 한 행과 관련이 있습니다. 이러한 각 테이블의 행 수준 식은 한 명의 특정 고객을 참조합니다. 행 수준 식은 세분성이 동일하므로 각 행은 행 수준 식에서 다른 식을 직접 참조할 수 있습니다.

      결과적으로, ``customer_details``의 행 수준 식은 ``customer_details_extended``에 대한 행 수준 식의 메트릭 또는 집계를 참조할 수 :emph:`없습니다`(그 반대도 마찬가지임).

    • :ref:`집계 수준 식<label-semantic_views_validation_expression_aggregate>`은 단일 집계를 사용하여 동일한 세분성에서 행 수준 식을 참조해야 합니다.

      예를 들어, customer_details 또는 customer_details_extended``의 집계 수준 식은 다른 엔터티를 참조할 단일 집계를 사용해야 합니다. 또한 ``customer_details``customer_details_extended``에 대한 메트릭은 집계 없이 두 엔터티의 다른 메트릭을 직접 참조해야 합니다.

    이러한 규칙은 엔터티 간의 관계가 customer_details REFERENCES customer_details_extended 또는 :code:`customer_details_extended REFERENCES customer_details`로 정의되는지 여부에 적용됩니다.

  • 전이 관계: Snowflake는 자동으로 간접 관계를 도출합니다.

    예를 들어, line_itemsorders 사이의 관계를 정의하고 orderscustomer 사이의 또 다른 관계를 정의하면 Snowflake는 line_itemscustomer 사이에도 관계가 있다는 것을 이해합니다.

    일대일 관계는 다른 일대일 및 다대일 관계와 상호 작용할 때 전이성을 존중합니다.

    • 논리 테이블 customerscustomer_details``가 일대일 관계이고 논리 테이블 ``customer_detailscustomer_details_extended``가 일대일 관계인 경우 논리 테이블 ``customers``customer_details_extended``는 일대일 관계로 자동 추론되며 유효성 검사 중에 이와 같이 처리됩니다.

    • 논리 테이블 customerscustomer_details``가 일대일 관계이고 논리 테이블 ``customer_details``regions``가 다대일 관계인 경우, ``customers``는 ``regions``에 대해 전이적으로 다대일 관계로 추론되며, 이는 식 유효성 검사 중 ``customers``에 ``regions``보다 높은 세분성을 제공합니다.

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

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

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

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

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

    참고

    두 테이블을 조인하는 데 사용할 수 있는 경로가 여러 개 있는 경우 각 경로에 대해 별도의 논리 테이블과 관계를 정의해야 합니다. 자세한 내용은 두 테이블을 조인하는 서로 다른 경로에 대해 서로 다른 논리 테이블 정의 섹션을 참조하십시오.

식 유효성 검사 규칙

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

식에 대한 일반 규칙

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

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

    예를 들어, 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 등의 스칼라 함수를 사용할 수 있지만 테이블 함수는 허용되지 않습니다.

행 수준 식(차원 및 팩트)에 대한 규칙

차원 및 팩트에서 행 수준 식에는 다음 규칙이 적용됩니다.

  • 동일한 테이블 참조: 행 수준 식은 자체 테이블의 열을 직접 참조할 수 있습니다.

    예를 들어, 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 가 주문보다 세분성이 낮기 때문입니다.

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

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

  • Basic aggregation: A metric that is not a derived metric must use an aggregate function.

    예를 들어, 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 로 정의할 수 있습니다. 그러나 더 세분화된 메트릭을 참조할 때는 집계가 필요합니다.

윈도우 함수 메트릭에 대한 규칙

이러한 규칙은 윈도우 함수 메트릭 에 적용됩니다.

  • 윈도우 함수 메트릭은 행 수준 계산(팩트 및 차원)에서 사용할 수 없습니다.

  • 윈도우 함수 메트릭은 다른 메트릭의 정의에 사용할 수 없습니다.