Data Warehousing and Dimensional Modeling Questions
Analytical data platforms: star and snowflake schemas, fact and dimension tables, slowly changing dimensions, and cloud data warehouse design and optimization (Redshift, BigQuery, Snowflake-style systems). Covers modeling for analytics versus transactions and tuning warehouse query performance. Central to data-engineering and BI interviews.
Design a warehouse architecture that must serve two very different consumers from the same underlying data: near-real-time operational dashboards (well under a minute of latency, ingesting on the order of 100M events/day) and slower, fully-accurate historical BI/analytics going back several years, including a customer dimension that needs full history (SCD Type 2). Describe the end-to-end architecture (streaming ingestion, CDC, ETL/ELT split, storage choices, partitioning, materialized views/pre-aggregation, and monitoring), and explain specifically where you'd deliberately let the fast path and the accurate path diverge rather than trying to force one pipeline to serve both.
Sample Answer
Direct answer
Do not force one pipeline to serve both speeds: build a fast path (streaming ingestion feeding a cache or pre-aggregated store) that answers "what is happening right now, approximately" in under a minute, and a separate slow path (capturing changes from the source systems and loading them into a partitioned star schema, with the customer dimension modeled as a Type 2 slowly changing dimension, SCD Type 2) that answers "what exactly happened, fully accurate, for as far back as we keep history." Let the two paths deliberately diverge on freshness and precision, and reconcile them on a schedule rather than trying to make the fast path fully correct or the slow path instantly fresh.
Structured elaboration
Streaming ingestion and the fast path. Events land in a stream, get aggregated in near-real time (windowed counts or sums), and are written to a low-latency store (an in-memory or key-value cache) that the operational dashboard reads directly. This path is allowed to be approximate: late-arriving events, minor double-counts during a brief window, or a slightly stale cache are acceptable trade-offs for staying under the latency budget.
Change-data-capture (CDC), the extract-transform-load / extract-load-transform (ETL/ELT) split, and the slow path. The same events (or a CDC stream off the systems of record) also flow into a batch ETL/ELT job that lands them in the warehouse's partitioned star schema. Because this path is not on the clock the way the fast path is, it can afford to do the work that produces a fully correct answer: deduplicate properly, apply the customer dimension's SCD Type 2 logic so a historical query joins to the customer attributes that were actually true at the time of the event, and handle late-arriving data by reprocessing the specific partitions it affects rather than the whole table.
Storage choices, partitioning, and materialized views. The warehouse side partitions the fact table by event date so a historical query only scans the date range it actually needs, and materialized views or pre-aggregated tables sit in front of the fact table for the recurring monthly/yearly rollups the business intelligence (BI) side asks for repeatedly, so those queries are not recomputed from raw rows every time.
Monitoring. Track two different signals for the two paths: freshness lag for the fast path (how far behind real-time is the cache), and reconciliation drift for the slow path (how much the batch-computed totals differ from what the fast path reported for the same window, once the batch numbers are final). A growing reconciliation drift is the signal that something in the fast path's approximation logic has drifted from reality, not just noise to suppress.
Where the two paths deliberately diverge. The fast path answers "roughly how many, right now" using data that has not been fully deduplicated or joined against the SCD Type 2 dimension as of the correct historical moment. The slow path answers "exactly how many, as of last night" using data that has. Trying to make the fast path fully accurate defeats its latency purpose (correct deduplication and point-in-time dimension joins take longer than the latency budget allows); trying to make the slow path instantly fresh defeats its correctness purpose (a batch job that reruns every few seconds to stay fresh does not have time to do the reconciliation work that makes it trustworthy). The two paths are allowed to disagree by a small, monitored, explainable amount at any given moment, and the dashboard should say so (for example, labeling near-real-time numbers as "preliminary, subject to revision") rather than presenting both as equally authoritative.
flowchart LR
EVT[Event stream] --> FAST[Fast path: streaming aggregation and cache]
EVT --> SLOW[Slow path: batch ETL into warehouse]
FAST --> RTDASH[Near-real-time dashboard, under 60s]
SLOW --> STARSCD[(Star schema with SCD Type 2 customer dim)]
STARSCD --> HISTDASH[Historical BI, point-in-time accurate]
STARSCD -->|reconciles counts with| FAST
Worked example
Suppose the 60-second latency budget for the fast path breaks down as: 5s for the event to reach the stream processor, 10s for a windowed aggregation to close, 5s for the result to land in the cache, and up to 40s of dashboard polling interval before a user's screen refreshes. That accounts for the full budget without leaving room for a point-in-time SCD Type 2 join, which typically costs tens of seconds to minutes at scale once you include locating the dimension row that was valid at the exact event timestamp; this is the concrete, numeric reason the fast path uses a simpler, pre-joined or denormalized "current customer state" lookup instead of the fully accurate historical join, and defers the fully accurate join to the slow path where there is no such budget.
Trade-offs and pitfalls
The most damaging mistake is presenting the fast path's numbers with the same visual authority as the slow path's, so a user has no way to know a "live" revenue figure is preliminary and may be revised downward once the batch job reconciles it, which erodes trust in the dashboard the first time the two visibly disagree. A second common mistake is trying to eliminate the fast path entirely once the batch path exists, "because it is more accurate," without realizing that a 60-second latency requirement simply cannot be met by a pipeline whose correctness guarantees require minutes of processing; the two paths exist because they are solving genuinely different problems, not because one is a worse version of the other.
Architect a new enterprise data warehouse from scratch for an organization with 50-100+ TB of raw data, daily bulk loads in the hundreds of millions of rows, and up to a few thousand concurrent BI users running dashboards that refresh every minute. As part of the SAME design (not handed to you separately), choose: the dimensional modeling approach (star schema grain and your slowly-changing-dimension strategy), ingestion pattern (batch vs streaming/CDC for critical tables), storage tiering, compute/storage separation, and pre-aggregation strategy. Justify your trade-offs among latency, cost, and long-term maintainability, and explain specifically where the schema choice and the platform choice constrain each other.
Sample Answer
Direct answer
At this scale the schema decision and the platform decision are not separable steps, they constrain each other directly: choosing a slowly-changing-dimension (SCD) strategy sets how many rows you write per day, which sets your storage and compute footprint; choosing a partitioning scheme sets how much of that footprint any given query has to scan, which sets your latency and cost per query. Design them together: a star schema (fact table at a declared grain, surrounded by conformed dimensions, customer dimension as SCD Type 2) fed by change-data-capture (CDC) for the tables that must be near-real-time and nightly batch for everything else, landing in a tiered storage layer (hot/recent partitions on fast storage, cold/historical partitions on cheaper storage), with compute kept separate from storage so query concurrency scales independently of data volume, and a pre-aggregation layer in front of the raw fact table so the thousands of concurrent business intelligence (BI) dashboards never hit it directly.
Structured elaboration
Dimensional modeling approach. Declare the fact table's grain first (for example, one row per order line item), because every other decision downstream, join fan-out, storage volume, which dashboards the table can support, follows from it. Use SCD Type 2 for dimensions where history matters for reporting (customer, product); this is the single biggest lever on write volume at this scale, which the worked example below quantifies. Use conformed dimensions across every fact table so cross-process reporting is safe.
Ingestion pattern. Not every table needs the same freshness: use log-based change-data-capture for the tables the business genuinely needs updated within minutes (order status, inventory), and nightly batch loads for slower-moving reference data. Mixing these is normal and expected, forcing everything onto one pattern either over-engineers the slow-moving tables or under-serves the time-critical ones.
Storage tiering and compute/storage separation. Recent, frequently-queried partitions live on the warehouse's primary (fast, more expensive) storage; older partitions move to cheaper object storage, addressed transparently through the same table so a query spanning both tiers does not need special-casing. Keeping compute (the query engine) separate from storage (where the data lives) is what lets you scale the two independently: a spike in concurrent BI users needs more compute, not more storage, and a spike in ingested data volume needs more storage, not necessarily more compute.
Pre-aggregation strategy. With a few thousand concurrent BI users refreshing dashboards every minute, the raw partitioned fact table is not what most of those queries should hit: pre-aggregate the handful of metrics that drive most dashboard traffic into materialized summary tables refreshed on a cadence the business can tolerate (for example, every five minutes), and reserve direct fact-table access for the smaller volume of genuinely ad-hoc analyst queries.
Where the schema and the platform choice constrain each other. The SCD Type 2 choice increases row count, which increases the amount of data any given partition or pre-aggregation job has to process; the partitioning scheme then determines whether that extra row count actually costs you at query time (well-pruned partitions mean SCD2's extra history rows are usually excluded by a date filter) or not (a poorly chosen partition key means every query pays for the full history every time). You cannot pick the dimensional model and the physical layout independently and expect the platform to absorb whatever the modeling choice produced for free.
Worked example
Take a 10-million-row customer dimension with a 2% daily attribute-change rate. Compare a full daily snapshot against SCD Type 2:
customers = 10_000_000
daily_change_rate = 0.02
days = 365
full_snapshot_rows_per_year = customers * days # 3,650,000,000
scd2_new_rows_per_year = customers * daily_change_rate * days # 73,000,000
scd2_total_rows_after_year = customers + scd2_new_rows_per_year # 83,000,000
Executed: full daily snapshotting writes 3,650,000,000 rows in a year; SCD Type 2 writes 73,000,000 new rows in the same year, leaving the dimension at 83,000,000 total rows.
1−3,650,000,00083,000,000≈97.7%
That is a 97.7% reduction in rows written, which at roughly 250 bytes/row is the difference between about 913 GB written per year and about 21 GB stored after year one, a direct, quantified consequence of the SCD strategy on storage cost and compute spent maintaining the dimension. Now layer on the partitioning decision: if the fact table is partitioned by event date and a typical dashboard query looks at the last 7 days, that query scans
3657≈1.9%
of the year's partitions regardless of how large the SCD Type 2 dimension it joins to has grown, which is exactly why the schema choice (SCD2 keeps the dimension small relative to a full snapshot) and the platform choice (date partitioning keeps the fact-side scan small regardless of total history) have to be reasoned about together: either one alone leaves cost on the table that the other was supposed to remove.
flowchart LR
SRC[Source systems] -->|CDC streams| RAW[(Raw bronze storage tier)]
SRC -->|nightly batch| RAW
RAW --> XFORM[Transform: conform and apply SCD Type 2]
XFORM --> STAR[(Curated star schema: partitioned fact and dims)]
STAR --> COMPUTE{Elastic compute pool}
COMPUTE --> AGG[(Pre-aggregated materialized marts)]
AGG --> BI[BI dashboards, thousands of concurrent users]
STAR --> ADHOC[Ad-hoc analyst queries]
Trade-offs and pitfalls
The most common mistake at this scale is treating pre-aggregation as an afterthought bolted on once dashboards are already slow, rather than a first-class part of the design: retrofitting it later usually means a painful migration of every dashboard's queries. A second common mistake is choosing SCD Type 2 everywhere by default; dimensions where the business genuinely does not care about history (a lookup table of country codes, say) should stay Type 1, because every dimension carrying unnecessary history multiplies join cost across every fact table that references it. Finally, storage tiering only pays off if the partition key used for tiering is the same one the query engine can prune on: tiering by ingestion date while most queries filter by event date defeats both the cost savings and the pruning benefit at once.
You are architecting the warehouse for a multi-tenant SaaS analytics product with many tenants of wildly uneven size (a small number of large tenants generate most of the traffic and rows, most tenants are small). Compare three tenancy models as a SCHEMA-DESIGN decision: schema-per-tenant, a shared schema with a tenant_id column on every fact and dimension, and per-tenant table partitioning; then propose a matching partitioning/sharding strategy for the shared-schema option specifically to avoid one large tenant creating a hotspot. Recommend an approach and justify it on cost, tenant isolation, operability (backups, schema migrations), and query performance, including how each model affects joins across fact and dimension tables.
Sample Answer
Direct answer
For a warehouse with a small number of very large tenants and many small ones, a shared schema with a tenant_id column on every fact and dimension is usually the right default, because schema-per-tenant and database-per-tenant both multiply your operational burden (migrations, backups, monitoring) by the tenant count. The one addition the shared-schema model needs is a sharding strategy for the largest tenant specifically: hash the tenant's own row keys into sub-buckets so its data spreads across many partitions instead of dominating one, which is what actually prevents the hotspot a single tenant_id partition would otherwise create.
Structured elaboration
Compare the three models directly:
| Model | Cost | Isolation | Operability (backups, migrations) | Query performance | Cross-tenant joins |
|---|---|---|---|---|---|
| Schema-per-tenant | High: N schemas to provision, monitor, and scale, mostly idle for small tenants | Strong: a bug or runaway query in one tenant's schema cannot touch another's | Poor at scale: every schema migration and backup job runs N times | Good per-tenant, but cross-tenant analytics require federated queries across many schemas | Expensive; needs cross-schema query support |
Shared schema + tenant_id | Low: one schema, one set of tables, cost shared across all tenants | Weakest by default; needs row-level filtering (and ideally row-level security) enforced everywhere, including in every extract-transform-load (ETL) job | Best: one migration, one backup, one monitoring setup, regardless of tenant count | Good if partitioned/sharded correctly (see worked example); a naive version risks the large-tenant hotspot | Cheap; a plain filter or its absence |
| Table-partition-per-tenant (or per-tenant database) | Medium to high: partition/database count scales with tenant count, but within one engine's management surface | Strong, closer to schema-per-tenant | Medium: one logical schema to migrate, but partition/database provisioning still scales with tenant count | Good per-tenant if the engine prunes partitions well; large tenants still need their own internal sharding | Similar cost profile to schema-per-tenant |
Recommended approach and the matching partitioning/sharding strategy. Shared schema with tenant_id on every table wins on cost and operability, which dominate at 100k tenants where per-tenant provisioning of anything becomes its own maintenance job. To fix its weak point, the query-performance and hotspot risk from the skewed tenant, do not partition purely by tenant_id: for the dominant tenant, further hash its own primary or event key into a fixed number of sub-buckets (16, in the worked example below) so its rows spread across many partitions instead of piling into one. Small tenants do not need this treatment; a plain tenant_id partition is already small and well-isolated for them.
Isolation. Because the shared-schema model does not get isolation for free, enforce tenant scoping at the query layer (a mandatory tenant_id predicate that cannot be bypassed) or with native row-level security so a bug in one report cannot leak another tenant's rows, and treat any query missing that predicate as a defect, not a performance shortcut.
Operability: backups and schema migrations. One shared schema means one migration path and one backup/restore procedure regardless of tenant count, which is the model's biggest operability win over the other two; the corresponding risk is that a bad migration or a bad backup restore affects every tenant simultaneously, so the shared model raises the stakes of getting migrations right even as it lowers their frequency and cost.
Joins. In the shared-schema model, joining fact to dimension is a normal join with an extra tenant_id equality predicate on both sides, cheap and familiar. In schema-per-tenant or database-per-tenant, a per-tenant report joins normally within one tenant's schema, but any cross-tenant analytical join (an internal "which of our tenants behave like each other" analysis, for instance) has to reach across schema or database boundaries, which most engines make considerably more expensive or require moving the data into one place first.
Worked example
Simulate 100,000 rows where one tenant produces 90% of the traffic:
import duckdb
con = duckdb.connect()
con.execute('''
CREATE TABLE fact_orders AS
SELECT
CASE WHEN i < 90000 THEN 'tenant_A' ELSE 'tenant_' || (2 + (i % 199)) END AS tenant_id,
i AS order_id
FROM range(100000) t(i)
''')
Grouping by tenant_id alone puts 90,000 of the 100,000 rows in a single partition:
100,00090,000=90%
Now additionally hash-bucket only the dominant tenant into 16 sub-partitions:
SELECT *,
CASE WHEN tenant_id = 'tenant_A'
THEN tenant_id || '_shard' || (hash(order_id) % 16)
ELSE tenant_id
END AS partition_key
FROM fact_orders
Executed, the largest resulting partition holds 5,732 rows:
100,0005,732≈5.7%
That is the difference between one partition holding 90% of the table's traffic (a severe hotspot for both query concurrency and any partition-level maintenance job) and the largest partition holding under 6%, purely from adding a secondary hash key for the one tenant that needed it. Small tenants were left as plain tenant_id partitions because none of them are large enough to need sub-sharding.
Trade-offs and pitfalls
The most common mistake is applying uniform sharding to every tenant "for consistency," which needlessly fragments small tenants' already-small data across many tiny partitions and makes their queries and maintenance jobs slower, not faster; sub-sharding should be applied selectively, to the tenants whose size actually warrants it. The second common mistake is treating tenant_id filtering as a query-writing convention rather than an enforced constraint: the shared-schema model's entire isolation story depends on that predicate being present on every single query and every ETL job that touches the table, with no exceptions, for the life of the table.
Compare a traditional centralized data warehouse, where one platform team owns ingestion, modeling, and serving for the whole company, against a data mesh architecture, where each business domain owns and publishes its own analytical data as a product against company-wide interoperability standards. What specific problem is data mesh trying to solve that a well-run centralized warehouse does not already solve, what does an organization give up by adopting it, and when would you recommend against it?
Sample Answer
Direct answer
Data mesh is trying to solve an organizational bottleneck, not a technical one: in a centralized warehouse, one platform team becomes the sole gatekeeper for every domain's data, and as the company grows, that team cannot scale its domain knowledge or its throughput fast enough to keep every business unit unblocked. Data mesh fixes this by making each domain team responsible for publishing its own data as a well-defined, discoverable, quality-guaranteed "data product," coordinated only by shared interoperability standards rather than a single team's backlog. What you give up is exactly the thing centralization was good at: one team enforcing consistent modeling discipline and conformed dimensions everywhere, which a mesh instead has to achieve through governance and standards that are far easier to state than to actually enforce across many independent teams.
Structured elaboration
The problem data mesh solves. As a company adds domains (finance, marketing, logistics, each with deep, changing domain knowledge), a single centralized platform team increasingly becomes a queue: every new mart, every schema change, every new source integration waits on that one team's capacity, and that team's members are rarely domain experts in all the areas they are modeling data for. Data mesh addresses this by pushing ownership of the DATA out to the domain teams that already understand it best, while the platform team's job shifts to building and operating shared self-serve infrastructure (a common cataloging, access-control, and quality-testing layer) rather than owning every dataset itself.
What a well-run centralized warehouse already solves, and does not need mesh to fix. If an organization is small enough, or disciplined enough, that a single platform team can genuinely keep up with every domain's needs, a centralized warehouse's core advantage, one team enforcing conformed dimensions and one place to look for the "official" definition of a metric, is not a problem data mesh needs to solve, it is a benefit you would be trading away.
What you give up. Conformance discipline is the main casualty: in a centralized model, one team can simply refuse to publish a customer dimension that does not match the existing conformed one. In a mesh, each domain team owns and can independently evolve its own data product, so achieving the same cross-domain consistency requires the interoperability standards (naming conventions, shared identifiers, data contracts, quality SLAs) to be genuinely enforced, typically through automated checks in the shared platform rather than a single team's review, and that enforcement machinery is itself a significant, ongoing investment.
When to recommend against it. A small or early-stage company (the kind of organization discussed when deciding whether it needs a formal warehouse at all) does not have enough distinct domains or organizational scale for a mesh's coordination overhead to pay for itself; a single platform team can still serve everyone directly and faster than standing up domain teams and shared self-serve infrastructure would. A company without the engineering maturity to build and operate the shared interoperability platform a mesh depends on will end up with the worst of both worlds: decentralized ownership without the standards that were supposed to keep it consistent, which is functionally the four-un-conformed-dimensions governance failure, just organized around teams instead of ad-hoc mart builds.
Worked example
A company with one warehouse team serving five departments starts taking two weeks to review and approve every new mart request, and departments start building their own disconnected spreadsheets to route around the bottleneck, exactly the fragmentation a warehouse was meant to prevent in the first place. Moving to a mesh does not remove the need for a customer identifier every domain agrees on: it moves the enforcement of that agreement from "the one team reviews everything" to "the shared platform automatically validates every published data product against a data contract that specifies the agreed identifier, format, and quality checks," which only works if that contract-validation infrastructure actually gets built and maintained, not just proposed.
Trade-offs and pitfalls
The most common mistake is adopting the language of data mesh (domain ownership, data products) without building the shared self-serve platform underneath it, which produces decentralization with none of the standards enforcement that made the model viable in the literature; the result is usually worse consistency than the centralized warehouse it replaced. The second common mistake is treating this as an all-or-nothing choice: many organizations run a hybrid where a small number of genuinely cross-cutting dimensions (customer, date, product) stay centrally owned and conformed exactly as in a Kimball bus architecture, while domain-specific facts and less-shared dimensions are pushed out to domain ownership.
Compare three data warehouse design methodologies: Kimball (bottom-up bus architecture built around conformed dimensions shared across business-process-specific marts), Inmon (top-down: build a normalized enterprise data model first, then derive marts from it), and Data Vault (hub/link/satellite hybrid). For each, state the specific risk it is optimized to reduce, and describe a concrete organizational situation where you would recommend each one, including when a hybrid makes sense.
Sample Answer
Direct answer
Kimball, Inmon, and Data Vault are three different bets about where risk lives in a warehouse build. Kimball (bottom-up: build conformed dimensions and business-process-scoped fact tables directly, tied together by a "bus" of shared dimensions) optimizes for fast delivery of business intelligence (BI)-ready data. Inmon (top-down: model the whole enterprise in a normalized model first, then derive dependent data marts from it) optimizes for enterprise-wide consistency. Data Vault (hub, link, and satellite tables, insert-only) optimizes for auditability and the ability to onboard volatile source systems without redesigning the model every time a source changes.
Structured elaboration
Kimball: bus architecture. You start from a business process (orders, shipments, support tickets) and build a star schema for it directly: a fact table at a declared grain, surrounded by dimensions. Cross-process consistency comes from conformed dimensions: the same dim_customer and dim_date are reused, unchanged, across every mart, so a customer or a date means the same thing whether you are looking at the sales mart or the support mart. The risk this reduces is slow time-to-value: business users get a usable, understandable star schema for one process quickly, without waiting for a full enterprise model.
Inmon: top-down, corporate information factory. You start by modeling the enterprise's core entities and their relationships in a normalized (typically 3NF) model, independent of any single reporting need. Departmental data marts are then built as dependent, derived views on top of that single source of truth. The risk this reduces is inconsistency at enterprise scale: because every mart derives from the same normalized core, you cannot end up with two departments quietly defining "customer" or "active order" differently. The cost is a longer time to the first delivered report, because the enterprise model has to exist before a mart can be derived from it.
Data Vault: hub, link, satellite. A hub stores just a business key (hashed) and where it came from. A link stores a relationship between hubs (an order-to-customer relationship, say). A satellite stores the descriptive, time-variant attributes for a hub or link, and it is insert-only: a change never overwrites a row, it appends a new one with a later load timestamp. This buys you two things a dimensional model does not give you as directly: a full, source-system-faithful audit trail (nothing is ever lost or rewritten, which matters for regulators), and structural resilience to source-system churn (a new source system for the same business entity just adds new satellites and links, it does not force you to redesign an existing star schema). The cost is that a Data Vault is not BI-friendly by itself: you still build a business vault or a dimensional layer on top of it before an analyst can use it comfortably.
When to use each. If the dominant risk is "the business needs a dashboard this quarter and cannot wait for an enterprise model," lean Kimball. If the dominant risk is "five departments will each build their own definition of the same entity if we let them," lean Inmon. If the dominant risk is "our source systems change constantly and auditors need to see exactly what we received and when," lean Data Vault. In practice the most common real-world answer is a hybrid: use Data Vault as the raw, auditable integration layer that absorbs source-system churn, then build Kimball-style conformed dimensional marts on top of it for BI consumption. That combination gets you Data Vault's auditability and onboarding agility underneath, and Kimball's BI-readiness on top, at the cost of an extra transformation layer between raw and consumption.
Worked example
A payments company onboards a new regional processor every few months, each with a slightly different schema for the same underlying "transaction" concept, and its regulator requires it to reproduce exactly what was received from each processor at any past date. A pure Kimball build would mean re-touching the transaction fact table's extract-transform-load (ETL) pipeline every time a new processor's schema differs even slightly. A pure Inmon build would require the enterprise model to anticipate every future processor's fields before onboarding even one of them, which is not realistic for a fast-growing integration surface. The Data Vault answer: model hub_transaction and hub_processor, link them, and give each processor's raw fields their own satellite. Onboarding processor six adds a new satellite, not a schema migration on the existing fact table, and the insert-only history satisfies the regulator's reproducibility requirement directly. A conformed fact_transaction star schema is then built on top of the vault for the finance team's dashboards, so analysts never see hub/link/satellite tables directly.
Trade-offs and pitfalls
A common mistake is treating this as a purely technical choice; it is at least as much an organizational one. Inmon's enterprise model requires enterprise-wide agreement on entity definitions before anyone gets value, which stalls in organizations without the authority to enforce that agreement. Kimball's bus architecture requires genuine discipline about NOT letting a "just this once" un-conformed dimension leak into a mart, or you end up with the exact inconsistency Inmon was designed to prevent. Data Vault's insert-only satellites grow fast: without a defined retention or archiving policy, the raw vault becomes large purely from history that few queries ever touch, so a business vault or a materialized "current state" view over the vault is not optional in practice, it is what makes the vault usable at all.
Unlock Full Question Bank
Get access to all 10 Data Warehousing and Dimensional Modeling interview questions and detailed answers.
Sign in to ContinueJoin thousands of developers preparing for their dream job.