Skip to main content

Architecture and Design Decisions

đŸ—ī¸ 18. Architecture & Design Decisions​

159. When would you choose NoSQL over SQL database?​

NoSQL āĻāĻŦāĻ‚ SQL āĻāϰ āĻŽāĻ§ā§āϝ⧇ āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰāĻž āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻĄāĻŋāϜāĻžāχāύ⧇āϰ āĻ…āĻ¨ā§āϝāϤāĻŽ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āϏāĻŋāĻĻā§āϧāĻžāĻ¨ā§āϤāĨ¤ āφāĻĒāύāĻŋ āϤāĻ–āύ NoSQL āĻŦ⧇āϛ⧇ āύ⧇āĻŦ⧇āύ āϝāĻ–āύ āφāĻĒāύāĻžāϰ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡ āĻĒā§āϰāĻĨāĻžāĻ—āϤ āϰāĻŋāϞ⧇āĻļāύāĻžāϞ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇āϰ (SQL) āϏ⧀āĻŽāĻžāϰ⧇āĻ–āĻž āĻĒāĻžāϰ āĻšāϝāĻŧ⧇ āϝāĻžāĻ“āϝāĻŧāĻžāϰ āωāĻĒāĻ•ā§āϰāĻŽ āĻšāϝāĻŧāĨ¤

Specific use cases for each type:

  • SQL (RDBMS): āĻŦā§āϝāĻžāĻ‚āĻ•āĻŋāĻ‚, āχ-āĻ•āĻŽāĻžāĻ°ā§āϏ āĻĒ⧇āĻŽā§‡āĻ¨ā§āϟ, āχāύāϭ⧇āĻ¨ā§āϟāϰāĻŋ, āĻāĻ•āĻžāωāĻ¨ā§āϟāĻŋāĻ‚â€”āϝ⧇āĻ–āĻžāύ⧇ ACID (Atomicity, Consistency, Isolation, Durability) āĻāĻŦāĻ‚ āϰāĻŋāϞ⧇āĻļāύāĻžāϞ āĻĄā§‡āϟāĻž (āϞāĻ• āĻ“ āϜāϝāĻŧ⧇āύ) āĻŽāĻžāĻ¸ā§āϟāĨ¤
  • NoSQL (Document/Key-Value/Graph):
    • High Write Velocity: āφāχāĻ“āϟāĻŋ (IoT), āϏ⧇āĻ¨ā§āϏāϰ āĻĄā§‡āϟāĻž āĻŦāĻž āϰāĻŋāϝāĻŧ⧇āϞ-āϟāĻžāχāĻŽ āϞāĻ—āϏ (Cassandra āĻŦāĻž Time-Series Database)āĨ¤
    • Flexible Schema: āĻ•āĻ¨ā§āĻŸā§‡āĻ¨ā§āϟ āĻŽā§āϝāĻžāύ⧇āϜāĻŽā§‡āĻ¨ā§āϟ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ (CMS), āĻ•ā§āϝāĻžāϟāĻžāϞāĻ—, āϝ⧇āĻ–āĻžāύ⧇ āĻĒā§āϰāϤāĻŋ āφāχāĻŸā§‡āĻŽā§‡āϰ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ āφāϞāĻžāĻĻāĻž (MongoDB)āĨ¤
    • Graph Relationships: āϏ⧋āĻļā§āϝāĻžāϞ āĻŽāĻŋāĻĄāĻŋāϝāĻŧāĻž āĻĢā§āϰ⧇āĻ¨ā§āĻĄāϏ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ•, āĻĢā§āϰāĻĄ āĻĄāĻŋāĻŸā§‡āĻ•āĻļāύ (Neo4j)āĨ¤
    • High Read/Cache: āϏ⧇āĻļāύ āĻŸā§‹āϕ⧇āύ, āϞāĻŋāĻĄāĻžāϰāĻŦā§‹āĻ°ā§āĻĄ (Redis, Memcached)āĨ¤

Can you give examples of wrong choices?​

  • āϭ⧁āϞ āĻĒāĻ›āĻ¨ā§āĻĻ ā§§: āĻāĻ•āϟāĻŋ āϏ⧋āĻļā§āϝāĻžāϞ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āϕ⧇āϰ users, posts, comments, āĻāĻŦāĻ‚ likes āĻŸā§āĻ°ā§āϝāĻžāĻ•āĻŋāĻ‚ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ MySQL āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻāĻŦāĻ‚ āĻĒā§āϰāϤāĻŋāĻĻāĻŋāύ ā§Ģ-ā§ŦāϟāĻŋ āĻŸā§‡āĻŦāĻŋāϞ⧇ āĻ•āĻŽāĻĒā§āϞ⧇āĻ•ā§āϏ JOIN āĻ•āϰāĻžāĨ¤ āĻāϤ⧇ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āϖ⧁āĻŦ āĻĻā§āϰ⧁āϤ āĻ•ā§āĻ°ā§āϝāĻžāĻļ āĻ•āϰāĻŦ⧇āĨ¤
  • āϭ⧁āϞ āĻĒāĻ›āĻ¨ā§āĻĻ ā§¨: āĻāĻ•āϟāĻŋ āĻŦā§āϝāĻžāĻ‚āĻ•āĻŋāĻ‚ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ⧇āϰ āϟāĻžāĻ•āĻž āĻŸā§āϰāĻžāĻ¨ā§āϏāĻĢāĻžāϰ⧇āϰ āϕ⧋āϰ āϞāϜāĻŋāĻ• MongoDB āϤ⧇ āϰāĻžāĻ–āĻžāĨ¤ MongoDB āĻāϭ⧇āύāϚ⧁āϝāĻŧāĻžāϞ āĻ•āύāϏāĻŋāĻ¸ā§āĻŸā§‡āĻ¨ā§āϏāĻŋ āĻ“ āĻĄā§‡āύāĻ°ā§āĻŽāĻžāϞāĻžāχāĻœā§‡āĻļāύ⧇āϰ āĻ“āĻĒāϰ āĻŦ⧇āĻļāĻŋ āĻĢā§‹āĻ•āĻžāϏāĻĄ, āϤāĻžāχ āĻšāĻ āĻžā§Ž āĻĢ⧇āχāϞāĻ“āĻ­āĻžāϰ⧇āϰ āĻ•āĻžāϰāϪ⧇ āĻŸā§āϰāĻžāύāĻœā§‡āĻ•āĻļāύ⧇ āĻ—āĻĄāĻŧāĻŽāĻŋāϞ (Double Spending) āĻšāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

How do you handle transactions in NoSQL?​

āϝāĻĻāĻŋāĻ“ NoSQL āϏāĻžāϧāĻžāϰāĻŖāϤ āϜāϝāĻŧ⧇āύ āĻŦāĻž āĻŽāĻžāĻ˛ā§āϟāĻŋ-āĻŸā§‡āĻŦāĻŋāϞ āĻŸā§āϰāĻžāύāĻœā§‡āĻ•āĻļāύ āϏāĻžāĻĒā§‹āĻ°ā§āϟ āĻ•āϰ⧇ āύāĻž, āϤāĻžāϰāĻĒāϰāĻ“ āĻŸā§āϰāĻžāύāĻœā§‡āĻ•āĻļāύ āĻšā§āϝāĻžāĻ¨ā§āĻĄā§‡āϞ āĻ•āϰāĻžāϰ āĻ•āĻŋāϛ⧁ āωāĻĒāĻžāϝāĻŧ āφāϛ⧇:

  1. Single-Document Atomicity: MongoDB-āϤ⧇ āĻāĻ•āϟāĻŋ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āĻŸā§‡āϰ āĻ“āĻĒāϰ āϰāĻžāχāϟ āĻ…āĻĒāĻžāϰ⧇āĻļāύ āĻ…ā§āϝāĻžāϟāĻŽāĻŋāĻ•āĨ¤ āϤāĻžāχ āϰāĻŋāϞ⧇āĻŸā§‡āĻĄ āϏāĻŦ āĻĄā§‡āϟāĻž (āϝ⧇āĻŽāύ: āĻ…āĻ°ā§āĻĄāĻžāϰ āĻāĻŦāĻ‚ āĻ…āĻ°ā§āĻĄāĻžāϰ⧇āϰ āφāχāĻŸā§‡āĻŽāϗ⧁āϞ⧋) āĻāĻ•āϟāĻŋ āϏāĻŋāĻ™ā§āϗ⧇āϞ JSON āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āĻŸā§‡āϰ āϭ⧇āϤāϰ⧇ Embed āĻ•āϰ⧇ āϰāĻžāĻ–āϞ⧇ āϤāĻž 100% āĻ…ā§āϝāĻžāϟāĻŽāĻŋāĻ• āĻšāϝāĻŧāĨ¤
  2. Two-Phase Commit (2PC) / Saga Pattern: āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϞ⧇āϭ⧇āϞ⧇ āϕ⧋āĻĄ āϞāĻŋāϖ⧇ āĻāĻ•āĻžāϧāĻŋāĻ• āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āĻŸā§‡ āφāĻĒāĻĄā§‡āϟ āϚāĻžāϞāĻžāύ⧋ āĻāĻŦāĻ‚ āϕ⧋āύ⧋ āĻāĻ•āϟāĻŋ āĻĢ⧇āχāϞ āĻ•āϰāϞ⧇ āĻ•āĻŽā§āĻĒ⧇āύāϏ⧇āϟāĻŋāĻ‚ (Compensating) āϕ⧋āĻĄ āϞāĻŋāϖ⧇ āφāϗ⧇āϰāϗ⧁āϞ⧋ āϰ⧋āϞāĻŦā§āϝāĻžāĻ• āĻ•āϰāĻž (Two-phase commit)āĨ¤

160. Microservices: shared database vs database per service?​

āĻŽāĻžāχāĻ•ā§āϰ⧋āϏāĻžāĻ°ā§āĻ­āĻŋāϏ⧇āϰ āĻĻ⧁āύāĻŋāϝāĻŧāĻžāϝāĻŧ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻĄāĻŋāϜāĻžāχāύ āĻāĻ•āϟāĻŋ āĻ•ā§āϞāĻžāϏāĻŋāĻ• āĻĄāĻŋāϞ⧇āĻŽāĻžāĨ¤

Trade-offs of each approach?​

ā§§. Shared Database (āϏāĻŦ āϏāĻžāĻ°ā§āĻ­āĻŋāϏ⧇āϰ āϜāĻ¨ā§āϝ ā§§āϟāĻŋ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ):

  • āϏ⧁āĻŦāĻŋāϧāĻž: āĻĄā§‡āϭ⧇āϞāĻĒ āĻ•āϰāĻž āϖ⧁āĻŦ āϏāĻšāϜāĨ¤ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āϏāĻžāϧāĻžāϰāĻŖ JOIN āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϏāĻšāĻœā§‡āχ āϏāĻŦ āĻĄā§‡āϟāĻž āφāύāĻž āϝāĻžāϝāĻŧāĨ¤ āĻŸā§āϰāĻžāύāĻœā§‡āĻ•āĻļāύ (ACID) āĻŽā§‡āχāύāĻŸā§‡āχāύ āĻ•āϰāĻž āϏāĻšāϜāĨ¤
  • āĻ…āϏ⧁āĻŦāĻŋāϧāĻž: āĻāϟāĻŋ āĻŽāĻžāχāĻ•ā§āϰ⧋āϏāĻžāĻ°ā§āĻ­āĻŋāϏ⧇āϰ āĻŽā§‚āϞ āύ⧀āϤāĻŋ (Coupling)-āĻāϰ āĻĒāϰāĻŋāĻĒāĻ¨ā§āĻĨā§€āĨ¤ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻ•ā§āĻ°ā§āϝāĻžāĻļ āĻ•āϰāϞ⧇ āĻĒ⧁āϰ⧋ āϕ⧋āĻŽā§āĻĒāĻžāύāĻŋ āĻĄāĻžāωāύ āĻšāϝāĻŧ⧇ āϝāĻžāĻŦ⧇ (Single Point of Failure)āĨ¤ āĻāĻ•āϟāĻŋ āϟāĻŋāĻŽā§‡āϰ āĻ¸ā§āĻ•āĻŋāĻŽāĻž āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ…āĻ¨ā§āϝ āϟāĻŋāĻŽāϕ⧇ āĻ­āĻžāĻ™āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

⧍. Database-per-service (āĻĒā§āϰāϤāĻŋāϟāĻŋ āϏāĻžāĻ°ā§āĻ­āĻŋāϏ⧇āϰ āφāϞāĻžāĻĻāĻž āĻĄāĻžāϟāĻžāĻŦ⧇āϏ):

  • āϏ⧁āĻŦāĻŋāϧāĻž: āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻĄāĻŋāĻ•āĻžāĻĒāϞāĻĄ (Decoupled)āĨ¤ User Service āϚāĻžāχāϞ⧇ MySQL āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇, āφāϰ Search Service āϚāĻžāχāϞ⧇ Elasticsearch āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ (Right tool for the right job)āĨ¤ āĻāĻ• āϏāĻžāĻ°ā§āĻ­āĻŋāϏ⧇ āϏāĻŽāĻ¸ā§āϝāĻž āĻšāϞ⧇ āĻ…āĻ¨ā§āϝ āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āϚāϞāϤ⧇ āĻĨāĻžāϕ⧇āĨ¤
  • āĻ…āϏ⧁āĻŦāĻŋāϧāĻž: āĻĻ⧁āϟāĻŋ āĻ­āĻŋāĻ¨ā§āύ āϏāĻžāĻ°ā§āĻ­āĻŋāϏ⧇āϰ āĻĄā§‡āϟāĻž (āϝ⧇āĻŽāύ: Order History āĻāĻŦāĻ‚ User details) āĻāĻ•āϏāĻžāĻĨ⧇ āĻĻ⧇āĻ–āĻžāϰ āϜāĻ¨ā§āϝ JOIN āĻ•āϰāĻž āϝāĻžāϝāĻŧ āύāĻžāĨ¤ API āĻŦāĻž āχāϭ⧇āĻ¨ā§āĻŸā§‡āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻĄā§‡āϟāĻž āϝ⧋āĻ—āĻžāĻĄāĻŧ āĻ•āϰāϤ⧇ āĻšāϝāĻŧ, āϝāĻž āĻŦ⧇āĻļ āϜāϟāĻŋāϞ āĻ“ āĻ¸ā§āϞ⧋āĨ¤

How do you handle cross-service transactions?​

āϧāϰāĻž āϝāĻžāĻ•, āχ-āĻ•āĻŽāĻžāĻ°ā§āϏ⧇ Order Service āĻ āĻ…āĻ°ā§āĻĄāĻžāϰ āĻšāϞ⧋, āĻāϰāĻĒāϰ Inventory Service āĻĨ⧇āϕ⧇ āĻĒā§āϰ⧋āĻĄāĻžāĻ•ā§āϟ āĻŽāĻžāχāύāĻžāϏ āĻšāϤ⧇ āĻšāĻŦ⧇āĨ¤ āϝ⧇āĻšā§‡āϤ⧁ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻ­āĻŋāĻ¨ā§āύ, āϤāĻžāχ āϏāĻžāϧāĻžāϰāĻŖ āĻŸā§āϰāĻžāύāĻœā§‡āĻ•āĻļāύ (SQL COMMIT) āĻāĻ–āĻžāύ⧇ āĻ•āĻžāϜ āĻ•āϰāĻŦ⧇ āύāĻžāĨ¤

  • āϏāĻŽāĻžāϧāĻžāύ - Saga Pattern:
    1. Order Service āĻ…āĻ°ā§āĻĄāĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰ⧇ Pending āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āĻĻāĻŋāϝāĻŧ⧇ Kafka āϤ⧇ āχāϭ⧇āĻ¨ā§āϟ āĻĒāĻžāĻ āĻžāϝāĻŧāĨ¤
    2. Inventory Service āϤāĻž āĻļ⧁āύ⧇ āχāύāϭ⧇āĻ¨ā§āϟāϰāĻŋ āĻ•āĻŽāĻžāϝāĻŧ āĻāĻŦāĻ‚ Success āχāϭ⧇āĻ¨ā§āϟ āĻĒāĻžāĻ āĻžāϝāĻŧāĨ¤
    3. Order Service āϰ⧇āϏāĻĒāĻ¨ā§āϏ āĻĒ⧇āϝāĻŧ⧇ āĻ…āĻ°ā§āĻĄāĻžāϰ Confirmed āĻ•āϰ⧇āĨ¤
    • āϝāĻĻāĻŋ āχāύāϭ⧇āĻ¨ā§āϟāϰāĻŋ āύāĻž āĻĨāĻžāϕ⧇, āϏ⧇ Failed āχāϭ⧇āĻ¨ā§āϟ āĻĒāĻžāĻ āĻžāϝāĻŧ āĻāĻŦāĻ‚ Order Service āϤāĻ–āύ āĻ…āĻ°ā§āĻĄāĻžāϰāϟāĻŋāϕ⧇ āĻ•āĻŽā§āĻĒ⧇āύāϏ⧇āϟ āĻ•āϰ⧇ Cancelled āĻ•āϰ⧇ āĻĻ⧇āϝāĻŧ (āϝāĻžāϕ⧇ Compensating Transaction āĻŦāϞ⧇)āĨ¤

161. How do you handle soft deletes vs hard deletes?​

Soft Delete āĻŽāĻžāύ⧇ āĻšāϞ⧋ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻĨ⧇āϕ⧇ āĻĄā§‡āϟāĻž āĻŽā§āϛ⧇ āύāĻž āĻĢ⧇āϞ⧇ āĻāĻ•āϟāĻŋ āĻĢā§āĻ˛ā§āϝāĻžāĻ— (is_deleted=true āĻŦāĻž deleted_at=timestamp) āϏ⧇āϟ āĻ•āϰ⧇ āĻĄā§‡āϟāĻž āĻšāĻžāχāĻĄ āĻ•āϰ⧇ āϰāĻžāĻ–āĻžāĨ¤ āφāϰ Hard Delete āĻŽāĻžāύ⧇ āĻšāϞ⧋ DELETE FROM āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āϚāĻžāϞāĻŋāϝāĻŧ⧇ āĻšāĻžāĻ°ā§āĻĄāĻĄāĻŋāĻ¸ā§āĻ• āĻĨ⧇āϕ⧇ āϚāĻŋāϰāϤāϰ⧇ āĻĄā§‡āϟāĻž āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻžāĨ¤

Which is better for auditing requirements?​

  • āĻ…āĻĄāĻŋāϟāĻŋāĻ‚ āĻāĻŦāĻ‚ āĻšāĻŋāĻ¸ā§āĻŸā§āϰāĻŋ āĻŸā§āĻ°ā§āϝāĻžāĻ•āĻŋāĻ‚āϝāĻŧ⧇āϰ āϜāĻ¨ā§āϝ Soft Delete āχ āĻŦ⧇āĻ¸ā§āϟāĨ¤ āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻŦā§‹āĻāĻž āϝāĻžāϝāĻŧ āĻ•āĻ–āύ āĻĄā§‡āϟāĻžāϟāĻŋ āĻĄāĻŋāϞāĻŋāϟ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ āĻāĻŦāĻ‚ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧇ "Undo / Recover" āĻ•āϰāĻž āϏāĻŽā§āĻ­āĻŦ āĻšāϝāĻŧāĨ¤
  • āĻŦā§āϝāĻžāĻ‚āĻ•āĻŋāĻ‚ āĻĄā§‡āϟāĻž, āχāύāĻ­āϝāĻŧ⧇āϏ, āĻŦāĻž āĻŸā§āϰāĻžāύāĻœā§‡āĻ•āĻļāύ⧇ āĻ•āĻ–āύ⧋āχ Hard Delete āĻ•āϰāĻž āωāϚāĻŋāϤ āύāϝāĻŧāĨ¤

Performance implications of soft deletes?​

  • āχāύāĻĄā§‡āĻ•ā§āϏāĻŋāĻ‚ āĻāĻŦāĻ‚ āϕ⧁āϝāĻŧ⧇āϰāĻŋ āĻ¸ā§āϞ⧋ āĻšāϝāĻŧ: āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇ āĻĄā§‡āϟāĻž āϜāĻŽāϤ⧇ āϜāĻŽāϤ⧇ āĻŦāĻŋāĻļāĻžāϞ āĻšāϝāĻŧ⧇ āϝāĻžāϝāĻŧāĨ¤ āĻāϰ āĻĢāϞ⧇ āϏāĻ•āϞ āϕ⧁āϝāĻŧ⧇āϰāĻŋāϤ⧇ WHERE is_deleted = false āϞāĻžāĻ—āĻžāϤ⧇ āĻšāϝāĻŧ, āϝāĻž āĻĒāĻžāϰāĻĢāϰāĻŽā§āϝāĻžāĻ¨ā§āϏ⧇ āĻŦāĻŋāϰ⧂āĻĒ āĻĒā§āϰāĻ­āĻžāĻŦ āĻĢ⧇āϞ⧇āĨ¤
  • āχāωāύāĻŋāĻ• āĻ•āύāĻ¸ā§āĻŸā§āϰ⧇āχāĻ¨ā§āϟ āϏāĻŽāĻ¸ā§āϝāĻž: āϝāĻĻāĻŋ āχāĻŽā§‡āχāϞ āĻ•āϞāĻžāĻŽ UNIQUE āĻĨāĻžāϕ⧇ āĻāĻŦāĻ‚ āχāωāϜāĻžāϰ test@mail.com āϏāĻĢāϟ āĻĄāĻŋāϞāĻŋāϟ āĻ•āϰ⧇ āύāϤ⧁āύ āĻ•āϰ⧇ āφāĻŦāĻžāϰ āĻ“āχ āχāĻŽā§‡āχāϞ āĻĻāĻŋāϝāĻŧ⧇ āĻāĻ•āĻžāωāĻ¨ā§āϟ āϖ⧁āϞāϤ⧇ āϚāĻžāϝāĻŧ, āϤāĻ–āύ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āϤāĻžāϕ⧇ āϖ⧁āϞāϤ⧇ āĻĻ⧇āĻŦ⧇ āύāĻž (Duplicate key error)āĨ¤

How do you clean up old soft-deleted records?​

āϏāĻĢāϟ āĻĄāĻŋāϞāĻŋāϟ āĻ•āϰāĻž āĻĄā§‡āϟāĻž āϚāĻŋāϰāĻ•āĻžāϞ āĻŽā§‚āϞ āĻŸā§‡āĻŦāĻŋāϞ⧇ āϜāĻŽāĻŋāϝāĻŧ⧇ āϰāĻžāĻ–āϞ⧇ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻ¸ā§āϞ⧋ āĻšāϝāĻŧ⧇ āϝāĻžāĻŦ⧇āĨ¤ āĻ āĻĨ⧇āϕ⧇ āĻŦāĻžāρāϚāϤ⧇:

  • Background Scrubbing Job: āĻāĻ•āϟāĻŋ āĻ…āĻŸā§‹āĻŽā§‡āĻŸā§‡āĻĄ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āĻŦāĻž Cron Job āĻĨāĻžāϕ⧇, āϝāĻž āĻĒā§āϰāϤāĻŋ āϰāĻžāϤ⧇ āϰāĻžāύ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻĻ⧇āϖ⧇ āϝ⧇āϏāĻŦ āĻĄā§‡āϟāĻž deleted_at āĻšāĻ“āϝāĻŧāĻžāϰ āĻĒāϰ ā§Šā§Ļ āĻŦāĻž ⧝ā§Ļ āĻĻāĻŋāύ āĻĒāĻžāϰ āĻšāϝāĻŧ⧇ āϗ⧇āϛ⧇, āϏ⧇āϗ⧁āϞ⧋āϕ⧇ āĻĒāĻžāĻ°ā§āĻŽāĻžāύ⧇āĻ¨ā§āϟāϞāĻŋ āĻšāĻžāĻ°ā§āĻĄ āĻĄāĻŋāϞāĻŋāϟ āĻ•āϰ⧇ āĻĻ⧇āϝāĻŧ, āĻ…āĻĨāĻŦāĻž āĻŽā§‚āϞ āĻŸā§‡āĻŦāĻŋāϞ āĻĨ⧇āϕ⧇ āϏāϰāĻŋāϝāĻŧ⧇ āϏāĻ¸ā§āϤāĻž Archive/Cold Storage āĻŸā§‡āĻŦāĻŋāϞ⧇ āϏ⧇āĻ­ āĻ•āϰ⧇ āϰāĻžāϖ⧇āĨ¤

162. How do you design for multi-tenancy?​

Multi-tenancy āĻšāϞ⧋ āĻāĻŽāύ āĻāĻ•āϟāĻŋ āφāĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āϚāĻžāϰ āϝ⧇āĻ–āĻžāύ⧇ āĻāĻ•āϟāĻŋāĻŽāĻžāĻ¤ā§āϰ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āχāύāĻ¸ā§āĻŸā§āϝāĻžāĻ¨ā§āϏ āĻāĻ•āχ āϏāĻžāĻĨ⧇ āĻāĻ•āĻžāϧāĻŋāĻ• āĻ•āĻžāĻ¸ā§āϟāĻŽāĻžāϰ (Tenant) āϕ⧇ āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āĻĻ⧇āϝāĻŧ (āϝ⧇āĻŽāύ: Shopify, Slack, Salesforce)āĨ¤

Shared database vs separate database per tenant?​

āĻŽāĻžāĻ˛ā§āϟāĻŋ-āĻŸā§‡āĻ¨ā§āϝāĻžāĻ¨ā§āϟ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻĄāĻŋāϜāĻžāχāύ⧇āϰ ā§ŠāϟāĻŋ āĻŽā§‚āϞ āĻ¸ā§āĻŸā§āĻ°ā§āϝāĻžāĻŸā§‡āϜāĻŋ āφāϛ⧇:

  1. Database per tenant (āφāχāϏ⧋āϞ⧇āĻŸā§‡āĻĄ): āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻ•āĻžāĻ¸ā§āϟāĻŽāĻžāϰ⧇āϰ āϜāĻ¨ā§āϝ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āφāϞāĻžāĻĻāĻž āφāĻ¸ā§āϤ āĻāĻ•āϟāĻŋ āĻĄāĻžāϟāĻžāĻŦ⧇āϏāĨ¤
    • āϏ⧁āĻŦāĻŋāϧāĻž: āϏāĻ°ā§āĻŦā§‹āĻšā§āϚ āϏāĻŋāĻ•āĻŋāωāϰāĻŋāϟāĻŋ āĻāĻŦāĻ‚ āĻĄā§‡āϟāĻž āĻĒā§āϰāĻžāχāϭ⧇āϏāĻŋāĨ¤ āĻāĻ• āĻ•āĻžāĻ¸ā§āϟāĻŽāĻžāϰ⧇āϰ āĻĄā§‡āϟāĻž āĻ•ā§āĻ°ā§āϝāĻžāĻļ āĻ•āϰāϞ⧇ āĻ…āĻ¨ā§āϝ⧇āϰ āϕ⧋āύ⧋ āϏāĻŽāĻ¸ā§āϝāĻž āύ⧇āχāĨ¤
    • āĻ…āϏ⧁āĻŦāĻŋāϧāĻž: āϝāĻĻāĻŋ ā§§ā§Ļ āĻšāĻžāϜāĻžāϰ āĻ•āĻžāĻ¸ā§āϟāĻŽāĻžāϰ āĻĨāĻžāϕ⧇, āϤāĻŦ⧇ ā§§ā§Ļ āĻšāĻžāϜāĻžāϰ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻŽā§‡āχāύāĻŸā§‡āχāύ āĻ•āϰāĻž āĻāĻŦāĻ‚ āĻ¸ā§āĻ•āĻŋāĻŽāĻž āφāĻĒāĻĄā§‡āϟ āĻ•āϰāĻž āĻĒā§āϰāĻžāϝāĻŧ āĻ…āϏāĻŽā§āĻ­āĻŦ (High cost and ops payload)āĨ¤
  2. Schema per tenant: āϏāĻŦāĻžāϰ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ ā§§āϟāĻŋāχ āĻĨāĻžāϕ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇āϰ āϭ⧇āϤāϰ⧇ āĻĒā§āϰāĻ¤ā§āϝ⧇āϕ⧇āϰ āφāϞāĻžāĻĻāĻž āĻ¸ā§āĻ•āĻŋāĻŽāĻž āĻŦāĻž āύ⧇āĻŽāĻ¸ā§āĻĒ⧇āϏ āĻĨāĻžāϕ⧇āĨ¤
    • āϏ⧁āĻŦāĻŋāϧāĻž: āĻŽā§‡āχāύāĻŸā§‡āχāύ āĻ•āϰāĻž āχāϜāĻŋ, āφāĻŦāĻžāϰ āĻĄā§‡āϟāĻžāĻ“ āϞāϜāĻŋāĻ•ā§āϝāĻžāϞāĻŋ āφāχāϏ⧋āϞ⧇āĻŸā§‡āĻĄ āĻĨāĻžāϕ⧇āĨ¤
  3. Shared Database, Shared Schema (Row-Level Security): āϏāĻŦ āĻ•āĻžāĻ¸ā§āϟāĻŽāĻžāϰ⧇āϰ āĻĄā§‡āϟāĻž āĻāĻ•āχ āĻŸā§‡āĻŦāĻŋāϞ⧇ āĻĨāĻžāϕ⧇āĨ¤ āĻĒā§āϰāϤāĻŋāϟāĻŋ āϰ⧋ (Row) āϤ⧇ āĻāĻ•āϟāĻŋ āĻāĻ•ā§āϏāĻŸā§āϰāĻž āĻ•āϞāĻžāĻŽ āĻĨāĻžāϕ⧇ tenant_idāĨ¤
    • āϏ⧁āĻŦāĻŋāϧāĻž: āĻ–āϰāϚ āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āĻ•āĻŽ, āĻ¸ā§āϕ⧇āϞāĻŋāĻ‚ āĻ•āϰāĻž āϖ⧁āĻŦ āϏāĻšāϜāĨ¤
    • āĻ…āϏ⧁āĻŦāĻŋāϧāĻž: āϕ⧁āϝāĻŧ⧇āϰāĻŋāϤ⧇ āϭ⧁āϞ āĻ•āϰ⧇ tenant_id āĻĢāĻŋāĻ˛ā§āϟāĻžāϰ āĻĻāĻŋāϤ⧇ āϭ⧁āϞ⧇ āϗ⧇āϞ⧇ āĻāĻ• āĻ•āĻžāĻ¸ā§āϟāĻŽāĻžāϰ āĻ…āĻ¨ā§āϝ āĻ•āĻžāĻ¸ā§āϟāĻŽāĻžāϰ⧇āϰ āĻĄā§‡āϟāĻž āĻĻ⧇āϖ⧇ āĻĢ⧇āϞāĻŦ⧇ (Massive Data Leak)āĨ¤

Row-level security implementation?​

āĻāχ āϞāĻŋāϕ⧇āϜ āĻĨ⧇āϕ⧇ āĻŦāĻžāρāϚāϤ⧇ āφāϧ⧁āύāĻŋāĻ• RDBMS (āϝ⧇āĻŽāύ PostgreSQL) āĻ Row-Level Security (RLS) āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤

  • RLS āĻ…āύ āĻ•āϰāϞ⧇ āφāĻĒāύāĻŋ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āϞ⧇āϭ⧇āϞ⧇āχ āϰ⧁āϞ āĻŦāĻž āĻĒāϞāĻŋāϏāĻŋ āϏ⧇āϟ āĻ•āϰ⧇ āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰ⧇āύ āϝ⧇, āϝ⧇ āχāωāϜāĻžāϰ āϞāĻ—āχāύ āĻ•āϰ⧇āϛ⧇, āϤāĻžāϰ āφāχāĻĄāĻŋāϰ āϏāĻžāĻĨ⧇ tenant_id āĻŽā§āϝāĻžāϚ āύāĻž āĻ•āϰāϞ⧇ āϏ⧇ āϕ⧋āύ⧋āĻ­āĻžāĻŦ⧇āχ āĻ“āχ āϰ⧋ āĻĻ⧇āĻ–āϤ⧇ āĻŦāĻž āĻāĻĄāĻŋāϟ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇ āύāĻžāĨ¤ āĻāϤ⧇ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϞ⧇āϭ⧇āϞ⧇ āϕ⧋āĻĄā§‡āϰ āϭ⧁āϞ āĻšāϞ⧇āĻ“ āϞāĻŋāϕ⧇āϜ āĻšāϝāĻŧ āύāĻžāĨ¤

163. How do you handle large file storage (images, videos)?​

āχāωāϜāĻžāϰ āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āĻĒāĻŋāĻ•āϚāĻžāϰ, āĻĒāĻŋāĻĄāĻŋāĻāĻĢ āĻŦāĻž āĻ­āĻŋāĻĄāĻŋāĻ“āϰ āĻŽāϤ⧋ āĻĢāĻžāχāϞāϗ⧁āϞ⧋āϕ⧇ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇ āϏ⧇āĻ­ āĻ•āϰāĻž āωāϚāĻŋāϤ āĻ•āĻŋ āύāĻžâ€”āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻĄāĻŋāϏāĻŋāĻļāύāĨ¤

Database BLOB vs file system vs object storage?​

  1. Database BLOB (Binary Large Object):
    • āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇: āχāĻŽā§‡āϜāϟāĻŋāϕ⧇ āĻŦāĻžāχāύāĻžāϰāĻŋ āĻĢāĻžāχāϞ⧇ āĻ•āύāĻ­āĻžāĻ°ā§āϟ āĻ•āϰ⧇ āϏāϰāĻžāϏāϰāĻŋ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻŸā§‡āĻŦāĻŋāϞ⧇āϰ āĻāĻ•āϟāĻŋ āĻ•āϞāĻžāĻŽā§‡ āϏ⧇āĻ­ āϰāĻžāĻ–āĻžāĨ¤
    • āϕ⧇āύ āĻāϟāĻž āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āĻ–āĻžāϰāĻžāĻĒ āϚāϝāĻŧ⧇āϏ? āĻĢāĻžāχāϞ āϏāĻžāχāĻœā§‡ āĻŦāĻĄāĻŧ āĻšāϝāĻŧ, āϝāĻž āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇āϰ RAM, Cache āĻāĻŦāĻ‚ Backup-āϕ⧇ āĻŽāĻžāϰāĻžāĻ¤ā§āĻŽāĻ• āĻ¸ā§āϞ⧋ āĻ•āϰ⧇ āĻĻ⧇āϝāĻŧāĨ¤ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻŽā§‚āϞāϤ āϛ⧋āϟ āĻāĻŦāĻ‚ āϰāĻŋāϞ⧇āĻļāύāĻžāϞ āĻĄā§‡āϟāĻžāϰ āϜāĻ¨ā§āϝ āĻ…āĻĒāϟāĻŋāĻŽāĻžāχāϜāĻĄ, āĻŦāĻžāχāύāĻžāϰāĻŋ āĻĢāĻžāχāϞ⧇āϰ āϜāĻ¨ā§āϝ āύāϝāĻŧāĨ¤
  2. File System (āϞ⧋āĻ•āĻžāϞ āĻĄāĻŋāĻ¸ā§āĻ•):
    • āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇: āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇āϰ āĻšāĻžāĻ°ā§āĻĄāĻĄāĻŋāĻ¸ā§āϕ⧇ (āϝ⧇āĻŽāύ /var/www/uploads/) āϏ⧇āĻ­ āĻ•āϰ⧇ āϰāĻžāĻ–āĻž āĻāĻŦāĻ‚ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇ āĻĢāĻžāχāϞ⧇āϰ āĻĒāĻžāĻĨ āĻŦāĻž āύāĻžāĻŽ āϏ⧇āĻ­ āĻ•āϰāĻžāĨ¤
    • āϏāĻŽāĻ¸ā§āϝāĻž: āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻ¸ā§āϕ⧇āϞ-āφāωāϟ āĻ•āϰāϞ⧇ (āĻāĻ•āĻžāϧāĻŋāĻ• āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻŦāϏāĻžāϞ⧇) āĻāĻ• āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇ āφāĻĒāϞ⧋āĻĄ āĻ•āϰāĻž āĻĢāĻžāχāϞ āĻ…āĻ¨ā§āϝ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻĨ⧇āϕ⧇ āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāϝāĻŧ āύāĻžāĨ¤ āĻŦā§āϝāĻžāĻ•āφāĻĒ āύ⧇āϝāĻŧāĻžāĻ“ āĻ•āĻˇā§āϟāĻ•āϰāĨ¤
  3. Object Storage (Amazon S3, Google Cloud Storage):
    • āϕ⧇āύ āĻāϟāĻŋ āĻŦ⧇āĻ¸ā§āϟ āϏāϞāĻŋāωāĻļāύ? āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ āĻ…āϏ⧀āĻŽ (Infinite) āĻ¸ā§āϕ⧇āϞāĻŋāĻ‚ āϏāĻžāĻĒā§‹āĻ°ā§āϟ āĻ•āϰ⧇āĨ¤ āĻĢāĻžāχāϞ āφāĻĒāϞ⧋āĻĄ āĻ•āϰāĻž āĻŽāĻžāĻ¤ā§āϰāχ āĻāĻ•āϟāĻŋ āĻĢāĻŋāĻ•ā§āϏāĻĄ URL āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāϝāĻŧ āϝāĻž āϏāϰāĻžāϏāϰāĻŋ CDN āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻĢāĻžāĻ¸ā§āϟ āĻĄā§‡āϞāĻŋāĻ­āĻžāϰāĻŋ āĻ•āϰāĻž āϝāĻžāϝāĻŧāĨ¤

How do you ensure consistency between database and file storage?​

āϝāĻĻāĻŋ AWS S3 āϤ⧇ āχāĻŽā§‡āϜ āφāĻĒāϞ⧋āĻĄ āϏāĻžāĻ•āϏ⧇āϏāĻĢ⧁āϞ āĻšāϝāĻŧ āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇ āϏ⧇āχ āϞāĻŋāĻ‚āĻ• āϏ⧇āĻ­ āĻšāĻ“āϝāĻŧāĻžāϰ āφāϗ⧇āχ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻĢ⧇āχāϞ āĻ•āĻ°ā§‡â€”āϤāĻžāĻšāϞ⧇ S3 āϤ⧇ āĻāĻ•āϟāĻŋ āĻ…āύāĻžāĻĨ (Orphan) āĻĢāĻžāχāϞ āĻĒāĻĄāĻŧ⧇ āĻĨāĻžāĻ•āĻŦ⧇āĨ¤

  • āϏāĻŽāĻžāϧāĻžāύ:
    1. āĻĒā§āϰāĻĨāĻŽā§‡ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇ file_status = 'pending' āϞāĻŋāϖ⧇ āĻĄā§‡āϟāĻž āĻāĻ¨ā§āĻŸā§āϰāĻŋ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤
    2. āĻāϰāĻĒāϰ S3 āϤ⧇ āφāĻĒāϞ⧋āĻĄ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤
    3. āϏāĻĢāϞ āĻšāϞ⧇ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇ āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āφāĻĒāĻĄā§‡āϟ āĻ•āϰ⧇ status = 'uploaded' āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤
    4. āĻāĻ•āϟāĻŋ āωāχāĻ•āϞāĻŋ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ (Cron) āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻ¸ā§āĻ•ā§āϝāĻžāύ āĻ•āϰ⧇ āĻĒ⧇āĻ¨ā§āĻĄāĻŋāĻ‚ āĻĨāĻžāĻ•āĻž āĻ…āύāĻžāĻĨ āĻĢāĻžāχāϞāϗ⧁āϞ⧋āϕ⧇ S3 āĻĨ⧇āϕ⧇ āĻĄāĻŋāϞāĻŋāϟ āĻ•āϰ⧇ āĻĻ⧇āϝāĻŧāĨ¤

164. How do you implement audit trails in database?​

āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡ āϕ⧇, āĻ•āĻ–āύ, āϕ⧋āύ āĻĄā§‡āϟāĻž āĻšā§‡āĻžā§āϜ āĻ•āϰ⧇āϛ⧇ āϤāĻž āĻŸā§āĻ°ā§āϝāĻžāĻ• āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ Audit Trail āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧ (āĻŦāĻŋāĻļ⧇āώ āĻ•āϰ⧇ āĻĢāĻžāχāĻ¨ā§āϝāĻžāĻ¨ā§āϏ āĻ“ āĻšā§‡āϞāĻĨāϕ⧇āϝāĻŧāĻžāϰ⧇)āĨ¤

Trigger-based vs application-level auditing?​

ā§§. Trigger-based Auditing (Database Level):

  • āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇: āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇āϰ āĻŸā§‡āĻŦāĻŋāϞ⧇ AFTER INSERT, UPDATE, DELETE āĻŸā§āϰāĻŋāĻ—āĻžāϰ āϞ⧇āĻ–āĻž āĻĨāĻžāϕ⧇āĨ¤ āϕ⧇āω āĻŸā§‡āĻŦāĻŋāϞ⧇ āĻšāĻžāϤ āĻĻāĻŋāϞ⧇āχ āĻŸā§āϰāĻŋāĻ—āĻžāϰ āύāĻŋāĻœā§‡ āĻĨ⧇āϕ⧇ āĻ“āχ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ⧇āϰ āφāϗ⧇āϰ āĻ“ āĻĒāϰ⧇āϰ āĻĄā§‡āϟāĻžāϕ⧇ āĻāĻ•āϟāĻŋ audit_logs āĻŸā§‡āĻŦāĻŋāϞ⧇ āĻ•āĻĒāĻŋ āĻ•āϰ⧇ āϰāĻžāϖ⧇āĨ¤
  • āϏ⧁āĻŦāĻŋāϧāĻž: āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϕ⧋āĻĄ āĻĒāĻžāĻ˛ā§āϟāĻžāϤ⧇ āĻšāϝāĻŧ āύāĻžāĨ¤ āϕ⧇āω āϏāϰāĻžāϏāϰāĻŋ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇ āĻĸ⧁āϕ⧇ āĻŽā§āϝāĻžāύ⧁āϝāĻŧāĻžāϞāĻŋ āĻĄā§‡āϟāĻž āĻšā§‡āĻžā§āϜ āĻ•āϰāϞ⧇āĻ“ āϤāĻž āĻŸā§āĻ°ā§āϝāĻžāĻ• āĻšāϝāĻŧ⧇ āϝāĻžāϝāĻŧāĨ¤
  • āĻ…āϏ⧁āĻŦāĻŋāϧāĻž: āĻĒā§āϰāϚ⧁āϰ āĻĒāĻžāϰāĻĢāϰāĻŽā§āϝāĻžāĻ¨ā§āϏ āĻ“āĻ­āĻžāϰāĻšā§‡āĻĄ āϤ⧈āϰāĻŋ āĻšāϝāĻŧ, āĻ•āĻžāϰāĻŖ āĻĒā§āϰāϤāĻŋāϟāĻŋ āϰāĻžāχāĻŸā§‡āϰ āϜāĻ¨ā§āϝ āĻĄāĻžāĻŦāϞ āϰāĻžāχāϟ āĻ•āϰāϤ⧇ āĻšāϝāĻŧāĨ¤

⧍. Application-level Auditing:

  • āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇: āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ āϕ⧋āĻĄ (āϝ⧇āĻŽāύ ORM) āĻĄā§‡āϟāĻž āϏ⧇āĻ­ āĻ•āϰāĻžāϰ āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āĻ…āĻĄāĻŋāϟ āχāϭ⧇āĻ¨ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āϤāĻž āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻŦāĻž āĻāĻ•ā§āϏāϟāĻžāĻ°ā§āύāĻžāϞ āϞāϗ⧇ (āϝ⧇āĻŽāύ Elasticsearch) āϏ⧇āĻ­ āĻ•āϰ⧇āĨ¤
  • āϏ⧁āĻŦāĻŋāϧāĻž: āĻ…āύ⧇āĻ• āĻŦ⧇āĻļāĻŋ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞ āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāϝāĻŧ (āϝ⧇āĻŽāύ: āϕ⧋āύ āφāχāĻĒāĻŋ āĻāĻĄā§āϰ⧇āϏ, āϕ⧋āύ āϞāĻ—āχāύ āϏ⧇āĻļāύ āĻĨ⧇āϕ⧇ āĻšā§‡āĻžā§āϜ āĻšāϝāĻŧ⧇āϛ⧇ āϤāĻž āϞāĻ— āĻ•āϰāĻž āϏāĻšāϜ)āĨ¤
  • āĻŦ⧇āĻ¸ā§āϟ āĻĒā§āĻ°ā§āϝāĻžāĻ•āϟāĻŋāϏ: āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āϞ⧇āϭ⧇āϞ⧇ āϰāĻžāχāϟ āϞ⧋āĻĄ āĻ•āĻŽāĻžāϤ⧇ āĻ…āĻĄāĻŋāϟ āĻĄā§‡āϟāĻž āĻŽā§‡āϏ⧇āϜ āĻŦā§āϰ⧋āĻ•āĻžāϰ⧇āϰ (Kafka) āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻāϏāĻŋāĻ™ā§āĻ•ā§āϰ⧋āύāĻžāϏāĻ­āĻžāĻŦ⧇ āĻ…āĻ¨ā§āϝ āϕ⧋āύ⧋ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻŦāĻž Data Warehouse-āĻ āĻĒāĻžāĻ āĻžāύ⧋āĨ¤

165. How do you handle time zones in global applications?​

āφāĻĒāύāĻžāϰ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āφāĻŽā§‡āϰāĻŋāĻ•āĻžāϝāĻŧ, āχāωāϜāĻžāϰ āĻŦāĻžāĻ‚āϞāĻžāĻĻ⧇āĻļ⧇, āφāĻĒāύāĻžāϰ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āϏāĻŋāĻ™ā§āĻ—āĻžāĻĒ⧁āĻ°ā§‡â€”āĻāχ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāϝāĻŧ āϏāĻŽāϝāĻŧ⧇āϰ (Date & Time) āĻšāĻŋāϏāĻžāĻŦ āϰāĻžāĻ–āĻž āĻāĻ•āϟāĻŋ āĻ­āϝāĻŧāĻ‚āĻ•āϰ āĻ…āĻ­āĻŋāĻœā§āĻžāϤāĻž āĻšāϤ⧇ āĻĒāĻžāϰ⧇ āϝāĻĻāĻŋ āφāĻĒāύāĻŋ āϏāĻ āĻŋāĻ• āĻĒā§āϝāĻžāϟāĻžāĻ°ā§āύ āĻĢāϞ⧋ āύāĻž āĻ•āϰ⧇āύāĨ¤

Store UTC vs local time?​

Golden Rule of Timezones: āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇ āϏāĻŽāϝāĻŧ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āϏāĻŦāϏāĻŽāϝāĻŧ āĻāĻŦāĻ‚ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ UTC (Coordinated Universal Time) āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤ āĻ•āĻ–āύ⧋āχ āχāωāϜāĻžāϰ⧇āϰ āϞ⧋āĻ•āĻžāϞ āϟāĻžāχāĻŽ āĻŦāĻž āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇āϰ āϞ⧋āĻ•āĻžāϞ āϟāĻžāχāĻŽ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇ āϏ⧇āĻ­ āĻ•āϰāĻž āωāϚāĻŋāϤ āύāϝāĻŧāĨ¤

  • āϕ⧇āύ? āĻ•āĻžāϰāĻŖ āφāĻŽā§‡āϰāĻŋāĻ•āĻž āĻŦāĻž āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻĻ⧇āĻļ⧇ āĻĄā§‡-āϞāĻžāχāϟ āϏ⧇āĻ­āĻŋāĻ‚ āϟāĻžāχāĻŽ (DST) āĻĨāĻžāϕ⧇āĨ¤ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇ āϞ⧋āĻ•āĻžāϞ āϟāĻžāχāĻŽ āϰāĻžāĻ–āϞ⧇, āϕ⧋āύ āϏāĻŽāϝāĻŧ āϘāĻĄāĻŧāĻŋāϰ āĻ•āĻžāρāϟāĻž āĻāĻ—ā§‹āϞ āĻŦāĻž āĻĒ⧇āĻ›āĻžāϞ āϤāĻž āĻŸā§āĻ°ā§āϝāĻžāĻ•āĻŋāĻ‚ āĻ•āϰāĻž āĻ…āϏāĻŽā§āĻ­āĻŦ āĻšāϝāĻŧ⧇ āϝāĻžāĻŦ⧇ āĻāĻŦāĻ‚ āϕ⧁āϝāĻŧ⧇āϰāĻŋ āϭ⧁āϞ āϰ⧇āϜāĻžāĻ˛ā§āϟ āĻĻ⧇āĻŦ⧇ (āϝ⧇āĻŽāύ ⧍ā§Ē āϘāĻŖā§āϟāĻžāϰ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āϰāĻŋāĻĒā§‹āĻ°ā§āĻŸā§‡ ⧍ā§Ģ āϘāĻŖā§āϟāĻž āϚāϞ⧇ āφāϏāĻŦ⧇)āĨ¤

How do you handle timezone conversion?​

  1. Frontend (App/Browser): āĻĄāĻžāϟāĻžāĻŦ⧇āϏ API āĻĻāĻŋāϝāĻŧ⧇ UTC āϟāĻžāχāĻŽ āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚ āĻĒāĻžāĻ āĻžāĻŦ⧇ (āϝ⧇āĻŽāύ: 2024-05-10T14:30:00Z)āĨ¤ āχāωāϜāĻžāϰ⧇āϰ āĻŦā§āϰāĻžāωāϜāĻžāϰ āĻŦāĻž āĻŽā§‹āĻŦāĻžāχāϞ āĻĢā§‹āύ āϏ⧇āχ āĻĄā§‡āϟāĻž āϰāĻŋāϏāĻŋāĻ­ āĻ•āϰ⧇ āχāωāϜāĻžāϰ⧇āϰ āĻŦāĻ°ā§āϤāĻŽāĻžāύ āϟāĻžāχāĻŽ āĻœā§‹āύ āĻ…āύ⧁āϝāĻžāϝāĻŧā§€ āϰ⧂āĻĒāĻžāĻ¨ā§āϤāϰ āĻ•āϰ⧇ āĻĻ⧇āĻ–āĻžāĻŦ⧇āĨ¤
  2. Database Queries: āϝāĻĻāĻŋ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇āϰ āϭ⧇āϤāϰ āϕ⧋āύ⧋ āĻŽāĻžāĻ¨ā§āĻĨāϞāĻŋ āϰāĻŋāĻĒā§‹āĻ°ā§āϟ āĻœā§‡āύāĻžāϰ⧇āϟ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āϟāĻžāχāĻŽāĻœā§‹āύ āϰ⧂āĻĒāĻžāĻ¨ā§āϤāϰ āĻ•āϰāϤ⧇ āĻšāϝāĻŧ, āϤāĻŦ⧇ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇āϰ āύāĻŋāϜāĻ¸ā§āĻŦ āĻĢāĻžāĻ‚āĻļāύ (āϝ⧇āĻŽāύ PostgreSQL āĻ AT TIME ZONE) āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ“āχ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϕ⧁āϝāĻŧ⧇āϰāĻŋāϰ āϜāĻ¨ā§āϝ āϟāĻžāχāĻŽāĻœā§‹āύ āĻ•āĻžāĻ¸ā§āϟ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤

166. How do you implement database versioning for SaaS applications?​

SaaS (Software as a Service) āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ⧇ ā§Ģ āĻŽāĻŋāύāĻŋāϟ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻĄāĻžāωāύ āĻ•āϰāĻžāĻ“ āĻ…āύ⧇āĻ• āϏāĻŽāϝāĻŧ āĻ•ā§āώāϤāĻŋāĻ•āϰ āĻšāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āϤāĻžāχ Zero-downtime āĻ¸ā§āĻ•āĻŋāĻŽāĻž āĻŽāĻžāχāĻ—ā§āϰ⧇āĻļāύ āϖ⧁āĻŦāχ āϜāϰ⧁āϰāĻŋāĨ¤

How do you handle schema migrations with zero downtime?​

āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇ āĻ•āϞāĻžāĻŽ āϝ⧋āĻ— āĻ•āϰāĻž āĻŦāĻž āϰāĻŋāĻŽā§āĻ­ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ "Expand and Contract Pattern" āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤

āϧāϰāĻž āϝāĻžāĻ•, āφāĻĒāύāĻŋ first_name āĻāĻŦāĻ‚ last_name āĻ•āϞāĻžāĻŽ āĻĻ⧁āϟāĻŋ āĻŦāĻžāĻĻ āĻĻāĻŋāϝāĻŧ⧇ full_name āύāĻžāĻŽā§‡ ā§§āϟāĻŋ āĻ•āϞāĻžāĻŽ āϰāĻžāĻ–āϤ⧇ āϚāĻžāύāĨ¤

  • āϧāĻžāĻĒ ā§§ (Expand): āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇ āĻĒ⧁āϰ⧋āύ⧋ āĻ•āϞāĻžāĻŽ āύāĻž āĻĄāĻŋāϞāĻŋāϟ āĻ•āϰ⧇āχ āύāϤ⧁āύ full_name āĻ•āϞāĻžāĻŽ āϝ⧋āĻ— āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤
  • āϧāĻžāĻĒ ā§¨ (Application Update): āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ āϕ⧋āĻĄ āφāĻĒāĻĄā§‡āϟ āĻ•āϰ⧇ āĻāĻŽāύ āĻ•āϰāĻž āĻšāϝāĻŧ āϝ⧇ āϏ⧇ āĻĒ⧁āϰ⧋āύ⧋ āĻ•āϞāĻžāĻŽāϗ⧁āϞ⧋āϤ⧇āĻ“ āϞāĻŋāĻ–āĻŦ⧇, āφāĻŦāĻžāϰ āύāϤ⧁āύ āĻ•āϞāĻžāĻŽāϟāĻŋāϤ⧇āĻ“ āĻĄā§‡āϟāĻž āϞāĻŋāĻ–āĻŦ⧇ (Dual writes)āĨ¤
  • āϧāĻžāĻĒ ā§Š (Backfill): āĻŦā§āϝāĻžāĻ•āĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄā§‡ āĻāĻ•āϟāĻŋ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āϚāĻžāϞāĻŋāϝāĻŧ⧇ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇āϰ āϏāĻŦ āĻĒ⧁āϰ⧋āύ⧋ āχāωāϜāĻžāϰāĻĻ⧇āϰ first_name āĻ“ last_name āĻœā§‹āĻĄāĻŧāĻž āϞāĻžāĻ—āĻŋāϝāĻŧ⧇ full_name āϘāϰ⧇ āĻŦāϏāĻžāύ⧋ āĻšāϝāĻŧāĨ¤
  • āϧāĻžāĻĒ ā§Ē (Contract): āĻāĻŦāĻžāϰ āϕ⧋āĻĄ āĻšā§‡āĻžā§āϜ āĻ•āϰ⧇ āĻ…ā§āϝāĻžāĻĒāϕ⧇ āĻŦāϞāĻž āĻšāϝāĻŧ āĻļ⧁āϧ⧁ full_name āĻĨ⧇āϕ⧇ āĻĒāĻĄāĻŧāϤ⧇āĨ¤ āĻāϰāĻĒāϰ āĻ•āϝāĻŧ⧇āĻ•āĻĻāĻŋāύ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ āĻŋāĻ•āĻ­āĻžāĻŦ⧇ āϚāϞāĻžāϰ āĻĒāϰ āĻĒ⧁āϰ⧋āύ⧋ āĻ•āϞāĻžāĻŽ āĻĻ⧁āĻŸā§‹ āĻĄāĻŋāϞāĻŋāϟ āĻ•āϰ⧇ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāϝāĻŧāĨ¤ āĻāϤ⧇ āχāωāϜāĻžāϰ ā§§ āϏ⧇āϕ⧇āĻ¨ā§āĻĄā§‡āϰ āϜāĻ¨ā§āϝāĻ“ āĻŸā§‡āϰāχ āĻĒāĻžāϝāĻŧ āύāĻž āϝ⧇ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻĒāĻžāĻ˛ā§āĻŸā§‡āϛ⧇āĨ¤

Rollback strategies for database changes?​

āĻ¸ā§āĻ•āĻŋāĻŽāĻž āĻšā§‡āĻžā§āϜ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ Flyway āĻŦāĻž Liquibase āĻāϰ āĻŽāϤ⧋ āĻ­āĻžāĻ°ā§āϏāύ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞ āϟ⧁āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ āĻĒā§āϰāϤāĻŋāϟāĻŋ SQL āĻŽāĻžāχāĻ—ā§āϰ⧇āĻļāύ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āĻŸā§‡āϰ āϏāĻžāĻĨ⧇ āĻāĻ•āϟāĻŋ Up.sql (āύāϤ⧁āύ āĻšā§‡āĻžā§āϜ) āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ Down.sql (āϰ⧋āϞāĻŦā§āϝāĻžāĻ• āĻŦāĻž āφāϗ⧇āϰ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāϝāĻŧ āĻĢ⧇āϰāĻžāϰ āĻšā§‡āĻžā§āϜ) āĻĨāĻžāϕ⧇āĨ¤ āĻĒā§āϰ⧋āĻĄāĻžāĻ•āĻļāύ⧇ āĻŦā§āϰ⧇āĻ• āĻ•āϰāϞ⧇ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āϚāĻžāϞāĻŋāϝāĻŧ⧇ āĻŽā§āĻšā§‚āĻ°ā§āϤ⧇āχ āφāϗ⧇āϰ āĻĄā§‡āϟāĻžāĻŦ⧇āϏ āĻ¸ā§āĻ•āĻŋāĻŽāĻžāϝāĻŧ āĻĢāĻŋāϰ⧇ āϝāĻžāĻ“āϝāĻŧāĻž āϝāĻžāϝāĻŧāĨ¤


167. How do you design databases for high write throughput?​

āϝāĻ–āύ āφāĻĒāύāĻžāϰ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡ āĻĒā§āϰāϤāĻŋ āϏ⧇āϕ⧇āĻ¨ā§āĻĄā§‡ āϞāĻžāĻ– āϞāĻžāĻ– Write Operation āφāϏāĻŦ⧇, āϤāĻ–āύ āĻŸā§āϰ⧇āĻĄāĻŋāĻļāύāĻžāϞ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ (B-Tree structure) āĻ•āĻžāϜ āĻ•āϰāĻŦ⧇ āύāĻž, āĻ•āĻžāϰāĻŖ āĻĄāĻŋāĻ¸ā§āϕ⧇ āϰ⧇āĻ¨ā§āĻĄāĻŽāĻ­āĻžāĻŦ⧇ āϞ⧇āĻ–āĻž āϖ⧁āĻŦ āĻ¸ā§āϞ⧋ (Random I/O)āĨ¤

Write-optimized storage engines?​

āĻšāĻžāχ-āϰāĻžāχāϟ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻĄāĻŋāϜāĻžāχāύ⧇āϰ āϕ⧋āϰ āφāĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āϚāĻžāϰ āĻšāϞ⧋ LSM-Trees (Log-Structured Merge-Tree)āĨ¤

  • Apache Cassandra, RocksDB, LevelDB āĻāϗ⧁āϞ⧋ LSM-Tree āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĨ¤
  • āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇? āĻĄā§‡āϟāĻž āĻĄāĻŋāĻ¸ā§āϕ⧇ āϏāϰāĻžāϏāϰāĻŋ āύāĻž āϞāĻŋāϖ⧇ āĻĒā§āϰāĻĨāĻŽā§‡ RAM āĻ (MemTable) āĻŦāĻžāĻĢāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ RAM āϝāĻ–āύ āĻ­āϰ⧇ āϝāĻžāϝāĻŧ, āϤāĻ–āύ āĻāϟāĻŋ āĻšāĻžāĻ°ā§āĻĄāĻĄāĻŋāĻ¸ā§āϕ⧇ āϏāĻŋāϕ⧁āϝāĻŧ⧇āύāĻļāĻŋāϝāĻŧāĻžāϞāĻŋ āĻĢā§āĻ˛ā§āϝāĻžāĻļ āĻŦāĻž āĻĄāĻžāĻŽā§āĻĒ (SSTable) āĻ•āϰ⧇ āĻĻ⧇āϝāĻŧāĨ¤ āĻšāĻžāĻ°ā§āĻĄāĻĄāĻŋāĻ¸ā§āϕ⧇ āϏāĻŋāϕ⧁āϝāĻŧ⧇āύāĻļāĻŋāϝāĻŧāĻžāϞāĻŋ āϞ⧇āĻ–āĻž (Sequential I/O) āϰ⧇āĻ¨ā§āĻĄāĻŽ āϰāĻžāχāĻŸā§‡āϰ āϤ⧁āϞāύāĻžāϝāĻŧ āĻšāĻžāϜāĻžāϰ āϗ⧁āĻŖ āĻĢāĻžāĻ¸ā§āϟāĨ¤

Partitioning strategies for writes?​

āĻļ⧁āϧ⧁ āχāĻžā§āϜāĻŋāύ āĻ­āĻžāϞ⧋ āĻšāϞ⧇āχ āĻšāĻŦ⧇ āύāĻž, āϞ⧋āĻĄ āĻŦā§āϝāĻžāϞāĻžāĻ¨ā§āϏ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻĄāĻžāϟāĻžāĻŦ⧇āϏāϕ⧇ āĻ­āĻžāĻ— āĻŦāĻž Sharding āĻ•āϰāϤ⧇ āĻšāϝāĻŧāĨ¤

  • Consistent Hashing: āĻĄā§‡āϟāĻžāϰ āϕ⧀-āϗ⧁āϞ⧋āϕ⧇ āĻāĻŽāύāĻ­āĻžāĻŦ⧇ āĻšā§āϝāĻžāĻļ āĻ•āϰ⧇ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇ āĻĄāĻŋāĻ¸ā§āĻŸā§āϰāĻŋāĻŦāĻŋāωāϟ āĻ•āϰāĻž āĻšāϝāĻŧ, āϝāĻžāϤ⧇ āϏāĻŦ āϏāĻžāĻ°ā§āĻ­āĻžāϰ (Node) āϏāĻŽāĻžāύāĻ­āĻžāĻŦ⧇ āĻŸā§āϰāĻžāĻĢāĻŋāĻ• āĻĒāĻžāϝāĻŧ āĻāĻŦāĻ‚ āϕ⧋āύ⧋ āĻāĻ•āϟāĻŋ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻ“āĻ­āĻžāϰāϞ⧋āĻĄ āĻšāϝāĻŧ⧇ āĻ•ā§āĻ°ā§āϝāĻžāĻļ āύāĻž āĻ•āϰ⧇āĨ¤

When to consider write-through vs write-back caching?​

  • Write-through cache: āĻĄā§‡āϟāĻž āφāϗ⧇ āĻ•ā§āϝāĻžāĻļ⧇ (Redis) āϞ⧇āϖ⧇, āĻāĻ•āχ āϏāĻžāĻĨ⧇ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇ āϞ⧇āϖ⧇, āϤāĻžāϰāĻĒāϰ āχāωāϜāĻžāϰāϕ⧇ āϏāĻžāĻ•ā§āϏ⧇āϏ āĻĻ⧇āĻ–āĻžāϝāĻŧāĨ¤ āĻāϟāĻŋ āĻĄā§‡āϟāĻž āĻ—ā§āϝāĻžāϰāĻžāĻ¨ā§āϟāĻŋ āĻĻ⧇āϝāĻŧ āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻŦ⧇āĻļ āĻ¸ā§āϞ⧋, āϤāĻžāχ āĻšāĻžāχ-āϰāĻžāχāĻŸā§‡ āĻāϟāĻŋ āĻ­āĻžāϞ⧋ āύāϝāĻŧāĨ¤
  • Write-back cache (Asynchronous): āĻĄā§‡āϟāĻž āϏāϰāĻžāϏāϰāĻŋ āĻŽā§‡āĻŽāϰāĻŋ āĻ•ā§āϝāĻžāĻļ⧇ (Redis) āϞāĻŋāϖ⧇ āϏāĻžāĻĨ⧇ āϏāĻžāĻĨ⧇ āχāωāϜāĻžāϰāϕ⧇ āϏāĻžāĻ•ā§āϏ⧇āϏ āĻĻ⧇āĻ–āĻŋāϝāĻŧ⧇ āĻĻ⧇āϝāĻŧāĨ¤ āφāϰ āĻŦā§āϝāĻžāĻ•āĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄā§‡ āϕ⧋āύ⧋ āĻ“āϝāĻŧāĻžāĻ°ā§āĻ•āĻžāϰ āϧ⧀āϰ⧇āϏ⧁āĻ¸ā§āĻĨ⧇ āĻšāĻžāĻ°ā§āĻĄāĻĄāĻŋāĻ¸ā§āϕ⧇ (āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇) āϏ⧇āϟāĻž āϏāĻŋāĻ™ā§āĻ• āĻ•āϰāϤ⧇ āĻĨāĻžāϕ⧇āĨ¤ āĻāϟāĻŋ āĻāĻ•ā§āϏāĻŸā§āϰāĻŋāĻŽ āϞ⧇āϭ⧇āϞ⧇āϰ āϰāĻžāχāϟ āĻĨā§āϰ⧁āĻĒ⧁āϟ āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰ⧇, āϤāĻŦ⧇ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻšāĻ āĻžā§Ž āĻ•ā§āĻ°ā§āϝāĻžāĻļ āĻ•āϰāϞ⧇ āĻŽā§‡āĻŽāϰāĻŋāϰ āĻ•āĻŋāϛ⧁ āϞ⧇āĻŸā§‡āĻ¸ā§āϟ āĻĄā§‡āϟāĻž āĻšāĻžāϰāĻŋāϝāĻŧ⧇ āϝāĻžāĻ“āϝāĻŧāĻžāϰ āϰāĻŋāĻ¸ā§āĻ• āĻĨāĻžāϕ⧇āĨ¤

175. How do you migrate from one database to another (e.g., Oracle to PostgreSQL)?​

āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻŽāĻžāχāĻ—ā§āϰ⧇āĻļāύ (Migration) āĻšāϞ⧋ āĻŦāĻŋāĻļā§āĻŦ⧇āϰ āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āĻ­āϝāĻŧāĻžāĻŦāĻš āĻāĻŦāĻ‚ āĻšāĻžāχ-āϰāĻŋāĻ¸ā§āĻ• āχāĻžā§āϜāĻŋāύāĻŋāϝāĻŧāĻžāϰāĻŋāĻ‚ āĻ•āĻžāϜāϗ⧁āϞ⧋āϰ āĻāĻ•āϟāĻŋāĨ¤

What are the main challenges?​

  • āĻĄā§‡āϟāĻž āϞāϏ āĻāĻŦāĻ‚ āϞāĻŋāϕ⧇āϜ: āĻŽā§āĻ­ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āϞāĻžāĻ–ā§‹ āĻĄā§‡āϟāĻžāϰ āĻŽāĻ§ā§āϝ⧇ ā§§āϟāĻŋ āϰ⧋ āĻŽāĻŋāϏ āĻšāϞ⧇āĻ“ āĻŦāĻĄāĻŧ āĻĄā§āϝāĻžāĻŽā§‡āϜ āĻšāϝāĻŧ⧇ āϝāĻžāϝāĻŧāĨ¤
  • āĻĄā§‡āϟāĻž āϟāĻžāχāĻĒ āĻĒāĻžāĻ°ā§āĻĨāĻ•ā§āϝ: Oracle āĻāϰ āĻ¸ā§āĻĒ⧇āϏāĻŋāĻĢāĻŋāĻ• āĻ…āύ⧇āĻ• āĻĄā§‡āϟāĻž āϟāĻžāχāĻĒ āĻŦāĻž āĻĢāĻŋāϚāĻžāϰ PostgreSQL āĻ āύ⧇āχ, āĻ…āĻĨāĻŦāĻž āĻ…āĻ¨ā§āϝāĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇āĨ¤
  • āĻĄāĻžāωāύāϟāĻžāχāĻŽ: āĻŸā§‡āϰāĻžāĻŦāĻžāχāϟ āϏāĻžāχāĻœā§‡āϰ āĻĄā§‡āϟāĻž āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻĨ⧇āϕ⧇ āĻĄāĻžāĻŽā§āĻĒ āĻ•āϰ⧇ āĻ…āĻ¨ā§āϝ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇ āϰāĻŋāĻ¸ā§āĻŸā§‹āϰ āĻ•āϰāϤ⧇ āĻ•āϝāĻŧ⧇āĻ• āϘāĻŖā§āϟāĻž āĻĨ⧇āϕ⧇ āĻĻāĻŋāύ āĻĒāĻ°ā§āϝāĻ¨ā§āϤ āϏāĻŽāϝāĻŧ āϞāĻžāĻ—āϤ⧇ āĻĒāĻžāϰ⧇, āϝāĻž āĻĒā§āϰāĻĄāĻžāĻ•āĻļāύ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡ āĻ…āϏāĻŽā§āĻ­āĻŦāĨ¤

How do you handle it with zero downtime?​

āĻĒā§āϰ⧋āĻĄāĻžāĻ•āĻļāύ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡ āϜāĻŋāϰ⧋-āĻĄāĻžāωāύāϟāĻžāχāĻŽ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻŽāĻžāχāĻ—ā§āϰ⧇āĻļāύ āϏāĻžāϧāĻžāϰāĻŖāϤ CDC (Change Data Capture) āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤

  1. Initial Snapshot & Sync: āĻĒā§āϰāĻĨāĻŽā§‡ Oracle āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇āϰ āĻāĻ•āϟāĻŋ āĻ¸ā§āĻ¨ā§āϝāĻžāĻĒāĻļāϟ āύāĻŋāϝāĻŧ⧇ āϏ⧇āϟāĻŋ āϧ⧀āϰ⧇ āϧ⧀āϰ⧇ PostgreSQL āĻ āϰāĻŋāĻ¸ā§āĻŸā§‹āϰ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤
  2. Replication (CDC - Debezium): āĻāϰāĻĒāϰ Debezium āĻŦāĻž AWS DMS āĻāϰ āĻŽāϤ⧋ āϟ⧁āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ Oracle āĻāϰ āĻŸā§āϰāĻžāύāĻœā§‡āĻ•āĻļāύāĻžāϞ āϞāĻ— (Redo Logs) āϰāĻŋāĻĄ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ āĻ¸ā§āĻ¨ā§āϝāĻžāĻĒāĻļāϟ āύ⧇āϝāĻŧāĻžāϰ āĻĒāϰ āĻĨ⧇āϕ⧇ Oracle āĻ āϝāϤ āύāϤ⧁āύ Read/Write āĻšāĻšā§āϛ⧇ āϰāĻŋāϝāĻŧ⧇āϞ-āϟāĻžāχāĻŽā§‡ āϤāĻž PostgreSQL āĻ āϏāĻŋāĻ™ā§āĻ• āĻšāϤ⧇ āĻĨāĻžāϕ⧇āĨ¤
  3. Dual Writes: āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϞ⧇āϭ⧇āϞ⧇ āϕ⧋āĻĄ āĻšā§‡āĻžā§āϜ āĻ•āϰ⧇ āĻāĻ•āχ āϏāĻžāĻĨ⧇ Oracle āĻāĻŦāĻ‚ PostgreSQL āωāĻ­āϝāĻŧ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇āχ āύāϤ⧁āύ āĻĄā§‡āϟāĻž āϞ⧇āĻ–āĻž āĻļ⧁āϰ⧁ āĻšāϝāĻŧ (Dual Writes)āĨ¤
  4. Verification: āĻāϰāĻĒāϰ āĻāĻ• āĻĨ⧇āϕ⧇ āĻĻ⧁āχ āϏāĻĒā§āϤāĻžāĻš āĻĻ⧁āϟāĻŋ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇āϰ āϰ⧇āϜāĻžāĻ˛ā§āϟ āĻŦā§āϝāĻžāĻ•āĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄā§‡ āĻŽā§āϝāĻžāϚ āĻŦāĻž āϤ⧁āϞāύāĻž (Shadow read) āĻ•āϰāĻž āĻšāϝāĻŧ āĻĻ⧇āĻ–āϤ⧇ āϝ⧇ āύāϤ⧁āύ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āύāĻŋāĻ°ā§āϭ⧁āϞ āϰ⧇āϜāĻžāĻ˛ā§āϟ āĻĻāĻŋāĻšā§āϛ⧇ āĻ•āĻŋ āύāĻžāĨ¤
  5. Cut-over: āϝāĻ–āύ āĻ•āύāĻĢāĻŋāĻĄā§‡āĻ¨ā§āϏ ā§§ā§Ļā§Ļ% āφāϏ⧇, āϤāĻ–āύ āϰ⧁āϟāĻŋāύ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰ⧇ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ⧇āϰ āϏāĻŦ āϰāĻŋāĻĄ/āϰāĻžāχāϟ āĻĒ⧁āϰ⧋āĻĒ⧁āϰāĻŋ PostgreSQL āĻ āϰāĻžāωāϟ āĻ•āϰ⧇ āĻĻ⧇āϝāĻŧāĻž āĻšāϝāĻŧ āĻāĻŦāĻ‚ āĻĒ⧁āϰ⧋āύ⧋ Oracle āϞāĻŋāĻ—ā§āϝāĻžāϏāĻŋ āĻĄāĻžāϟāĻžāĻŦ⧇āϏāϟāĻŋāϕ⧇ āϟāĻžāĻ°ā§āĻŽāĻŋāύ⧇āϟ āĻ•āϰ⧇ āĻĻ⧇āϝāĻŧāĻž āĻšāϝāĻŧāĨ¤