לדלג לתוכן

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):
        # כל shard הוא list פשוטה לצורך הדמו
        self.shards = [[] for _ in range(num_shards)]

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

    def store_task(self, task: dict):
        # task חייב להכיל owner_id
        ...

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

    def get_all_tasks(self) -> list:
        # לצרכי admin - פונה לכל ה-shards
        ...

    def get_distribution_stats(self) -> dict:
        # כמה tasks בכל shard
        ...

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

אינדקסים

תרגיל 3 - ניתוח שאילתות

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

-- שאילתה 1
SELECT * FROM tasks WHERE status = 'in_progress' AND owner_id = 5;

-- שאילתה 2
SELECT * FROM tasks WHERE due_date < '2026-04-01' AND status != 'done';

-- שאילתה 3
SELECT COUNT(*) FROM tasks GROUP BY project_id, status;

-- שאילתה 4
SELECT * FROM tasks WHERE title LIKE '%באג%';

שאלות עיצוב

תרגיל 4

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

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