דוגמנות נתונים בקסנדרה

1. סקירה כללית

קסנדרה הוא מסד נתונים NoSQL המספק זמינות גבוהה ומדרגיות אופקית מבלי לפגוע בביצועים.

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

במאמר זה נסקור כמה ממושגי המפתח בסביבה כיצד לגשת לדוגמנות נתונים בקסנדרה.

לפני שתמשיך, תוכל לעבור על המאמר שלנו על קסנדרה עם ג'אווה כדי להבין את היסודות וכיצד להתחבר לקאסנדרה באמצעות ג'אווה.

2. מפתח מחיצה

קסנדרה הוא מסד נתונים מבוזר בו הנתונים מחולקים ומאוחסנים על פני מספר צמתים בתוך אשכול.

מפתח המחיצה מורכב משדה נתונים אחד או יותר והוא משמש את המחיצה ליצירת אסימון באמצעות hashing להפצת הנתונים באופן אחיד על פני אשכול.

3. מפתח אשכולות

מפתח אשכול מורכב משדה אחד או יותר ומסייע באשכולות או בקיבוץ שורות עם אותו מפתח מחיצה ובאחסונם לפי סדר מיון.

בואו נגיד שאנחנו שומרים נתונים על סדרות זמן בקסנדרה ואנחנו רוצים לאחזר את הנתונים בסדר כרונולוגי. מפתח אשכולות הכולל שדות נתונים מסדרות זמן יעזור מאוד לאחזור יעיל של נתונים למקרה שימוש זה.

הערה: השילוב של מפתח מחיצה ומפתח אשכולות מהווה את המפתח הראשי ומזהה באופן ייחודי כל רשומה באשכול קסנדרה.

4. הנחיות סביב דפוסי שאילתות

לפני שמתחילים במודל נתונים בקסנדרה, עלינו לזהות את דפוסי השאילתות ולוודא שהם עומדים בהנחיות הבאות:

  1. כל שאילתה צריכה להביא נתונים ממחיצה אחת
  2. עלינו לעקוב אחר כמות הנתונים שנשמרים במחיצה, מכיוון שלקסנדרה יש מגבלות סביב מספר העמודות שניתן לאחסן במחיצה אחת.
  3. זה בסדר לבטל את נורמליזציה ולשכפל את הנתונים כדי לתמוך בסוגים שונים של דפוסי שאילתה על פני אותם נתונים

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

5. דוגמאות למודל נתונים של עולם אמיתי

5.1. פוסטים בפייסבוק

נניח שאנו שומרים פוסטים בפייסבוק של משתמשים שונים בקאסנדרה. אחד מדפוסי השאילתות הנפוצים יהיה אחזור החלק העליון 'נ'פוסטים שנעשו על ידי משתמש נתון.

לכן, אנחנו צריכיםאחסן את כל הנתונים עבור משתמש מסוים במחיצה אחת בהתאם להנחיות הנ"ל.

כמו כן, שימוש בחותמת הזמן של ההודעה כמפתח האשכולות יעזור לאחזור החלק העליון 'נ'מפרסם ביעילות רבה יותר.

בואו נגדיר את סכמת הטבלה קסנדרה למקרה שימוש זה:

צור טבלה posts_facebook (user_id uuid, post_id timeuuid, text text, PRIMARY KEY (user_id, post_id)) עם סדר אשכול לפי (post_id DESC);

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

בחר תוכן מתוך posts_facebook WHERE user_id = "Anna_id" LIMIT 20

5.2. מכוני כושר ברחבי הארץ

נניח שאנו שומרים את פרטי מכוני הכושר השונים השונים בערים ובמדינות השונות של מדינות רבות ואנחנו רוצים להביא את מכוני הכושר לעיר מסוימת.

כמו כן, נניח שעלינו להחזיר את התוצאות כאשר מכוני כושר ממוינים לפי תאריך פתיחתם.

בהתבסס על ההנחיות לעיל, עלינו לאחסן את מכוני הכושר הממוקמים בעיר נתונה של מדינה ומדינה מסוימת במחיצה אחת ולהשתמש בתאריך הפתיחה ובשם חדר הכושר כמפתח אשכולות.

בואו נגדיר את סכמת הטבלה קסנדרה לדוגמא זו:

צור טבלה gyms_by_city (טקסט של קוד מדינה, טקסט מדינה, טקסט עיר, טקסט שם כושר, חותמת זמן של תאריך פתיחה, מקש ראשוני ((קוד מדינה, מדינה_מחוז, עיר), (תאריך פתיחה, שם כושר)) עם הזמנת אשכול לפי (פתיחת תאריך ASC, שם כושר ASC);

עכשיו, בואו נסתכל על שאילתה שתביא את עשרת מכוני הכושר הראשונים עד למועד פתיחתם לעיר פיניקס במדינת אריזונה בארה"ב:

בחר * FROM gyms_by_city WHERE country_code = "us" AND state = "Arizona" AND city = "Phoenix" LIMIT 10

לאחר מכן, בואו נראה שאילתה שמביאה את עשרת מכוני הכושר שנפתחו לאחרונה בעיר פיניקס במדינת אריזונה בארה"ב:

בחר * FROM gyms_by_city WHERE country_code = "us" and state = "Arizona" and city = "Phoenix" סדר לפי תאריך פתיחה DESC LIMIT 10

הערה: מכיוון שסדר המיון של השאילתה האחרונה מנוגד לסדר המיון שהוגדר במהלך יצירת הטבלה, השאילתה תפעל לאט מכיוון שקסנדרה תחזור תביא את הנתונים ואז תמיין אותם בזיכרון.

5.3. סחר אלקטרוני לקוחות ומוצרים

נניח שאנחנו מנהלים חנות מסחר אלקטרוני ושאנחנו מאחסנים את צרכן ו מוצר מידע בתוך קסנדרה. בואו נסתכל על כמה מדפוסי השאילתות הנפוצים סביב מקרה שימוש זה:

  1. לקבל צרכן מידע
  2. לקבל מוצר מידע
  3. קבל הכל לקוחות שאוהבים נתון מוצר
  4. קבל הכל מוצרים נתינה צרכן אוהב

נתחיל באמצעות טבלאות נפרדות לאחסון ה- צרכן ו מוצר מֵידָע. עם זאת, עלינו להציג כמות נכבדה של דנורמליזציה כדי לתמוך בשאילתות השלישית והרביעית המוצגת לעיל.

ניצור שני טבלאות נוספות כדי להשיג זאת - "לקוח_מוצר"ו"מוצר_על_לקוח“.

בואו נסתכל על סכימת השולחן קסנדרה לדוגמא זו:

צור טבלה לקוח (טקסט cust_id, טקסט שם פרטי, טקסט שם משפחה, רשום_על חותמת זמן, מפתח ראשי (cust_id)); צור טבלה מוצר (טקסט prdt_id, טקסט כותרת, מפתח ראשי (prdt_id)); צור טבלה Customer_By_Liked_Product (טקסט 'אהבתי', טקסט 'אהבתי' על חותמת זמן, טקסט כותרת, טקסט מותאם אישית, טקסט שם פרטי, טקסט שם משפחה, מפתח עיקרי (prdt_id, 'אהבתי'); צור טבלה Product_Liked_By_Customer (טקסט מותאם אישית, טקסט שם פרטי, טקסט שם משפחה, טקסט 'אהבתי', טקסט 'אהבתי', טקסט כותרת, מפתח עיקרי (cust_id, 'אהבתי');

הערה: כדי לתמוך בשאילתות, מוצרים שאהבו לאחרונה על ידי לקוח נתון ולקוחות שאהבו לאחרונה מוצר נתון, השתמשנו בסעיף "אהבתי_עלהעמודה כמפתח אשכולות.

בואו נסתכל על השאילתה כדי למצוא את עשרת הלקוחות שאהבו לאחרונה את המוצר “פפסי“:

בחר * FROM Customer_By_Liked_Product WHERE title = "Pepsi" LIMIT 10

ובואו נראה את השאילתה שמוצאת את המוצרים שאהבו לאחרונה (עד עשרה) על ידי לקוח בשם "אנה“:

בחר * FROM Product_Liked_By_Customer WHERE first_name = "Anna" LIMIT 10

6. דפוסי שאילתות לא יעילים

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

  • אחזור נתונים ממספר מחיצות - זה ידרוש מתאם להביא את הנתונים ממספר צמתים, לאחסן אותם באופן זמני בערימה ואז לצבור את הנתונים לפני החזרת התוצאות למשתמש
  • שאילתות מבוססות הצטרפות - בשל אופיו המופץ, קסנדרה אינה תומכת בהצטרפות טבלאות לשאילתות באותה צורה שמאגר נתונים יחסי, וכתוצאה מכך, שאילתות עםההצטרפות תהיה איטית יותר ויכולה גם להוביל לבעיות בחוסר עקביות וזמינות

7. מסקנה

במדריך זה, סקרנו כמה שיטות עבודה מומלצות לגבי אופן הגישה למודל נתונים בקסנדרה.

הבנת מושגי הליבה וזיהוי דפוסי השאילתות מראש נחוצים לעיצוב מודל נתונים נכון שמקבל את הביצועים הטובים ביותר מאשכול קסנדרה.


$config[zx-auto] not found$config[zx-overlay] not found