ברוכים הבאים לסדרת פרקים על שפת השאילתות - SQL
ומסדי נתונים.
הפרק הזה יתמקד בבסיס ובכניסה לעולם מסדי הנתונים.
מסדי נתונים הם רכיבי תוכנה - תוכנות כמו שאנחנו מכירים, אשר נותנים לנו יכולות אחסון ואחזור על מידע.
המידע הקלאסי הוא מידע מסוג טבאלי או בשפה המקצועית - relational database
.
הדוגמא הקלאסית היא שאתם נכנסים לאתר ונרשמים למערכת.
אתם מגישים להם את השם שלכם והגיל שלכם והאתר מעבד את המידע.
מה הגישה שבדרך כלל מתבצעת?
האתר שולח את המידע לשרת כלשהו.
השרת הזה אוגר את המידע במשהו שנקרא - מסד נתונים.
מה מסד הנתונים הזה נותן לנו? למה לא לשמור את המידע לקובץ וזהו?
למה לא לשמור את המידע לקובץ?
נניח ואנחנו רוצים פתרון פשטני ונשמור את האדם לקובץ.
כעת נצטרך להחליט:
לאחזר זה אומר לשלוף את המידע חזרה וחיפוש עליו.
הפתרון הפשוט הוא לשמור את זה לפי שם האדם.
יש לנו את השרת,
נכתוב שכבת קוד המטפלת בשמירה וטעינה של קבצים.
אם רוצים לאחזר את המידע לפי שם האדם זה מאוד קל כי זה שם הקובץ, אתם ניגשנים לפי השם ומוציאים את המידע.
הפתרון הראשון מציע פתרון לשני בעיות הכי פשוטות במסדי נתונים:
אחזור של מידע הוא תהליך סטנדרטי של הבאת המידע ע”פ קריטריונים מסוימים.
כמו שתיארנו השלב הראשון הוא ללא כל קריטריון.
השלב השני הוא ע”פ קריטריון בסיס - פיסת מידע המאפשרת לנו לאחזר, כמו שם של אדם.
מה ייקרה אם לשני אנשים יש את אותו השם?
ניתן ליצור מזהה ייחודי ולשלוף על פיו, כמו תעודת זהות, אין שני אנשים עם אותו מספר תעודת זהות.
בשלב השלישי אנחנו עוברים מקריטריון בודד לכמה קריטריונים.
אנחנו לא שולפים את המידע על מנת לשלוף עצם בודד, אלה רוצים להתייחס למידע ככלל.
במקום אדם בודד - כל האנשים.
ועכשיו נשאל שאלה -
אני רוצה לדעת כמה אנשים יש בטווחי הגילאים 20-40.
איך אני עושה את זה בפתרון הפשוט?
כעת נכתוב קוד כזה בפייתון:
1 | import os |
תנאים הם דבר הכרחי לאחזור מידע, בדרך כלל יעניין אותנו סוגים שונים של תשובות ולא רק תשובה בודדה.
אם נבדוק את אורך הרשימה נדע כמה אנשים הם בני 20 עד 40.
האתר מרחיב את פעילותו והדרישה כעת להוסיף גם מקומות.
אז באותה הדרך נשמור קבצים לאנשים וקבצים למקומות:
יש לנו סכימה לאיך לשמור את הקבצים ואיך לאחזר אותם.
מה קורה אם צריך להוסיף מידע חדש?
פשוט מוסיפים סוגי קבצים חדשים למערכת.
שימו לב לאיך הרחבנו את שכבת הקבצים, במקום לשמור הכל בזיכרון או בקובץ אחד,
בנינו מערכת המסוגלת לשמור ולשלוף קבצים ע”פ פרמטרים ולהריץ עליהם תנאים!
במקום מערכת קבצים למערכות כאלו קוראים - מסדי נתונים.
וזה מה שמסד נתונים מעניק לנו, את היכולת לשמור מידע בצורה מסוימת בפורמט מסוים ולאחזר עליו.
בשנים האחרונות חל שינוי גדול בהתנהגות ומהות מסד הנתונים.
בדוגמא שראינו שמרנו מידע מאוד בסיסי ופשוט ולא הרחבנו מעבר את היכולות של מסד הנתונים.
בנוסף כתבנו יכולת לאחזר את המידע - מסדי נתונים מעניקים יכולת לאיך לשלוף את המידע.
ואפילו יכולות נוספות כגון שפה לשליפה, מנגנון פרוצדורות שמור, אינדקוס המידע וכדו’…
ככל שהתרחבו התעשיות ועוד ועוד דומיינים דרשו פתרונות תוכנה נכנסו מגוון פתרונות למסדני נתונים.
נתחיל ונחזור על המסד נתונים הפשטני והמוכר - Relational Database Managment System
(RDBMS).
המידע שנשמר שם מסוג טבלה עם שורות ועמודות.
שורה זה מופע חדש של המידע.
וכל עמודה שומרת תכונה על המידע שנשמר.
למשל טבלה של אנשים עם המזהה שלהם, השם והגיל:
כל סוג מידע חדש אתם בעצם פותחים טבלה חדשה - תדמיינו אקסל על סטרואידים - משהו כזה.
מסדי נתונים מסוג רלציוני מעניקים לנו שפה ייחדות לשליפות.
אפשר לקרוא לזה “שפת שליפות מובנית” או באנגלית - SQL
.
יש כאלו המבטאים כל אות בנפרד - S.Q.L
,
או קוראים את זה כ-Seqeuel
.
השפה כתובה בצורה די פשטנית ונותנת לנו יכולות שליפה, ביצוע תנאים, אגרגציה ואף ניהול ותמיכה במסד נתונים.
כגון שינוי הקצאות זיכרון, בדיקת יוזרים וכדו’.
למשל אם נרצה לשלוף את כל המידע על טבלת אנשים:
1 | SELECT * FROM PEOPLE |
“לבחור את כל העמודות מטבלת האנשים”.
זוהי השפה שבה אנו נעסוק, ונגוון עם כל מיני מסדי נתונים התומכים בשפה הזו.RDBMS
הוא לא מוצר ספציפי אלה סוג של מסד נותנים, עליו נלמד.
MySQL
Microsoft SQL Server
OracleDB
PostgreSQL
SQLite
MariaDB
זהו גם מסד נתונים אך הוא מאגד נתונים לא בצורת טבלאות עם שורות ועמודות, אלה קובע סוג אחר של מידע אשר נשמר שם.
גם כך יכולות האחזור שלו שונות ובדרך כלל כל מסד נתונים מתאים לדומיין אחר.
אחד מהמסדים הבולטים בתחום הוא MongoDB
אשר שומר את הפריטים בפורמט Json
.
ומאפשר לאחזר ע”פ שפת שאילתות מבוססת json
עם שליפה עם JPath
.
עוד מסד נתונים המאפשר גם שליפות בעזרת שפת SQL
:
Couchbase Server
כאשר לא מעוניינים לשמור מסמכים שלמים אלה רק מפתח עם ערך מסוים, סוגי המסדי נתונים האלו מועילים לנו.
לעיתים אנחנו נשתמש בהם כיכולת לשמור זיכרון מטמון (Cache) במקום אשכרה כמסד נתונים לכל דבר.
אחד המוצרים הפופולריים בתחום הזה נקרא Redis.
צורת מידע לשמירת גראפים, כאשר גרף מוגדר כאוסף נקודות או Node
ים עם קישוריות בין שני נקודות.
כל קישור מהווה “קשר” מסוים ולו מתווסף פרמטר הנקרא משקולת - או כמה חזק הקשר בין השניים.
לדוגמא אתם יכולים לתאר את המערכות היחסים שלכם עם אנשים שונים, לחלקם יהיה קשר חזק יותר ולחלקם קשר חלש יותר.
עם מכרים מהעבודה או מהאוניברסיטה יהיה לכם קשר יחסית חלש,
עם המשפחה שלכם ככל הנראה הקשר יהיה חזק יותר.
מסד נתונים פופולרי הוא ה-GraphDB.
מסד נתונים העובד על מידע בנקודות זמן שונות.
איזה סוג של מידע יכול להתאים פה?
בעצם כל מקום שבו אינטרוול זמן הוא חשוב, ניתן להשתמש במסד נתונים היעיל בזמנים.
המסד הנתונים הפופולרי בתחום הוא InfluxDB.
מסדי נתונים אלו מאופיינים ביכולות האינדוקס הטובות שלהם.
אינדוקס זהו תהליך של שמירת המידע כדי לשלוף אותו מהר יותר.
אנחנו מגדירים לפיסות מידע שונות מה אנחנו רוצים לאנדקס ועל פי הבקשה הזו נוכל לאנדקס את זה בצורה יעילה יותר.
לטובת קריאה מהירה יותר, או כתיבה מהירה יותר.
למשל אם אקח את דוגמת שמירת הקבצים שדיברנו עליה בפוסט הזה, הקבצים נשמרים לפי השם.
1 | alice.txt |
נניח ויש שני אנשים עם אותו שם, אז נשים מספרים עם השם כדי לדעת שאלו אנשים שונים:
1 | alice.txt |
נניח אני רוצה לקרוא רק מי שקוראים לו bob
.
אני יכול לאנדקס את השמות לתיקיות על פי השם:
1 | \a |
עכשיו אם ארצה לקחת את כל הבובים זה יהיה מאוד קל כי פשוט אגד לתיקיית \b\o\b\
ואקח את כל הקבצים משם.
אחד ההמצאות הישראליות הגדולות בשנים האחרונות הוא מנוע ה-ElasticSearch
- https://www.elastic.co/elasticsearch
רוב המנועים האלו יודעים לאחזר ולאנדקס כמויות של טקסט.
למשל עבור אנדוקס תגובות בפייסבוק, ככה שפייסבוק יכולים לחפש על פי תוכן התגובות.
חלק מהמסדים שהזכרתי עובדים יפה עבור כמות גדולה של מידע.
אך יש כמות מידע שנהיית כל כך גדולה שזה כבר לא מתאים למסדי נתונים.
במיוחד אם אנחנו רוצים לאחזר ולחפש על פי תוכן לא סטנדרטי כמו סרטונים, טקסט, מידע על פי זמן וכדו’..
אחד הפיתוחים הפופולריים בתחום הוא ה-Hadoop
.
בשיטת ה-Map-Reduce
הם יכולים לאחזר על כמויות עצומות של מידע בלתי תלוי.
הם אפילו פיתחו מערכת קבצים משל עצמם הנקראת HDFS
.
אנחנו נדגים את מסדי הנתונים בעזרת פייתון ו-SQLLite
.
SqLite
זהו סוג מסד נתונים מאוד פשוט הנותן לשמור את הכל לתוך קובץ אחד.
שכבת ה-sqlite
היא שמנהלת עבורנו את הכל.
נכתוב סקריפט פשוט המתחבר לקובץ ויוצר טבלה עבור שמירת אנשים.
שימו לב שאנחנו משתמשים ב-import sqlite3
המגיעה כבר עם פייתון.
1 | import sqlite3 |
השפה מגדירה תחביר המתאר פקודות למסד נתונים.
כל בקשה כזו נקראת שאילתא.
רוב השאילתות שלנו ייראו כך:
COMMAND
<info>
SUB-COMMAND
<info>
כל פקודה תקבל פרמטרים מסוימים או תתייחס לטבלה מסוימת.
למשל:
SELECT * FROM people
SELECT
- לבחור מהטבלה*
- אילו עמודות, כוכבית אומר תיקח הכל אבל היינו יכולים לכתוב אחרת.FROM
- מאיזו טבלהperson
- טבלת אנשים
ניתן היה לשכתב את זה גם כך:SELECT id,name,age FROM people
.
השאילתות נותנות לנו יכולות אחזור אך תזכרו שאנחנו צריכים לבצע דברים אחרים:
כמה נקודות:
1 | CREATE TABLE people( |
CREATE TABLE
- הפקודה ליצירת טבלה.people
- שם הטבלה שאותה ניצור.
לאחר מכן בסוגריים מעוגלות אנחנו מגדירים 3 עמודות בטבלה הזו.id INTEGER PRIMARY KEY
החלק הראשון הוא שם העמודה, במקרה הזה -id
.
החלק השני מגדיר את סוג המשתנה - זה אומר משתנה מספרי שיכול להיות שלילי או אפס גם.
החלק השלישי נכון רק לשורה הראשונה וזה שהעמודה הזו מגדירה משהו שנקרא Primary Key
.
שזהו המזהה העיקרי בטבלה הזו ואסור שיהיה לנו 2 שורות עם אותו המזהה.
אילו עוד שני פרמטרים אנחנו מוסיפים?
יצרנו טבלה, אבל היא ריקה.
אז צריך להוסיף רשומות!
1 | INSERT INTO people VALUES |
באותו התחביר אנחנו מגדירים את הפקודה INSERT INTO
.
שזה להוסיף לתוך טבלה מסוימת, במקרה שלנו זה people
.
אחרי VALUES
אנחנו מגדירים את המידע להוסיף.
כל שורה היא בעצם שורה בטבלה כך שהשאילתא הזו מכניסה לטבלה 2 רשומות.
בחור בשם בוב בן 42 עם המזהה 1.
בחורה בשם אליס בת 38 עם המזהה 2
מה ייקרה אם ננסה להכניס את אליס פעמיים?
1 | INSERT INTO people VALUES |
תשובה:
1 | UNIQUE constraint failed: people.id |
המסד מזהה שניסינו להכניס את אותו המזהה בשורה חדשה.
כדי לקחת את הכל נוכל להריץ:
1 | res = cur.execute('SELECT * FROM people') |
שימו לב כמה קל לרוץ על הרשומות בפייתון נטו בעזרת ה-for
.
בפוסט הראשון למדנו על מה זה מסד נתונים, מגווני התוכן שנוכל לשמור במסדים והתנסנו במסד הנתונים הראשון שלנו מסוג SqLite
.
בפרק הבא נלמד על פילטורים, עדכונים ומחיקות!