מסד נתונים – הגדרת סוגי שדות נכונים בהתאם לתוכן השדה

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

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

הנה כמה דברים ששלומי ציין שחשוב וכדי לעקוב אחריהם ולזכור (זוהי רשימה די קצרה “וישר לעניין” דרוש ידע קודם בנושא ורצוי לקרוא קצת אודות סוגי השדות השונים כדי לנסות ולקבל רקע כלשהו):

  • int(1) הוא לא אורך של בייט אחד. INT(10) לא גדול יותר מ INT(2) . המספר שנמצא בין הסוגריים הוא מטעה, ורק משמש כדי להציג את תוכן השדה בפקודות shell לדוגמא. כל השדות הרשומות מעלה כולן אותו INT , יש להם את אותו שטח אכסון, והטווח של הנתונים שהם יכולים להחזיק בו זהה. אם אתם צריכים INT שהוא בייט אחד תשתמשו ב tinyint.
  • PRIMARY KEY מספרי לטבלה הוא עדיף מאשר שדה שמכיל טקסט, במיוחד אם משתמשים במנוע InnoDB . אם אפשרי המנעו משימוש ב VARCHAR בתור PRIMARY KEY. במנוע InnoBD , זה יגרום לאינדקס להיות עמוק יותר, לאינדקסים המשניים גדולים יותר וחיפושים איטיים יותר.
  • נסו לא להשתמש ב VARCHAR כדי להציג זמן. זה יכול להראות כמו טקסט '2008-11-14 07:59:13' אבל זה בעצם רק ערך מספרי אשר סופר את הזמן שחלף מאשר 1970-01-01. ההבדל הוא 4 בייט לעומת 19 אם אתם משתמשים ב CHAR עם קידוד ASCII, או אפילו יותר אם אתם משתמשים ב VARCHAR עם UTF-8.
  • עדיף להמנע משימוש ב VARCHAR שמייצג כתובת IPv4. זה די נפוץ. כתובת ה IP ה”ל: 192.168.100.255 נתן להגדיר לשדה שלה VARCHAR(15) , אכן נכון, אבל יהיה טוב יותר להגדיר אותה בתור INT אשר מכיל 4 בייט וזה מה שכתובת IP מכילה…4 בייט. (למרות שישנה בעיה בהמשך עם שימוש ב IPv6 לכן יש לנסות ולקרוא אודות חלק זה במדריך באתר הרשמי של MYSQL)
  • זה גם משהו שהוא טען שהוא נפוץ מאוד, לא להגדיר שדות שמכילות מספרים בלבד בתור שדות טקסט כמו VARCHAR ו CHAR.
  • שדות אשר מכילות סיסמאות מוצפנות ב MD5 לא צריכות להיות מוגדרות ל VARCHAR אלה פשוט ל CHAR(32) S . סיסמאות ב MD5 תמיד יהיו באורך 32 בייט לכן אפשר להמנע מהבייט הנוסף של VARCHAR על ידי הגדרת השדה ל CHAR. אם הטבלאות או המסד מוגדרות ל UTF8 כברירת מחדל תוודאו שהעמודה של ה MD5 מוגדרת ל ASCII, או שהיא תצטרוך 96 בייט נוספים במקום רק 32.
  • עדיפות לשימוש בסוג שדה של TIMESTAMP על פני INT כדי לחשב שניות, מאחר ול MYSQL יש הרבה פונקציות אשר תומכות בסוג שדה זה.
  • השתמשו ב TINYINT, SMALLINT, MEDIUMINT במקום ב INT איפה שניתן. אתם הרי לא מצפים ל 4000000000 רשומות? נכון?! לכן שדה ה id יכול בהחלט להיות smallint והגדרה שלו בתור PRIMARY KEY.

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

4 Comments

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

    שלומי

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

  3. שחכת את אחת הטעויות הלא שכיחות שראיתי

    חוסר שימוש בUNSIGNED (לID לדוגמא..)

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

 

Social

advertisement advertisement

Certificates

ZCE PHP 5 ZCE ZF ZCE PHP 5.3

Latest Posts

Latest Comments