1.3 מסד נתונים רלציוני הרצאה
הקדמה¶
מסד נתונים רלציוני הוא מסד נתונים טבלאי, שבו אנחנו שומרים מידע בטבלאות.
לכל הטבלאות יש שדה ״primary key״, שנועד להגיד איזה שדה בטבלה הוא מיוחד (יוניקי) ולא חזרתי, לדוגמה- בטבלה ששומרת טיולים, נוכל לשים הרבה שדות, כמו שם טיול, כמה מטיילים, ולאן הטיול.
אבל הכי חשוב, להוסיף שדה ״מזהה טיול״, שיהיה ה״primary key״ של הטבלה, (שדה שמפריד כל טיול אחד מהשני, ומוודא שכל שורה בטבלה שונה).
לפעמים נרצה לעשות קישור בין טבלאות, לדוגמה במערכת הטיולים שלנו- נרצה לעשות קישור בין טבלת המלונות שמכילה מידע על כל המלונות לבין טבלת הטיולים, שאמורה להחזיק באיזה מלון יהיה חלק מהטיול.
hotel id | name | stars
1 | hamiltom | 5
2 | alexander | 4
trip id | name | people | hotel id
1 | trip to dubai | 2 | 2
2 | eilat vacation | 5 | 1
קישור הטבלאות הזה נקרא "one to many", כי על כל מלון אחד, יכולים להיות הרבה טיולים שונים שמשתמשים באותו מלון.
מה אם נרצה שיהיה כמה מלונות בכל טיול?
נוכל להוסיף טבלה שלישית שאחראית לקשר בין כמה מלונות לכמה טיולים.
hotel table
hotel id | name | stars
1 | hamiltom | 5
2 | alexander | 4
trip table
trip id | name | people
1 | trip to dubai | 2
2 | eilat vacation | 5
hotels in trips
trip id | hotel id
1 | 1
1 | 2
2 | 1
קישור הטבלאות הזה נקרא "many to many" כי לכל מלון יכול להיות כמה טיולים ולכל טיול יכול להיות כמה מלונות.
מסד הנתונים MySQL¶
הקדמה¶
מסד הנתונים MySQL הוא אחד ממסדי הנתונים הרלציוניים הנפוצים והפופולריים בעולם. הוא בשימוש במילוני אתרים וסטארטאפים בגלל שהוא חינמי, מהיר ונתמך על ידי רוב שפות התכנות. הוא מאפשר שאליתות SQL מורכבות, קשרים בין טבלאות, תמיכה גדולה לביצועים, גיבויים והפרדה בין יוזרים והרשאות.
איך להרים + לתקשר עם פייתון (ORM)¶
כדי שהקוד שלנו יהיה קריא, קל לתחזוק וגמיש לעבודה מול מסדים שונים, עוברים לעבוד עם ORM – כלומר, כתיבת מחלקות פייתון "רגילות" שכל אחת מהן מייצגת טבלה במסד (model-ים). המוכר ביותר בפייתון: SQLAlchemy.
הרצה של MySQL ב-Docker לסביבת פיתוח:¶
(חזרו לקורס תכנות לגבי דוקר)
חיבור ל-MySQL מתוך פייתון/SQLAlchemy:¶
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:password@localhost:3306/trip_db?charset=utf8mb4')
בדומה לsqlite
שימוש בORM¶
דוגמה לבניית מערכת trips עם טבלה מקשרת (many to many):
from sqlalchemy import Column, Integer, String, ForeignKey, Table
from sqlalchemy.orm import declarative_base, relationship
Base = declarative_base()
trip_hotels = Table(
'trip_hotels', Base.metadata,
Column('trip_id', ForeignKey('trips.id'), primary_key=True),
Column('hotel_id', ForeignKey('hotels.id'), primary_key=True)
)
class Trip(Base):
__tablename__ = 'trips'
id = Column(Integer, primary_key=True)
name = Column(String)
people = Column(Integer)
hotels = relationship('Hotel', secondary=trip_hotels, back_populates='trips')
class Hotel(Base):
__tablename__ = 'hotels'
id = Column(Integer, primary_key=True)
name = Column(String)
stars = Column(Integer)
trips = relationship('Trip', secondary=trip_hotels, back_populates='hotels')
דוגמה להוספת טיול עם מלונות:¶
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()
h1 = Hotel(name="Hamilton", stars=5)
h2 = Hotel(name="Alexander", stars=4)
t = Trip(name="eilat fun", people=3, hotels=[h1,h2])
session.add(t)
session.commit()
מסדי נתונים אחרים¶
מסד postgress¶
מסד PostgreSQL הוא מסד נתונים מקצועי ומתקדם מאוד, שגם אותו תמצאו כמעט בכל חברה רצינית. היתרונות שלו:
- הקפדה על תקינות ACID (קראו)
- תמיכה ב-JSON ושדות מפורמטים
- ביצועים נהדרים ושאילתות מתקדמות
הרצה מקומית ב-Docker:¶
חיבור בפייתון:¶
סיכום¶
- תמיד להגדיר Primary Key לכל טבלה
- כשיש קשרים מסובכים (many-to-many) להשתמש בטבלאות קשר
- לעבור ל-ORM עבור כל פרויקט אמיתי (ולא לעבוד עם SQL "בידיים") (כדי למנוע SQL Injection ובאגים למינהם)
- למערכות פרודקשן תמיד להשתמש במסד נתונים מלא (MySQL/Postgres, לא SQLite)
- להקפיד על תכנון סכימות נכונה - זה חוסך טעויות בהמשך!