JavaRush /בלוג Java /Random-HE /ראיון מפתח: ניתוח שאלות מאגר מידע

ראיון מפתח: ניתוח שאלות מאגר מידע

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

1. מהם מאגרי מידע? לאילו סוגים הם מחולקים?

מה הכוונה ב-DBMS?

ראיון מפתח: ניתוח שאלות מסד נתונים - 2מסד נתונים (DB) הוא מבנה מאורגן המיועד לאחסון, שינוי ועיבוד מידע הקשור זה לזה, בעיקר נפחים גדולים. במילים אחרות, מסד נתונים הוא אחסון נתונים מובנה. לדוגמה, ספר טלפונים.

סוגי מסדי נתונים

  1. מסד נתונים יחסי הוא אוסף של נתונים עם קשרים מוגדרים מראש ביניהם. הנתונים מאוחסנים כקבוצה של טבלאות המורכבת מעמודות ושורות. טבלאות מאחסנות מידע על האובייקטים המיוצגים במסד הנתונים. כל עמודת טבלה מאחסנת סוג נתונים ספציפי, וכל תא מאחסן ערך תכונה.
  2. מערכות לא יחסיות (NoSQL) הן מערכות המיועדות למודלים ספציפיים של נתונים עם סכמות גמישות. במילים אחרות, אלו הם מסדי נתונים המאחסנים נתונים לא בצורה של סכמות טבלאות, שורות ועמודות, אלא בפורמטים אחרים.
תוכל לקרוא עוד על מסדי נתונים לא-רלציוניים במאמר זה: מדריך ל-NoSQL למפתחים . מערכת ניהול מסד נתונים (DBMS) היא מערכת תוכנה שבעזרתה המשתמש יכול ליצור מסדי נתונים (DBs) ולבצע בהם פעולות שונות: השלמה, עדכון, מחיקה, בחירה וכו'. ה-DBMS מבטיח את הבטיחות, השלמות, האבטחה של אחסון נתונים ומאפשר לך להעניק גישה לניהול מסד נתונים. כדוגמה, MySql הוא DBMS המספק גישה למסד נתונים יחסי או MongoDB עבור מסד נתונים לא יחסי.

2. מהי נורמליזציה? צורה מנורמלת? כמה צורות של נורמליזציה יש? תן שם לשלושת הראשונים.

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

3. דנורמליזציה

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

4. אינדקסים

אינדקס הוא קבוצה ממוינת של ערכים המשויכים לטבלה או לתצוגה עם עמודה ספציפית שמאיצה את אחזור הנתונים. כלומר, זהו סוג של אינדקס: כמו האלפבית בספר טלפונים, שעוזר לנו בחיפוש לפי שם משפחה. אם משתמשים בה נכון, תכונה זו יכולה לשפר מאוד את הביצועים בעבודה עם מסדי נתונים גדולים. או שאתה יכול להוריד אותו הרבה. כדי להאיץ את החיפוש, מפתחות אלו מאוחסנים במבנה עץ מאוזן שדרכו מתבצע החיפוש. ככלל, יש להזין אינדקסים בשדות שמחפשים לרוב. אתה צריך לחשוב על יצירת אינדקס לא מוקדם יותר מאשר כאשר יש לך לפחות 10 אלף רשומות. אחרת, לא תראה תוצאה בולטת, מכיוון שאופטימיזציה מוקדמת היא EVIL . ואיך אינדקס יכול להשפיע על ביצועי המערכת, אתם שואלים? כאשר מוסיפים נתונים חדשים או נתונים ישנים נמחקים, מבנה העץ המאוזן יחושב מחדש. למעשה, ככל שיש יותר נתונים ואינדקסים, כך צריך לספור יותר עצים. תארו לעצמכם את המצב: יש לכם בערך 20,000 רשומות ו-7 אינדקסים על הטבלה הזו. כלומר, כשמכניסים נתונים, צריך לחשב מחדש 7 עצים, כל אחד עם 20,000 רשומות. באופן קפדני, שימוש באינדקסים לטבלאות שאליהן יתווספו/ימחקו נתונים תדיר אינו מומלץ כלל. לבסוף, ברצוני לציין כי אינדקסים עבור עמודות בהן נמצא הערך לעיתים קרובות nullלא יהיו יעילים באותה מידה, ולכן לא כדאי להוסיף אותם לעמודות כאלו.

מה ההבדל בין אינדקסים מקובצים ולא מקובצים ב-SQL?

אשכול:

  • מספק סדר פיזי עבור השדה הנבחר;
  • אם לטבלה יש אינדקס מקובץ, נאמר שהיא מקובצת;
  • אין צורך ביותר מאינדקס אחד לטבלה;
  • ב-MySQL, אינדקס אשכול לא מצוין במפורש על ידי המשתמש, מכיוון שאם אתה לא מגדיר PRIMARY KEY בטבלה שלך, MySQL מוצא את האינדקס הראשון UNIQUEשבו כל עמודות המפתח נמצאות NOT NULL, ו-InnoDB משתמש בו בתור האינדקס המקובץ.

לא מקובצים:

  • עד 999 אינדקסים לא מקובצים אפשריים בכל טבלה;
  • מכיל מצביע לשורות עם נתונים אמיתיים בטבלה;
  • אינו מספק סדר פיזי;
  • עבור אינדקסים לא מקובצים, יש טבלאות נפרדות עם נתונים ממוינים, כלומר, טבלה אחת עבור עמודה אחת שבה ממוקם האינדקס, לכן, כאשר מבקשים נתונים שאינם חלק משדה נתון, השאילתה תתבצע תחילה ב- שדה בטבלה זו, ורק לאחר מכן השאילתה הנוספת כנגד שורה בטבלה המקורית.
יצירת אינדקס לא מקובץ:
CREATE INDEX index_name ON table_name(column_name)

6. מהו אינדקס מורכב?

אינדקס מורכב - בנוי עם שליחה למספר עמודות בו זמנית. במילים אחרות, זהו אינדקס מורכב המורכב ממספר עמודות. אינדקסים כאלה משמשים כאשר יותר מעמודה אחת מופיעה בשאילתה אחת. יצירת אינדקס מורכב:
CREATE INDEX index_name ON table_name(first_column_name, second_column_name, third_column_name)
בדרך כלל, האינדקסים האלה משמשים כאשר נתונים בעמודות מרובות קשורים באופן לוגי.

7. מהו מדד מכסה? אינדקס ייחודי?

אינדקס מכסה הוא אינדקס שמספיק כדי לענות על שאילתה מבלי לגשת לטבלה עצמה. באמצעות האינדקס הזה, אתה יכול לקבל את כל שורת הנתונים, אבל למעשה זה פשוט לא הכרחי. מכיוון שאתה לא צריך ללכת ישירות לטבלת המקור ויכול לענות רק באמצעות האינדקס, אינדקסים מכסים הם מעט מהירים יותר לשימוש. יחד עם זאת, אל תשכח שככל שיש יותר עמודות, כך המדד עצמו הופך למסורבל ואיטי יותר. אז אתה לא צריך לנצל את זה לרעה. למעלה דיברנו על אינדקסים מקובצים ולא מקובצים, שיכולים להיות ייחודיים . המשמעות היא שאין שני שדות בעלי אותו ערך עבור מפתח האינדקס. אחרת, האינדקס לא יהיה ייחודי, מכיוון שמספר שורות עשויות להכיל את אותו ערך. דוגמה ליצירת אינדקס ייחודי שאינו מקובץ:
CREATE UNIQUE INDEX index_name ON table_name(column_name)

8. מהו מפתח ראשוני

מפתח ראשי הוא שדה בטבלה המזהה כל שורה בטבלת מסד נתונים. יכול להיות רק שדה אחד כזה בטבלה, וכל הערכים חייבים להיות ייחודיים. לא הזכיר לך כלום? ראיון מפתח: ניתוח שאלות מסד נתונים - 3אחרי הכל, מפתח ראשי הוא לא יותר מאשר אינדקס ייחודי ומקובץ . ככלל, מפתחות ראשיים נוצרים בעת יצירת טבלה:
CREATE TABLE table_name(
column_name int PRIMARY KEY,..)
הגבלה תתווסף אוטומטית לעמודה זו - NOT NULL. אתה יכול גם להגדיר מפתח לטבלה שכבר נוצרה:
ALTER TABLE table_name ADD PRIMARY KEY (column_name);
אם מפתח ראשי נוסף באופן המתואר לעיל, ערכי השדות שצוינו כמפתח ראשי ( column_name) נבדקים כדי לוודא שהם אינם מכילים ערכי null (גם אילוץ יתווסף - NOT NULL).

מהו מפתח זר?

מפתח זר הוא מאפיין שנוצר כדי לספק קשר בין טבלאות. בדרך כלל, מפתח זר מוגדר על עמודות בטבלת משנה ומצביע על אחת העמודות מהטבלה הראשית. ניתן לציין כמו בעת יצירת טבלה:
CREATE TABLE table_name{
column_name int,..
FOREIGN KEY(column_name) REFERENCES another_table_name(another_table_column_name) }
אז לאחר יצירת הטבלה:
ALTER TABLE table_name
ADD FOREIGN KEY(column_name) REFERENCES another_table_name(another_table_column_name));
אתה יכול להגדיר את ההתנהגות של מפתח זר בעת מניפולציה של השדה שאליו הוא מתייחס. ON DELETEמניפולציות יכולות להיות מהסוגים הבאים ON UPDATE: אפשרויות התנהגות אפשריות:
  • CASCADE- עם מאפיין זה, שורות מהטבלה התלויה יימחקו או ישתנו אוטומטית כאשר שורות קשורות יימחקו או ישתנו בטבלה הראשית;
  • SET NULL- עם מאפיין זה, כאשר שורה קשורה נמחקת או מעודכנת מהטבלה הראשית, הערך NULLעבור עמודת המפתח הזר יוגדר;
  • NO ACTION- דוחה ניסיונות למחוק או לשנות שורות בטבלה הראשית אם יש שורות קשורות בטבלה התלויה;
  • RESTRICT- שווה ערך ל NO ACTION;
  • SET DEFAULT- עם מאפיין זה, כאשר שורה קשורה נמחקת או מעודכנת מהטבלה הראשית, ערך ברירת המחדל (אם קיים) עבור עמודת המפתח הזר יוגדר.
דוגמה לשימוש:
CREATE TABLE table_name{
column_name int,..
FOREIGN KEY(column_name) REFERENCES another_table_name(another_table_column_name) ON UPDATE CASCADE ON DELETE CASCADE }
ON DELETEאם ההתנהגות עבור ולא מוגדרת במפורש ON UPDATE, ההתנהגות תוגדר ל- RESTRICT.

10. סוגי חיבורים בין טבלאות (הצטרפות)

החיבור בין הטבלאות ניתן על סמך נתונים משותפים (שדות). זה קורה באמצעות אופרטור JOIN, פעולה התאמת שורות מטבלה אחת עם שורות בטבלה אחרת. המיפוי נעשה כך שהעמודות של שתי הטבלאות צמודות, אם כי ניתן לקבל אותן מטבלאות נפרדות. ואם יש לנו שדות משותפים לשלוש טבלאות, נוכל להציג את הנתונים שלהם כטבלה אחת משותפת. עם זאת, כדאי לקחת בחשבון שככל שיצטרפו פחות טבלאות, כך השאילתה תפעל מהר יותר. אז הסוגים JOIN:
  • INNER JOIN- חיבור שמציג רק את הנתונים מהטבלה הראשונה התואמים לכמה נתונים מהטבלה השנייה. השאר יורדים.ראיון מפתח: ניתוח שאלות מסד נתונים - 4
  • LEFT JOIN- חיבור שמציג את כל הנתונים מהטבלה הראשונה והנתונים המתאימים מהשנייה, אם יש כאלה. אם אין נתונים מתאימים, השדות לנתונים מהטבלה השנייה יהיו ריקים.ראיון מפתח: ניתוח שאלות מסד נתונים - 5
  • RIGHT JOIN- חיבור שמציג את כל הנתונים מהטבלה השנייה ואת הנתונים התואמים מהראשונה, אם יש. אם אין נתונים מתאימים, השדות של הנתונים מהטבלה הראשונה יהיו ריקים.ראיון מפתח: ניתוח שאלות מסד נתונים - 6
  • FULL JOIN- חיבור המציג את כל הנתונים מהטבלה הראשונה והשנייה. אם אין נתונים קשורים בטבלה האחרת, השדות של נתונים אלה יהיו ריקים.ראיון מפתח: ניתוח שאלות מסד נתונים - 7
  • CROSS JOIN- חיבור צולב שבו כל שורה של הטבלה הראשונה מחוברת לכל שורה של הטבלה השנייה (כל אחת לכל אחת). כלומר, אם לשתי טבלאות יש 3 שורות כל אחת, לאחר הצטרפות זו נקבל תוצאה של 9 שורות.ראיון מפתח: ניתוח שאלות מסד נתונים - 8
דוגמא Join(inner):
SELECT *
FROM first_table
INNER JOIN second_table ON first_table.some_column = second_table.some_column

11. מהו מאפיין ACID במסד נתונים?

A - Atomity , מבטיח ששום עסקה לא מחויבת חלקית למערכת. או שכל פעולות המשנה שלו מבוצעות, או אף אחת. לדוגמה, העברת כסף מבנק לחשבון אחר כרוכה בשתי פעולות:
  1. העבר כסף לחשבון בנק.
  2. העבר כסף מחשבון בנק לחשבון ספציפי.
אבל הכל יכול לקרות. לדוגמה, הם ילכו לבנק, ואז תתרחש שגיאה כלשהי והפעולה השנייה לא תושלם. או להיפך: רק הפעולה השנייה תתבצע. לכן, פעולות אלו מבוצעות בתוך עסקה אחת, והתוצאה היא הכל או כלום. ג - עקביות : כל עסקה מוצלחת תמיד מתעדת רק תוצאות שניתנות לפתרון. זה מבטיח שכל ההגבלות מתקיימות (לדוגמה, NOT NULL), אחרת העסקה תוחזר לאחור. וגם - בידוד : במהלך ביצוע עסקה, עסקאות מקבילות לא אמורות להשפיע על התוצאה שלה. זה נותן לנו את היכולת להסתיר מצבי נתונים לא סופיים מכולם. למעשה, זו הסיבה שעסקאות לא מוצלחות אינן יכולות לשבור שום דבר. קצת יותר נמוך נכיר את רמות בידוד העסקאות. ד - עמידות : אם עסקה הושלמה, אז אתה יכול להיות בטוח שהשינויים שהיא ביצעה לא יבוטלו עקב כשל כלשהו.

12. רמות בידוד עסקאות

כל רמת בידוד מאפשרת/אוסרת פעולות מסוימות (הזדמנויות):
  • קריאת פנטום – בתוך אותה טרנזקציה, אותה בקשת נתונים נותנת תוצאות שונות, המתרחשות עקב הוספת נתונים על ידי טרנזקציה אחרת (מקבילה).
  • קריאה לא חוזרת - בתוך אותה עסקה, אותה בקשת נתונים נותנת תוצאות שונות, המתרחשות עקב שינוי או מחיקה של נתונים על ידי עסקה אחרת (מקבילה).
  • קריאה "מלוכלכת" - קריאת נתונים שנוספו או השתנו על ידי עסקה שלא יוחזרו לאחר מכן;
  • עדכון אבוד - כאשר טרנזקציות שונות משנות את אותו גוש נתונים בו-זמנית, כל השינויים מלבד האחרון הולכים לאיבוד (בדומה ל"מצב מירוץ" בריבוי פתילים).
מטעמי נוחות, אנו רואים את רמות הבידוד ואת היכולות שלהן בטבלה:
רמות בידוד קריאת פנטום קריאה לא חוזרת קריאה "מלוכלכת". עדכון אבוד
ניתן לסידרה + + + +
REPEATABLE_READ - + + +
READ_COMMITTED - - + +
READ_UNCOMMITTED - - - +

13. מהי הזרקת SQL?

הזרקת SQL היא אחת משיטות הפריצה לאתר אינטרנט, שמהותה היא הזרקת קוד SQL כלשהו לנתונים באמצעות GETשאילתות POSTאו Cookies. אם אתר אינטרנט מבצע הזרקות כאלה, אפשר לקבל גישה למסד הנתונים ולפרוץ לאפליקציה. לדוגמה, אנו יודעים את שמו של משתנה כלשהו. נגיד column_nameעם סוג boolean. אם המערכת רגישה להזרקות, נוכל להוסיף OR column_name=trueולאחר מכן לכתוב את כל מה שאנחנו צריכים מהמסד. ORייצור תנאי OR, והביטוי שלנו אחריו תמיד יהיה true, מה שיקח אותנו רחוק יותר. התקפה על אתר אינטרנט כמו הזרקת SQL אפשרית עקב עיבוד לא תקין של נתונים נכנסים המשמשים בשאילתות SQL. בעת חיבור למסד נתונים באמצעות JDBC , אתה משתמש במגוון Statements. כדי להגביר את האבטחה, יש צורך להשתמש PreparedStatementבמקום הרגיל Statement, שכן בעת ​​השימוש, Statementמחרוזות השאילתה והערכים פשוט מתווספים יחד, מה שמאפשר הזרקות. בתורו, יש PreparedStatementתבנית בקשה ספציפית, והנתונים מוכנסים לתוכה כשהמרכאות משתקפות. כתוצאה מכך, הזרקות SQL ייתפסו רק כייצוג מחרוזת של שדה כלשהו. כדי להגן מפני הזרקות SQL, אתה יכול להשתמש בבדיקות המבוססות על ביטויים רגולריים (תוכל לקרוא עוד על ביטויים רגולריים במאמר זה ). Собеседование разработчика: разбор вопросов по базам данных - 9אפשרות נוספת היא להגדיר הגבלה על מספר התווים של פרמטרים נכנסים: למשל, אם תקבל מספר לא יותר מ-9999, הגבלה של ארבעה תווים נכנסים תתאים. זה יקטין את הסיכון לפריצה באמצעות הזרקות SQL. תוכל ללמוד עוד על אבטחה ב-Java מהמאמר "אבטחה ב-Java: שיטות עבודה מומלצות" .

14. מהם נהלים מאוחסנים? פונקציות מאוחסנות? הדק?

פרוצדורות מאוחסנות ב-SQL הן ישות במסד הנתונים, שהוא קבוצה של הוראות SQL שנערכים פעם אחת ומאוחסנות בשרת. במילה אחת, זהו אנלוגי לשיטות בג'אווה. פרוצדורות מאוחסנות יכולות לבצע פעולות על נתונים, הן שאילתות רגילות והן פעולות מסוימות שאינן זמינות עבור שאילתות רגילות. פרוצדורה היא ישות SQL שנוצרת פעם אחת ואז נקראת על ידי העברת ארגומנטים. היתרון של גישה זו הוא שניתן לעשות שימוש חוזר בהוראות אלו יותר מפעם אחת. נהלים מאוחסנים משפרים ביצועים, משפרים את יכולות התכנות ותומכים בתכונות אבטחת נתונים. בואו נשקול ליצור נוהל:
CREATE PROCEDURE procedure_name (first_param some_type, second_param some_type..)
 begin
……...
 end
קורא לנוהל:
CALL procedure_name (first_param, second_param…..);
פונקציה מאוחסנת היא סוג של הליך מאוחסן. ההבדל בין פונקציה הוא שהיא תמיד מחזירה רק ערך בודד, בעוד פרוצדורה מחזירה קבוצה של ערכים. לא ניתן לערבב פרוצדורות מאוחסנות עם SQL רגיל, אבל פונקציה מאוחסנת יכולה - וזה היתרון שלה. מצד שני, לפונקציות מאוחסנות יש הרבה יותר מגבלות מאשר נהלים. יצירת פונקציה מאוחסנת:
CREATE FUNCTION function_name (first_param, second_param…..)
RETURNS some_type
 begin
……...
RETURN some_value;
end
קריאה לפונקציה מאוחסנת:
SELECT function_name(first_param, second_param…..);
טריגר הוא סוג אחר של פרוצדורה מאוחסנת שלא נקרא ישירות על ידי המשתמש, אלא מופעל כאשר הנתונים משתנים. כלומר, הליך זה מופעל כאשר מתקיימים תנאים מסוימים, כגון, INSERTאו DELETE, או UPDATEנתונים בעמודה מסוימת של טבלה נתונה. מתי מופעל טריגר נקבע באמצעות מילות המפתח BEFORE(טריגר מופעל לפני האירוע המשויך) או AFTER(אחרי האירוע).
CREATE TRIGGER trigger_name
ON table_name
AFTER INSERT
 begin
……...
 end

15. תרגול

כך או כך, שאלת ה-SQL הנפוצה ביותר בראיון תהיה תרגול – פתרון בעיות. אין טעם לנסות לנחש באילו משימות תתקלו, כי הכל תלוי בתחכום הדמיון של האדם ממול. לכן, אפשרות העבודה היחידה תהיה להשתפר בשאילתות SQL בעלות מורכבות משתנה. sql-ex.ru יכול לשמש כמשאב לתרגול במשימות שונות . לאחר עשרים המשימות הראשונות שהושלמו, יהיה די קשה לבן השיח שלך להפחיד אותך עם כל משימת SQL. Собеседование разработчика: разбор вопросов по базам данных - 11זה הכל להיום: אני מקווה שאחרי קריאת מאמר זה, שאלות על מסדי נתונים לא יגרמו לקשיים או בעיות. תודה על תשומת הלב ולהתראות שוב!
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION