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 GRANTSoutput. 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_CATALOGbeatsSC1. - Present-tense, noun-ish for tables,
V_prefix for views. - Avoid reserved words (
USER,ORDER,SHAREas 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— theSAMPLEtier implies free. Adding_FREEis redundant. - GEO is optional for
SAMPLEtier when contents span multiple regions. Example: the first published sample isHUSKY_MOBILE_SAMPLE, which contains SGP MAID (APAC) + USA HEM — neitherAPACnorGLOBALis accurate. Paid tiers always specify GEO. MOBILEumbrella — when a single listing combines MAID + HEM (common for sample listings), useMOBILE.- 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 listingsMARKETPLACE_BUILDER— can CREATE VIEW inSHAREschema but not SHARE itselfDATA_ENGINEER— full access toPRIVATE(existing Kelvin role)ANALYST— SELECT only onDATA+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.