התייעצות בתכנון נכון של טבלת אלפון ב SQL
-
בס"ד
**כידוע לעוקבים בימים האחרונים אחרי הנודניק @איש-אחד
אני עשיתי/עושה טבלה ב MySQL שאמורה להכיל אלפון,
וכאשר נכנסת שיחה עם מספר מזוהה אל המרכזייה שלי,
המרכזייה בודקת האם המספר מופיע ברשומות, ואם כן, מוסיפה את השם והכתובת למספר המזוהה.כמובן שהשדה של הטלפון עליו רצה השאילתא - אמור להיות שדה ייחודי (כי מספר הטלפון הספציפי לא משותף לשני אנשים שונים).
[size=150:13nmggdx]רציתי לשאול כמה שאלות תכנוניות:[/size:13nmggdx]**
1. האם להגדיר את ה type של שדה הטלפון כ INT או כ VARCHAR?
להלן השיקולים:
INT: אני מדמיין שחיפוש ב int יותר מהיר - כי האופציות הינן ספרות בלבד. בנוסף יימנע ממני מלכתחילה להכניס נתונים שגויים (שאינם ספרות).
VARCHAR: אני יכול להכניס 0 מוביל מתי שאני רוצה (לדוגמא, רק במספרים ישראליים, ולא במספרים מחו"ל)2. לרוב האנשים יש יותר ממס' טלפון אחד, ולהזכיר, השאילתא מחפשת את מספרי הטלפון.
האם כדאי שיהיה רק שדה אחד של טלפון, ופשוט להנפיק רשומות לכל אדם כמספר הטלפונים שיש לו (אני משער שיהיו 5000 רשומות ~)
או לתת לכל אדם רשומה אחת בלבד, ושיהיו כמה שדות של טלפונים, והשאילתא תחפש ב OR בכל שדות הטלפון (השערה: 2000 רשומות ~)
להלן השיקולים:
שדה אחד והרבה רשומות:
I. לא צריך להחליט מראש כמה טלפונים מותר לאדם להחזיק (כמה שדות טלפון יהיו)
II. השאילתא קצרה וקליטה - רק על עמודת טלפון אחת, וממילא יותר מהירה?
III. ניתן לאנדקס את עמודת הטלפון הבודדת, ואין צורך לאנדקס את כל עמודות הטלפון - מה שמטיל ספק בכל כדאיות האינדקס.
רשומה אחת והרבה שדות:
I. לא צריך להכפיל את הרשומות כמספר הטלפונים שיש לאותו אדם, ולחזור על שדות מיותרים (שם, כתובת, הערות, תוית, טיפול אישי* וכדומה)
[u:13nmggdx]*תוית[/u:13nmggdx] = משפחה, חברים, עסק, ילדים וכו'. [u:13nmggdx]טיפול אישי[/u:13nmggdx] = כאלו שיקבלו במרכזייה טיפול אחר, למשל ספאם, קרובי משפחה מדרגה ראשונה וכו'.
II. אולי? אם יש פחות רשומות בטבלה, החיפוש יותר מהיר?**את"ל כהצד השני: רשומה אחת וכמה עמודות,
האם יש דרך יותר נכונה לדעת כמה עמודות טלפון להכין (ובמילים אחרות: מה מספר הטלפונים המקסימלי לאדם),- מעבר ל: לתקוע מספר שרירותי, למשל 5, ואז כשבעתיד יהיה צורך להגדיר 6 טלפונים, להתחיל לשנות את הטבלה, השאילתא, וכל הנלווים עליהם?**
מקווה שלא נסחפתי יתר על המידה... :roll:
@דוד ל.ט. , אתה עוד תצטער על הרגע הזה שהזמנת אותי לשגע את כולם...
בכל אופן, ברגע שיצאתי מהאף, אל תתבייש - שלח לי אפילו הודעה פרטית "נא להנמיך פרופיל"...
תודה רבה לכולם!פורסם במקור בפורום CODE613 ב07/11/2017 16:01 (+02:00)
-
בכל השאלות אין נכון ולא נכון אלא סקר "מה הייתם עושים".
- בסטאק וכך גם העולם מגדיר על varchar. ראיתי פעם הגדרה בסטאק: int מייצג ערך שיש עליו משמעות לפעולות אריתמטיות, וטלפון איננו כזה, ובמסד לא חושבים (בתיאוריה...) על הביצועים כי סומכים על תוכנת המסד (mysql במקרה שלך) אלא חושבים על תיאור כמה שיותר של המציאות עכ"ל פחות או יותר :). אבל אני כן מגדיר כמספר בדיוק מהסיבות שאמרת.
- אני שונא את אפשרות העמודות. ומיישם בכל מקום את האפשרות השניה - כל שורה טל' בודד (הסברות שלך נכונות מאוד לענ"ד).
לא הזכרת אפשרות שלישית של שתי טבלאות (טבלת אנשים וטבלת טלפונים) זה לא מועיל כלום לביצועים אלא פוגע בהם אבל זה עונה על חוק נירמול של איסור פיזור מידע. אם יש איש בשם שמעון ולו שלושה טלפונים, השם שמעון מופיע * 3, ובכל מקום יש שם + כתובת. עדכון הכתובת משמעותו להחיליף בשלושה מקומות וזה פתח לחוסר עקביות.
לכן על פי הספר, יש טבלת אנשים (מזהה רץ, שם, כתובת) וטבלת טל' (טל', ומזהה איש).
אתה בפורום, תפסיק לחשוב שאתה תלמיד מול עדת מורים. אתה מתנצל ללא הרף בפני האויר.
פורסם במקור בפורום CODE613 ב07/11/2017 16:42 (+02:00)
-
דבר ראשון: לא להתנצל!
לבעיה הראשונה:
לדעתי עדיף INT. להוספת 0 בתחילה תשתמש אח"כ בפונקציות עיצוב בשאילתת ה- SQL (במקרה הרע) או בשכבה שאחריה (במקרה הטוב מאוד).הבעיה השניה אמורה להיפתר כך:
אתה בונה 2 טבלאות.
אחת לאנשים. שמכילה מזהה ייחודי לכל אחד.
שניה למספרי טלפונים. שמכילה מספר טלפון ואת המזהה של האדם אליו היא שייכת.
זה נקרא מפתח מרוחק
"FOREIGN KEY"
תלמד על זה קצת.
אשלח לך קישור להורדת הדרכה בפרטי.פורסם במקור בפורום CODE613 ב07/11/2017 16:48 (+02:00)
-
- לרוב האנשים יש יותר ממס' טלפון אחד, ולהזכיר, השאילתא מחפשת את מספרי הטלפון.
האם כדאי שיהיה רק שדה אחד של טלפון, ופשוט להנפיק רשומות לכל אדם כמספר הטלפונים שיש לו (אני משער שיהיו 5000 רשומות ~)
או לתת לכל אדם רשומה אחת בלבד, ושיהיו כמה שדות של טלפונים, והשאילתא תחפש ב OR בכל שדות הטלפון (השערה: 2000 רשומות ~)
היות ואתה משתמש ב MYSQL שהוא מסד נתונים יחסי, מן הראוי שתכבד את הכללים :ugeek: ותיצור טבלה נפרדת לטלפונים של אנשים כמו שכתב @דוד ל.ט. היקר.
אגב, מספר טלפון לא חייב להיות ייחודי מכמה סיבות:
- יתכן והכנסת טלפון שגוי, שהוא בכלל של לקוח אחר, ואחר כך אתה רוצה להכניס את אותו מספר עבור הלקוח שהמספר הזה באמת שלו.
- יש מקרים בהם אנשים מחליפים מספר, ואנשים אחרים זוכים בו.
- מקרה של שני אחים, בני זוג וכדו' שמשתמשים באותו מספר, או אפילו שני אנשים שעובדים באותו משרד וכדו'.
בהצלחה
פורסם במקור בפורום CODE613 ב07/11/2017 16:59 (+02:00)
- לרוב האנשים יש יותר ממס' טלפון אחד, ולהזכיר, השאילתא מחפשת את מספרי הטלפון.
-
בס"ד
תודה רבה לכולכם!
אז אני רואה שכולכם מכוונים לכיוון 2 טבלאות, מה שאני אפילו לא חשבתי...ואם כן, חוזרת בגדול שאלת ה"ואם תמצא לומר" שבסוף המגילה דלעיל :lol:
בטבלת הטלפונים, כמה עמודות להקצות; האם להחליט שרירותית, או שיש דרך יותר טובה?
וכן בשאילתא, האם יש דרך קצת יותר חכמה מאשר לעשות:WHERE tel1 = ${CID} OR tel2 = ${CID} OR tel3 = ${CID} וגומר
לגבי ה-FOREIGN KEY, זה אכן מתבקש מאליו כאשר עובדים עם 2 טבלאות בסגנון זה,
ו @םןץףך היקר, תודה על החומר, אמנם הוא לא כולל את נושא ה KEY בכלל,
אבל כבר הספקתי ללמוד אותו היטב עוד לפני שהתחלתי את הסטאז'...
אגב, שלחתי לך בחזרה במייל משהו קטן...ושוב תודה לכל החברים הנפלאים שצמחו לי תוך ימים ספורים!
שלכם בהערכה, @איש-אחד :geek:פורסם במקור בפורום CODE613 ב07/11/2017 19:16 (+02:00)
-
@איש אחד, פספסת את עיקר הפואנטה. שתי טבלאות אומר שיש רק עמודת טל' אחת. ולצידה יש מזהה אדם (שמתייחס למזהה הראשי של טבלה נוספת של רשימת האנשים). עבור עשרה טל' לישראל ישראלי, יהיו עשר שורות בטבלת הטל' שבכולם העמודה מזהה תכיל את מזהה השורה הבודדת שמייצגת את ישראל ישראלי בטבלת האנשים.
פורסם במקור בפורום CODE613 ב07/11/2017 19:35 (+02:00)
-
אה, אכן רעיון מעולה!
צודק שלא חשבתי שניה אחת נוספת על כך שאם גם בטבלה השנייה כל הנתונים באותה שורה אז מה העניין ב-2 טבלאות...
הנוטל עצה מן הזקנים אינו נכשל...
תודה רבה!אז נראה לי נסגור גם את הנושא הזה כ Answered,
ש @mat יתלהב שעוד נושא נסגר תוך יום...פורסם במקור בפורום CODE613 ב07/11/2017 20:10 (+02:00)