לדלג לתוכן

4.3 - מסד נתונים בהיקף - תרגול

Read Replicas

תרגיל 1

כתבו SmartDBRouter שמנהל primary ו-replicas:

  • כתיבות תמיד לprimary
  • קריאות מתחלקות בין replicas
  • אם כל הreplicas לא זמינות - קריאה מהprimary כgraceful fallback
  • מדפיס לlog לאיזה שרת כל בקשה הלכה

השתמשו ב-dictionaries כ"מסד נתונים" לדמו.

Sharding

תרגיל 2

מימשו ShardManager שמנהל 4 shards:

class ShardManager:
    def __init__(self, num_shards: int = 4):
        # each shard is just a simple list for the demo
        self.shards = [[] for _ in range(num_shards)]

    def get_shard_index(self, user_id: int) -> int:
        ...

    def store_task(self, task: dict):
        # task must contain owner_id
        ...

    def get_tasks(self, user_id: int) -> list:
        ...

    def get_all_tasks(self) -> list:
        # for admin purposes - reaches all shards
        ...

    def get_distribution_stats(self) -> dict:
        # how many tasks in each shard
        ...

לאחר מכן הוסיפו 100 tasks עם user_ids אקראיים, הדפיסו את get_distribution_stats() וודאו שהפיזור סביר.

אינדקסים

תרגיל 3 - ניתוח queries

עבור כל query, הציעו אינדקס מתאים והסבירו למה:

-- Query 1
SELECT * FROM tasks WHERE status = 'in_progress' AND owner_id = 5;

-- Query 2
SELECT * FROM tasks WHERE due_date < '2026-04-01' AND status != 'done';

-- Query 3
SELECT COUNT(*) FROM tasks GROUP BY project_id, status;

-- Query 4
SELECT * FROM tasks WHERE title LIKE '%באג%';

שאלות עיצוב

תרגיל 4

TaskFlow גדלה ל-5 מיליון משתמשים. יש לה:
- 200 מיליון משימות
- 50 מיליון tasks נוצרים כל יום
- 80% מהבקשות הן קריאות

תכננו את ארכיטקטורת מסד הנתונים:
1. כמה shards תצטרכו?
2. כמה replicas לכל shard?
3. על איזה שדה תבצעו sharding ולמה?
4. אילו אינדקסים קריטיים תצרו?