Skip to content

Snowflake naming convention

Why: Husky will run multiple concurrent Marketplace listings + internal pipelines. Without a convention, we reinvent names per-product and lose the ability to audit who-has-access-to-what in SHOW GRANTS output. This doc is the single source of truth.

General rules

  • Uppercase snake_case for all object identifiers. Snowflake is case-insensitive unless quoted; using uppercase avoids accidental "my_table" quoting confusion.
  • Descriptive, not cryptic. SEGMENT_CATALOG beats SC1.
  • Present-tense, noun-ish for tables, V_ prefix for views.
  • Avoid reserved words (USER, ORDER, SHARE as an unqualified column, etc.).
  • No PII or supplier brands anywhere in object names — ever. See docs/strategy/2026-04-20-aws-dx-product-catalog.md §1 confidentiality policy.

Databases

Only one: HUSKY_DATA. All Husky production objects live here. Personal databases (USER$HUSKY, etc.) are Snowflake-managed and ignored for convention purposes.

Schemas inside HUSKY_DATA

Schema Purpose Who touches
PRIVATE Production pipeline: raw + transformed tables, monthly aggregates, Eyeota output stage. Kelvin's monthly runbook runs here. Data team + Kelvin's monthly pipeline only
SHARE Marketplace-facing secure views + catalogs. Grants to outbound SHARE objects only. Marketplace build scripts
PUBLIC Demos, Streamlit apps (DataCopilot, SNOWCHAT). App developers
DATA Curated intermediate tables for internal analytics (future). Pipeline team

Rule of thumb: if an object is referenced by a Marketplace SHARE, it lives in SHARE. If it's part of internal production or external egress (like the Eyeota pipeline), it lives in PRIVATE.

Shares (one per Marketplace listing)

Format

HUSKY_<GEO>_<CHANNEL>_<TIER>

Component Allowed values Notes
<GEO> APAC, AMER, EMEA, GLOBAL, or single country ISO3 (USA, SGP, JPN) What the data is about
<CHANNEL> MAID, HEM, PHONE, IP, MOBILE (MAID+HEM umbrella), MULTI (all channels) Identifier primitive
<TIER> SAMPLE (free), BRANDED (300 curated, paid), WHOLESALE (full ~65K, private), PROFILE (ActiveData, private + DPA) Revenue tier

Examples

Share name Listing type
HUSKY_APAC_MOBILE_SAMPLE Free multi-channel sample (MAID + HEM + coverage)
HUSKY_APAC_MAID_BRANDED Paid branded 300 APAC MAID
HUSKY_APAC_HEM_BRANDED Paid branded 300 APAC HEM
HUSKY_APAC_MAID_WHOLESALE Private-offer wholesale ~65K APAC MAID
HUSKY_USA_MAID_BRANDED Paid US-only branded MAID
HUSKY_GLOBAL_PROFILE Private-offer ActiveData 143-col enriched

Conventions within conventions:

  • Drop _FREE — the SAMPLE tier implies free. Adding _FREE is redundant.
  • GEO is optional for SAMPLE tier when contents span multiple regions. Example: the first published sample is HUSKY_MOBILE_SAMPLE, which contains SGP MAID (APAC) + USA HEM — neither APAC nor GLOBAL is accurate. Paid tiers always specify GEO.
  • MOBILE umbrella — when a single listing combines MAID + HEM (common for sample listings), use MOBILE.
  • Listing display name is separate from share name. Share name is machine-readable convention; listing title in Provider Studio is marketing copy. See below.

Listing display names (marketing, for Provider Studio)

Natural language, short, title-case, hyphen-separated components. Format: Husky Data — <GEO> <Channel description> — <tier tag>

Share Listing display name
HUSKY_APAC_MOBILE_SAMPLE "Husky Data — APAC Mobile Audience — Free Sample"
HUSKY_APAC_MAID_BRANDED "Husky Data — APAC Mobile Audience (300 Branded Segments)"
HUSKY_USA_MAID_BRANDED "Husky Data — USA Mobile Audience (300 Branded Segments)"
HUSKY_APAC_MAID_WHOLESALE "Husky Data — APAC Mobile Audience (Wholesale, Private Offer)"

Match the display names in listings across Snowflake Marketplace + AWS DX to avoid buyer confusion.

Secure views inside SHARE

Format

V_<CONTENT> — named by what they expose, not by which share they belong to (multiple shares can reference the same view via separate GRANT SELECT).

Examples

View name What it contains
V_MAID_SAMPLE_SGP_ANDROID 1K-row sampled slice (country=SGP, platform=ANDROID) of latest MAID
V_HEM_SAMPLE_SGP 1K-row sampled slice of latest HEM for SGP
V_COUNTRY_COVERAGE Aggregate-only: country × platform × count — no identifiers
V_MAID_APAC_BRANDED Full latest-month MAID filtered to the 300 branded segments, APAC countries
V_HEM_APAC_BRANDED Same for HEM
V_METHODOLOGY (future) Methodology + refresh cadence description, as a 1-row table

Why V_ prefix: in SHOW TABLES / SHOW VIEWS, prefix distinguishes views from tables at a glance. SV_ for secure views is also used in some shops, but Snowflake's SHOW VIEWS output already surfaces is_secure column, so the extra S is noise.

Tables inside SHARE

Plain descriptive snake_case uppercase: SEGMENT_CATALOG, METHODOLOGY_VERSIONS, PRICING_TIERS.

No prefix for tables — the absence of V_ communicates "table".

Stages

Format

Internal stages inside HUSKY_DATA.SHARE: INGEST_<PURPOSE> or EGRESS_<PURPOSE> — direction-first, purpose-second.

Examples

Stage Schema Purpose Direction
INGEST_CATALOG SHARE Upload target for segment_bridge_marketplace.csv and similar CSVs that feed SEGMENT_CATALOG Inbound
INGEST_METADATA (future) SHARE Methodology PDF, logos, data-dictionary files Inbound
DATA_HUSKY PRIVATE (existing) Inbound S3 stage at s3://data.huskyai.com/ External, inbound
AGG_DATA_HUSKY PRIVATE (existing) Inbound S3 stage at s3://agg-data.huskyai.com/ External, inbound
HUSKY_EYEOTA_UPLOADER PRIVATE (existing) Outbound S3 stage to Eyeota ingest External, outbound
EYEOTA_PROFILE_UPLOADER PRIVATE (existing) Outbound S3 stage to alt-Eyeota path External, outbound

Do not rename existing stages. Kelvin's monthly runbook references them by name in hard-coded COPY INTO statements. The new naming convention applies only to new stages created going forward; legacy names are grandfathered.

Warehouses

Existing names are fine: DEV (default, X-Small), PROD (Medium, Snowpark-optimized), PROD15 (Large, Snowpark-optimized), SYSTEM$STREAMLIT_NOTEBOOK_WH (system-managed).

If we add new warehouses: <TIER>_<SIZE_HINT> format — MARKETPLACE_XS, MARKETPLACE_S, etc.

Roles (access control)

Future naming for Marketplace-specific roles:

  • MARKETPLACE_PUBLISHER — can CREATE SHARE, GRANT, submit listings
  • MARKETPLACE_BUILDER — can CREATE VIEW in SHARE schema but not SHARE itself
  • DATA_ENGINEER — full access to PRIVATE (existing Kelvin role)
  • ANALYST — SELECT only on DATA + PUBLIC

Not created yet; noted for future.

Rollback & change-management

  • Any SHARE rename breaks buyer-side listings — don't rename a share once its listing goes live. Create a new share, migrate, drop old, update listing.
  • Any SHARE-schema object rename breaks the views that depend on it. Same rule: rename backwards-compat via view aliases if needed.
  • Grandfather-clause: existing HUSKY_DATA.PRIVATE.* names (stages, tables, FAGG_MAID* etc.) stay as they are — production depends on them.

Change log

  • 2026-04-21 — Initial convention. Approved by Benjamin Wong (CEO). First share to be created under this convention: HUSKY_APAC_MOBILE_SAMPLE. First ingest stage: HUSKY_DATA.SHARE.INGEST_CATALOG.