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. אילו אינדקסים קריטיים תצרו?