קיים יחס של אחד לרבים קטנים (one-to-few), שבו נתונים קשורים מוגבלים, קטנים ונקראים לעיתים קרובות יחד.
→הטמע את הנתונים הקשורים כאובייקט מקונן או מערך בתוך המסמך הראשי.
למה: ממטב את ביצועי הקריאה על ידי אחזור כל הנתונים הנדרשים בקריאה נקודתית אחת, ממזער עלות RU וחביון. נמנע מ-joins בצד הלקוח.
מקור↗
יחס של אחד לרבים (one-to-many) שבו צד ה"רבים" גדל ללא הגבלה או מתעדכן באופן עצמאי מצד ה"אחד".
→אחסן פריטים קשורים כמסמכים נפרדים והשתמש ב-ID של מסמך ההורה כהפניה.
למה: מונע ממסמכים לחרוג ממגבלת הגודל של 2 MB ונמנע מעלויות RU גבוהות עבור עדכונים במערכים מוטמעים גדולים.
מקור↗
מסמך מכיל מערך שיכול לגדול ללא הגבלה עם הזמן, מה שמסכן את מגבלת גודל המסמך של 2 MB (לדוגמה, יומני אירועים, תגובות).
→פצל את המערך על פני מספר מסמכי "bucket". כאשר bucket מגיע לסף גודל/פריטים, צור חדש.
למה: שומר על גודל מסמכים בודדים כניתן לניהול תוך שמירה על הקיבוץ הלוגי של נתונים קשורים.
מידול יחס רבים-לרבים (many-to-many), כגון סטודנטים וקורסים, או מאמרים ותגיות.
→עבור יחסים מוגבלים, שכפל נתוני יחס בשני הצדדים (לדוגמה, הטמע מזהי קורסים במסמך סטודנט, מזהי סטודנטים במסמך קורס). עבור יחסים בלתי מוגבלים, השתמש ב-container נפרד של "join" או "edge" document.
למה: Denormalization ממטבת עבור שני כיווני השאילתה (סטודנטים בקורס, קורסים לסטודנט) ללא צורך ב-joins. container של join מיועד למקרים בלתי מוגבלים.
מידול נתונים היררכיים (לדוגמה, תרשים ארגוני, קטגוריות מוצרים) וצורך לשאול עבור כל הצאצאים של צומת.
→אחסן מערך של כל מזהי האבות או שמותיהם (הנתיב) בכל מסמך.
למה: מאפשר שאילתות תת-עץ יעילות עם מסנן `ARRAY_CONTAINS` יחיד, ומונע בדיקות רקורסיביות יקרות.
למסמך יש מערך בלתי מוגבל (לדוגמה, תגובות בבלוג), אך השאילתה הנפוצה ביותר זקוקה רק לפריטי N האחרונים.
→הטמע תת-קבוצה של פריטים אחרונים במסמך הראשי ואחסן את כל הפריטים כמסמכים נפרדים המופנים.
למה: ממטב את נתיב הקריאה הראשי עבור ביצועים ועלות, תוך מתן אפשרות גישה למערך הנתונים המלא בעת הצורך.
אחסון רצף של אירועים בלתי ניתנים לשינוי עבור ישות וצורך לשאול עבור מצב נוכחי או צבירים אנליטיים.
→אחסן אירועים ב-container יחיד המחולק לפי מזהה הישות. השתמש ב-Change Feed או Synapse Link כדי לחשב ולאחסן views ממוטבים (materialized views) או צבירים.
למה: מספק תיעוד ביקורת מלא ומפריד את מודל הכתיבה ממודלי קריאה שונים, ומציע גמישות גבוהה.
יש צורך לשמר את מצב הנתונים הקשורים בנקודת זמן ספציפית (לדוגמה, כתובת לקוח בהזמנה).
→הטמע עותק (snapshot) של הנתונים הקשורים במסמך, במקום להפנות אליו.
למה: מבטיח דיוק היסטורי על ידי הפרדת המסמך משינויים עתידיים בנתונים המופנים.
קליטת נתוני סדרות זמן בתדירות גבוהה (לדוגמה, קריאות חיישני IoT) וביצוע שאילתות לפי מכשיר על פני טווחי זמן.
→השתמש ב-ID של המכשיר כמפתח המחיצה. צבר קריאות למסמכים מחולקי זמן (לדוגמה, שעתיים או דקות) במקום מסמך אחד לכל קריאה.
למה: מפחית באופן דרמטי את ספירת המסמכים ואת RU הכתיבה, תוך מיקום משותף של נתונים עבור שאילתות טווח זמן יעילות בתוך מחיצה.
יש צורך לבצע מספר פעולות יצירה, עדכון או מחיקה כטרנזקציה אטומית יחידה.
→השתמש בתכונת TransactionalBatch של ה-SDK. כל הפעולות חייבות להיות ממוקדות לאותו מפתח מחיצה לוגי.
למה: מספק הבטחות ACID עבור עד 100 פעולות בתוך מחיצה אחת, ומבטיח שכל הפעולות מצליחות או שכולן נכשלות יחד.
מסמכים צריכים להימחק אוטומטית מ-container לאחר תקופה מסוימת (לדוגמה, 30 יום).
→הפעל Time to Live (TTL) ב-container והגדר את ערך ה-`ttl` ברירת המחדל בשניות (לדוגמה, 2592000 ל-30 יום). `ttl` של -1 במסמך בודד עוקף את ברירת המחדל ומונע פקיעת תוקף.
למה: TTL הוא תכונה ללא עלות המשתמשת ב-RUs עודפים לביצוע מחיקות רקע, ומספקת דרך יעילה וללא מגע אדם לניהול מחזור חיי נתונים.
יש צורך לאחסן אובייקטים בינאריים גדולים (תמונות, סרטונים, מסמכים > 2 MB) המשויכים למטא-דאטה של Cosmos DB.
→אחסן את האובייקט הבינארי ב-Azure Blob Storage. אחסן את ה-URI ל-blob במסמך Cosmos DB יחד עם המטא-דאטה.
למה: Cosmos DB ממוטב עבור מטא-דאטה מובנה ובעל מגבלת מסמך של 2 MB. Blob Storage הוא שירות חסכוני וסקאלבילי לאחסון אובייקטים גדולים.