Designing Database Architecture

1. Choosing SQL vs NoSQL Databases

AspectSQLNoSQL
SchemaStrict, evolving via migrationsFlexible / schema-on-read
JoinsFirst-classDenormalized; app-side joins
ACIDDefaultOften BASE; some ACID (MongoDB 4+)
ScaleVertical + read replicas + shardingNative horizontal
ExamplesPostgres, MySQL, Spanner, CockroachMongo, Cassandra, DynamoDB, Redis

2. Understanding ACID Properties

PropertyMeaning
AtomicityAll operations succeed or none
ConsistencyConstraints / invariants preserved
IsolationConcurrent txns appear serial
DurabilityCommitted data survives crash (WAL fsync)

3. Understanding BASE Properties

PropertyMeaning
Basically AvailableSystem responds even if stale
Soft stateState may change without input (replication)
Eventual consistencyReplicas converge given no new writes

4. Designing Database Replication

TopologyDescriptionUse Case
Single-leaderOne primary writes; followers readMost OLTP
Multi-leaderWrites accepted at multiple sitesMulti-region writes
Leaderless (quorum)Any node accepts; R+W > NCassandra, Dynamo
Sync modeStrong consistency; high write latencyBanking
Async modeLow latency; risk of data loss on failoverRead replicas

5. Implementing Database Sharding

StepAction
Pick shard keyHigh cardinality, even distribution
Hash functionConsistent hash recommended
RoutingSmart client or proxy (Vitess, Citus)
Cross-shard queriesScatter-gather + aggregate
ReshardingOnline split/merge with double-write

6. Implementing Database Partitioning

TypePostgres SyntaxUse
RangePARTITION BY RANGE(date)Time-series
ListPARTITION BY LIST(region)Categorical
HashPARTITION BY HASH(id)Even distribution
CompositeRange subpartitioned by hashTime + tenant

Example: Time-range partition (Postgres)

CREATE TABLE events (id bigserial, ts timestamptz NOT NULL, payload jsonb)
  PARTITION BY RANGE (ts);
CREATE TABLE events_2026_01 PARTITION OF events
  FOR VALUES FROM ('2026-01-01') TO ('2026-02-01');
CREATE INDEX ON events_2026_01 (ts);

7. Implementing Read Replicas

AspectDetail
Replication lagMonitor; route critical reads to primary
RoutingDriver-level (RW vs RO endpoints)
Cascading replicasReduce primary load
FailoverPromote replica via Patroni/RDS

8. Designing Read-Write Splitting

LayerApproach
ApplicationTwo datasources; route by op
Driver / ORM@Transactional(readOnly=true) → replica
ProxyProxySQL, MaxScale parse SQL
Read-after-writePin to primary for N seconds after write

9. Designing for Time-Series Data

DBStrength
TimescaleDBPostgres extension, hypertables
InfluxDBNative TSDB, Flux query
PrometheusPull-based metrics, PromQL
ClickHouseColumnar, MergeTree, very fast aggregation
PatternsTime-bucketed partitions, downsampling, retention policies

10. Designing Database Backup and Recovery

TypeFrequencyRPO/RTO
Full snapshotDailyRPO 24h
IncrementalHourlyRPO 1h
WAL/binlog archiveContinuousRPO seconds (PITR)
Cross-region copyAsyncDR readiness
Warning: Untested backups are not backups. Run quarterly restore drills and verify integrity (checksums, sample queries).

11. Designing Database High Availability

PatternTool
Streaming replication + failoverPatroni, Pacemaker, RDS Multi-AZ
Synchronous replicasQuorum commit (Postgres)
Group replicationMySQL Group Replication, Galera
Distributed SQLSpanner, CockroachDB, Yugabyte

12. Designing Multi-Region Database Architecture

TopologyTrade-off
Primary in one region + async replicasSimple; cross-region reads stale; RPO > 0 on failover
Active-active with conflict resolutionMulti-region writes; LWW or CRDT
Geo-partitioned (Spanner)Data lives near users; strong consistency
Read-local, write-globalReads fast; writes go to home region