← Netflix Interview Insights

Netflix·Software Engineer·Onsite - System Design / Architecture·Senior

Senior
May 2026

Summary

Netflix system design round focused entirely on data modeling for an advertiser intake system. Dense question, lots of moving parts, and I felt like I was playing catch-up the whole time.

Questions Asked (6)

Q1

Design the data model for an advertiser intake system. Define the core entities like organization, account, user seats, campaigns, ad groups, creatives, budgets, targeting, frequency caps, billing, and approvals. Walk through ERD-level tables with primary and foreign keys.

Data ModelingSystem Design
Author's notes

I started with org and account and felt okay, but the moment they asked me to wire in frequency cap policy as its own entity I kind of froze.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the scope and key requirements of the advertiser intake system, then identify the core entities and their relationships. Propose an ERD-level schema with tables, primary keys, and foreign keys, and explain how the design supports scalability, data integrity, and business workflows.

Pro tip: Emphasize normalization to reduce redundancy, but also discuss strategic denormalization for performance-critical queries, showing you understand trade-offs in real-world systems.

1. Clarify Requirements and Scope

Ask questions to understand the system's purpose, scale, and key workflows (e.g., how advertisers onboard, how campaigns are managed). This ensures your design meets actual needs.

2. Identify Core Entities and Relationships

List the main entities (Organization, Account, User, Campaign, AdGroup, Creative, Budget, Targeting, FrequencyCap, Billing, Approval) and define their relationships (one-to-many, many-to-many).

3. Design Tables with Keys and Attributes

For each entity, specify the table structure: primary key, foreign keys, and essential attributes. Ensure referential integrity and appropriate data types.

4. Address Special Considerations

Discuss how to handle hierarchical relationships (e.g., Organization to Account), many-to-many relationships (e.g., Campaign to Targeting), and audit trails for approvals.

5. Review and Optimize

Summarize the design, highlighting scalability, performance (indexes), and flexibility for future changes. Mention any trade-offs made.

Key Points to Mention

  • Primary and foreign keys for each table to ensure data integrity and relationships.
  • Normalization to reduce redundancy, with strategic denormalization for performance.
  • Indexing strategy on foreign keys and frequently queried columns.
  • Handling many-to-many relationships with junction tables (e.g., CampaignTargeting).
  • Audit fields (created_at, updated_at) and soft deletes for data retention.
  • Scalability considerations: partitioning large tables (e.g., Creatives) and using UUIDs for distributed systems.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q2

How would you approach normalization versus denormalization trade-offs in this schema, and how does that decision change under multi-tenancy with row-level security requirements?

Data ModelingTechnical Trade-offs
Author's notes

Talked through keeping targeting rules normalized to avoid duplication across campaigns, but then they pushed on query performance and I started hedging.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the schema's access patterns and performance goals, then explain how normalization reduces redundancy and anomalies while denormalization improves read performance. Discuss how multi-tenancy with row-level security (RLS) adds constraints like tenant isolation and query filtering, which can shift the trade-off toward denormalization for read-heavy, tenant-scoped queries, but requires careful handling of data duplication and security.

Pro tip: Emphasize that RLS predicates can act as implicit filters that benefit from denormalized structures like covering indexes or materialized views per tenant, but warn against over-denormalizing because it complicates tenant data deletion and increases storage costs. Mention that Netflix often uses a polyglot persistence approach, so the decision may vary by service.

1. Clarify requirements and access patterns

Identify the main queries, read/write ratios, latency SLAs, and tenant isolation needs. Ask if the schema is for OLTP, analytics, or both.

2. Evaluate normalization benefits and costs

Discuss how normalization reduces data redundancy, ensures consistency, and simplifies updates, but may require complex joins that hurt read performance.

3. Evaluate denormalization benefits and costs

Explain how denormalization can speed up reads by pre-joining data, but increases storage, risks inconsistency, and complicates writes and tenant data management.

4. Incorporate multi-tenancy and RLS constraints

Analyze how RLS adds a tenant filter to every query, which can make denormalized structures (e.g., tenant-specific materialized views) more attractive, but also requires that all copies include tenant_id and are secured.

5. Propose a balanced solution and trade-off rationale

Recommend a hybrid approach: normalize core entities, denormalize for specific high-read, tenant-scoped use cases, and use RLS-aware indexing or partitioning. Justify with expected performance gains and operational costs.

Key Points to Mention

  • Normalization reduces anomalies and storage but can lead to join-heavy queries that degrade read performance, especially under RLS where filters are applied per row.
  • Denormalization improves read performance by reducing joins, but increases storage, write complexity, and risk of data inconsistency; with multi-tenancy, it also requires duplicating tenant_id and ensuring RLS policies apply to all copies.
  • Row-level security (RLS) enforces tenant isolation at the database level, adding a predicate to every query; this can make denormalized, tenant-scoped tables or materialized views more efficient if indexed on tenant_id.
  • Multi-tenancy introduces challenges like noisy neighbors, data skew, and per-tenant backup/restore; denormalization can help isolate hot tenants but may complicate global schema changes.
  • Consider hybrid approaches: normalize for write-heavy, transactional data; denormalize for read-heavy, analytical, or reporting workloads, possibly using materialized views or caching layers.
  • Netflix's scale and polyglot persistence mean the decision should be service-specific, balancing consistency, latency, and operational overhead; mention examples like using denormalized views in Cassandra for high-throughput reads.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q3

How would your schema handle configuration versioning and auditability, particularly for entities that change over time like targeting rules or budget flights?

Data ModelingSystem Design
Author's notes

Went straight to an event log table and a versioned config pattern.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying that versioning and auditability are first-class concerns in a mutable configuration system, then propose an append-only, immutable versioned schema with effective timestamps and actor tracking. Walk through how entities like targeting rules and budget flights are represented as versioned records, and explain how reads resolve to the correct version at a point in time.

Pro tip: Emphasize that auditability is not just logging—it's a queryable, immutable history that supports rollbacks and compliance. Mention that you'd design the schema to make the common case (reading current config) fast while keeping the audit trail cheap to store and query.

1. Clarify requirements and constraints

Ask about read/write patterns, latency requirements, retention policies, and whether point-in-time queries or rollbacks are needed. This shows you don't over-engineer and tailor the schema to real needs.

2. Design an append-only versioned entity model

Propose that each configurable entity (e.g., targeting rule, budget flight) has a stable ID and a series of immutable versions, each with a version number, effective timestamp, and status (draft/active/archived).

3. Add audit metadata and change tracking

Include fields like created_by, created_at, change_reason, and a reference to the previous version. Optionally, store a diff or full snapshot to balance storage and query efficiency.

4. Define read and write paths

Explain how writes create new versions without mutating existing ones, and how reads resolve the correct version based on time or explicit version. Mention indexing strategies for fast current-version lookups.

5. Address rollback, retention, and compliance

Describe how to roll back by activating a previous version, how to archive old versions, and how to enforce immutability for audit purposes. Mention any regulatory or internal policy considerations.

Key Points to Mention

  • Immutable, append-only versioning with effective timestamps to support point-in-time queries.
  • Audit fields: who changed what, when, and why (actor, timestamp, reason, previous version reference).
  • Separation of current-state read model (e.g., a materialized view or cache) from the full version history for performance.
  • Version resolution logic: how to determine the active version for a given time or context.
  • Rollback and revert mechanisms that create new versions rather than deleting history.
  • Retention and archival policies to manage storage costs while meeting compliance requirements.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q4

How would you implement soft deletes in this schema, and what complications does that introduce for unique constraints and foreign key integrity?

Data ModelingTechnical Trade-offs
Author's notes

Classic question but the FK integrity angle is where people slip up.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by defining soft deletes as adding a deleted_at timestamp column and filtering queries to exclude deleted rows. Then explain how this breaks unique constraints (e.g., duplicate active rows) and foreign key integrity (e.g., references to deleted rows), and propose solutions like partial unique indexes and ON DELETE SET NULL or application-level checks. Emphasize trade-offs between data retention, query complexity, and performance.

Pro tip: Mention that soft deletes can be implemented with a deleted_at column and partial indexes, but be aware that they complicate cascading deletes and can lead to orphaned records if not handled carefully. Also, consider using a separate archive table for compliance and performance.

1. Define soft delete mechanism

Add a nullable deleted_at timestamp column to relevant tables. Queries must filter out rows where deleted_at is not null, either via views or application logic.

2. Address unique constraint complications

Unique constraints on columns like email will fail if a deleted row exists with the same value. Use partial unique indexes (e.g., CREATE UNIQUE INDEX ... WHERE deleted_at IS NULL) to enforce uniqueness only among active rows.

3. Handle foreign key integrity

Foreign keys referencing soft-deleted rows can cause issues: either allow references to deleted rows (and handle in application), or use ON DELETE SET NULL/CASCADE. Alternatively, implement triggers to enforce referential integrity based on deleted_at.

4. Discuss trade-offs and alternatives

Soft deletes increase storage and query complexity, and can degrade performance without proper indexing. Consider archiving to a separate table or using event sourcing for auditability.

Key Points to Mention

  • Partial unique indexes to enforce uniqueness only on active records
  • Foreign key constraints with ON DELETE actions or application-level checks
  • Query filtering overhead and need for consistent filtering across all queries
  • Performance impact of additional column and indexes on large tables
  • Alternatives like archive tables or event sourcing for audit and retention
  • Complications with cascading deletes and orphaned records

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q5

How would you design the schema to support idempotent imports, for example when an advertiser submits the same intake form twice or a bulk upload is retried?

Data ModelingAPI & Integrations
Author's notes

I blanked for a second and said deduplication key on the import job table.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by defining idempotency in the context of imports: the same logical submission should result in the same stored state, regardless of retries. Then propose a schema that includes a client-generated idempotency key (or content hash) with a unique constraint, and describe how to handle conflicts gracefully. Finally, discuss how this scales for bulk uploads and how to manage partial failures.

Pro tip: Mention that idempotency keys should be scoped to the advertiser and operation, and that you'd store the key with a TTL or archive old keys to avoid unbounded growth. Also, highlight the importance of logging and monitoring duplicate attempts to detect client bugs.

1. Clarify requirements and scope

Ask clarifying questions: What defines a duplicate? Is it the entire form or specific fields? What's the expected volume and retry behavior? This ensures you design for the right granularity.

2. Choose an idempotency key strategy

Decide between client-generated keys (e.g., UUID) or server-generated content hashes. Client keys are more reliable for retries; content hashes work when clients can't change. Explain trade-offs.

3. Design the schema with uniqueness constraints

Add a column for the idempotency key and create a unique index, possibly composite with advertiser_id and operation_type. This enforces idempotency at the database level.

4. Handle conflicts and retries

On duplicate key violation, return the existing record (or a success response) instead of erroring. For bulk uploads, process in batches and track per-item status to allow partial success.

5. Address scalability and maintenance

Discuss partitioning or archiving old idempotency keys to prevent table bloat. Consider using a separate table for idempotency records with TTL, and ensure the design supports high throughput.

Key Points to Mention

  • Idempotency key: client-generated UUID or server-side hash of request payload
  • Unique constraint on (advertiser_id, idempotency_key) to prevent duplicates
  • Handling duplicate key errors by returning the original response (e.g., 200 OK with existing resource)
  • For bulk uploads: batch processing with per-item idempotency keys and status tracking
  • TTL or archival strategy for idempotency records to manage storage growth
  • Logging and metrics for duplicate attempts to detect client-side issues

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q6

How does your schema design support validation rules and partial onboarding, where an advertiser might submit incomplete data across multiple sessions?

Data ModelingProduct Sense & Ideation
Author's notes

Framed it as a draft state on each entity with a completeness score computed from required fields.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by framing the problem as a state machine for onboarding, where each session can advance the advertiser's progress. Then describe how your schema separates draft data from validated data, using nullable fields, versioning, and validation rules that can be applied incrementally. Emphasize how this design supports partial submissions without compromising data integrity.

Pro tip: Show awareness of the trade-off between strict schema validation and flexibility for partial data—mention techniques like JSON Schema with optional fields or a staging table, and how you'd handle validation errors gracefully to guide the user.

1. Define the onboarding state model

Explain that onboarding is a multi-step process with states like 'incomplete', 'pending validation', and 'complete'. This helps clarify how data is collected and validated over time.

2. Design schema for partial data

Describe how you allow nullable fields or use a separate draft table to store incomplete submissions. Mention that you avoid enforcing all constraints upfront to support incremental data entry.

3. Implement validation rules

Detail how validation is applied conditionally—e.g., only validate fields that are present, or use a rules engine that checks completeness and correctness at each step. Mention error handling and feedback to the user.

4. Handle session persistence and merging

Explain how you persist partial data across sessions, perhaps using a session ID or user ID, and how you merge new data with existing drafts without overwriting valid entries.

5. Ensure data integrity and final validation

Describe how you perform a final validation before promoting the draft to a complete, active advertiser record, ensuring all required fields are present and valid.

Key Points to Mention

  • State machine or workflow for onboarding stages
  • Nullable fields or separate draft/staging tables
  • Incremental validation with clear error messages
  • Session management and data merging strategies
  • Versioning or audit trail for changes
  • Final validation and promotion to production data

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.