ABA


"SQL| איך הכי נכון לבנות כזה DB?"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #10905 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 10905
asco88 
חבר מתאריך 17.6.04
26757 הודעות
   20:50   24.09.12   
אל הפורום  
  SQL| איך הכי נכון לבנות כזה DB?  
 
הבעיה מוכרת, אני בטוח שגם יש לך פיתרון קלאסי, אבל לא מצאתי אותו.

יש לי טבלה X וטבלה Y.
לכל אחד מהתאים בטבלה X, מתאימים חלק מהתאים בטבלה Y, אבל בכל אחד, יש נתונים אחרים.

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

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


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  בבקשה:) יוחאי 24.09.12 21:04 1
     סידרת לי חומר קריאה להערב הא? asco88  24.09.12 21:14 2
  טבלת אמצע.. VeNom  24.09.12 21:32 3
     רעיון יפה, נראה לי זה מה שאני אעשה asco88  24.09.12 21:47 4
     מעניין אותי מבחינת PERFORMANCE יוחאי 25.09.12 13:14 5
         כמובן 2 שורות מאותו user dvir8 27.09.12 10:41 6
         הכל תלוי בדרישות הלקוח Deuce  29.09.12 01:07 12
             שאלה קטנה, יוחאי 29.09.12 01:11 13
     למה צריך טבלה שלישית, כשטבלת חתימות כבר יכולה להכיל לאיזה יוזר היא שייכת? Ice Cold  27.09.12 16:56 7
         אתה יכול גם טבלה שלישית זה לא משנה.. מה שאתה ציינת יותר נהוג פשוט dvir8 28.09.12 10:32 8
         יש עוד מיליון אופציות.. VeNom  28.09.12 10:49 9
             בדיוק מה שרציתי להגיד, יש יחס של Many2Many יוחאי 28.09.12 11:23 10
                 +1 asco88  28.09.12 13:17 11
                     אני מרגיש שאתם מפספסים את הנקודה Deuce  29.09.12 01:17 14

       
יוחאי
חבר מתאריך 30.12.15
163 הודעות
   21:04   24.09.12   
אל הפורום  
  1. בבקשה:)  
בתגובה להודעה מספר 0
 
   http://www.tonymarston.net/php-mysql/many-to-many.html


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
asco88 
חבר מתאריך 17.6.04
26757 הודעות
   21:14   24.09.12   
אל הפורום  
  2. סידרת לי חומר קריאה להערב הא?  
בתגובה להודעה מספר 1
 
סתם אחי, תודה רבה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   21:32   24.09.12   
אל הפורום  
  3. טבלת אמצע..  
בתגובה להודעה מספר 0
 
   אפשר לתת דוגמא טובה של יוזרים בפורום וחתימות.
לחלק מהיוזרים יש חתימות.
יש לך טבלה שמכילה יוזרים(עם מלא פרטים,שאחד מהם הוא ID) ובטבלה השניה יש חתימות(כל מיני עמודות ובנוסף עמודה של ID).
אז מוסיפים טבלה של יוזר-חתימות עם 2 עמודות(ה-ID של כל טבלה) והנה יש לך דרך נוחה לגשר ביניהם..בוא נגיד שליוזר יש יותר מחתימה אחת, אז שמים לו 2 שורות(עם userid זהה וחתימות שונות).


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
asco88 
חבר מתאריך 17.6.04
26757 הודעות
   21:47   24.09.12   
אל הפורום  
  4. רעיון יפה, נראה לי זה מה שאני אעשה  
בתגובה להודעה מספר 3
 
הכי פשוט, תודה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
יוחאי
חבר מתאריך 30.12.15
163 הודעות
   13:14   25.09.12   
אל הפורום  
  5. מעניין אותי מבחינת PERFORMANCE  
בתגובה להודעה מספר 3
 
   אם זה נכון להחזיק 2 שורות עם אותו USER פשוט חתימה שונה, או להחזיק שורה אחת עם כל החתימות של היוזר מופרדות בפסיק.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dvir8
חבר מתאריך 13.5.02
5929 הודעות
   10:41   27.09.12   
אל הפורום  
  6. כמובן 2 שורות מאותו user  
בתגובה להודעה מספר 5
 
   כשתבצע שאילתות מורכבות יתבצעו אך ורק פעולות אלגבריות לעומת משחק עם מחרוזות שאלו פעולות הרבה יותר כבדות.
בנוסף לא תוכל לשאול שאלות כגון כמה חתימות יש לכל יוזר?
אתה תצטרך לרשום הרבה קוד מגעיל של split וכד'.

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

אם היית משתמש בהפרדה ע"י פסיקים היית צריך ליצור עוד שדה שבו מופיעים כל השמות של החתימות שלא יופיעו.

לעומת זאת אם היית עובד נכון היית סה"כ מוסיף שדה שנקרא manage ושם בו 1 או 0 עבור כל חתימה.

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   01:07   29.09.12   
אל הפורום  
  12. הכל תלוי בדרישות הלקוח  
בתגובה להודעה מספר 5
 
הפשרה היא תמיד בין דינמיות הסכמה (או מידת הרלציוניות של הישויות והטבלאות בסכמה) לבין כמות המשאבים שזה צורך. ככל שנדרוש יותר פעולות מהסכמה, כך נצטרך להשקיע בה יותר משאבים.

באופן כללי אני לא רואה סיבה לוותר על גמישות הטבלה כל עוד אינדקסים לא נכנסים לתמונה. במקרה של החתימות, אני לא חוסך כמעט כלום אם אני מאחד את הכל בפסיקים ואני פוגע משמעותית ביעילות של שליפות בטבלה בהקשרים למשל של הפעלת לוגיקות מעניינות עליה (לדוגמה אם אני רוצה להחזיר את החתימה הנפוצה ביותר, למצוא קורלציה בין זוג חתימות ועוד). ד"א, במקרה כזה בגלל שהטבלה מלכתחילה מחזיקה fk ל-id של החתימות הרלוונטיות ו-fk ל-user היא תופסת פחות מקום בזיכרון מאשר עמודה עם פסיקים (במקרה הראשון אתה שומר 2 מצביעים עבור כל רשימה ובמקרה השני אתה משרשר ", id" ל-string שזאת פעולה כבדה יותר). במקרה הזה אתה לא מרוויח כלום.

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






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
יוחאי
חבר מתאריך 30.12.15
163 הודעות
   01:11   29.09.12   
אל הפורום  
  13. שאלה קטנה,  
בתגובה להודעה מספר 12
 
   במידה ואנחנו יכולים להחזיק במקום שדה עם פסיקים פשוט שדה בינארי ולבצע עליו Bitwise Operations, זה יכול להיות גם פתרון מעניין לא?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Ice Cold  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 3.8.02
28041 הודעות, 19 פידבק
   16:56   27.09.12   
אל הפורום  
  7. למה צריך טבלה שלישית, כשטבלת חתימות כבר יכולה להכיל לאיזה יוזר היא שייכת?  
בתגובה להודעה מספר 3
 
ואז עם JOIN פשוט מוציאים את כל החתימות של משתמש?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dvir8
חבר מתאריך 13.5.02
5929 הודעות
   10:32   28.09.12   
אל הפורום  
  8. אתה יכול גם טבלה שלישית זה לא משנה.. מה שאתה ציינת יותר נהוג פשוט  
בתגובה להודעה מספר 7
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   10:49   28.09.12   
אל הפורום  
  9. יש עוד מיליון אופציות..  
בתגובה להודעה מספר 7
 
   המטרה של טבלה שלישית כאן היא פשוט לא להתחיל לשנות טבלאות קיימות..
אני מסכים שהדוגמא שנתתי לא האופטימלית(עדיף לבצע את הפתרון שלך), אבל במצב שלו שיש לך מחשב ורכיבים, אז יכול להיות שלרכיב אחד מקושר יותר ממחשב אחד(ואז אי אפשר לשכפל שורות(כי אתה רוצה שרכיב ישאר אחד ויחיד), וצריך לעשות סוג של קומבינה עם שרשור מחרוזות).


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
יוחאי
חבר מתאריך 30.12.15
163 הודעות
   11:23   28.09.12   
אל הפורום  
  10. בדיוק מה שרציתי להגיד, יש יחס של Many2Many  
בתגובה להודעה מספר 9
 
   את האמת אם מישהו ירים את הכפפה וייכתוב מדריך קצר גם ברמת התיאוריה וגם ברמה המעשית עם מידע מה טוב ומתי, זה יכול להיות מצויין!


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
asco88 
חבר מתאריך 17.6.04
26757 הודעות
   13:17   28.09.12   
אל הפורום  
  11. +1  
בתגובה להודעה מספר 10
 
נתקלים בנושא הזה די הרבה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   01:17   29.09.12   
אל הפורום  
  14. אני מרגיש שאתם מפספסים את הנקודה  
בתגובה להודעה מספר 11
 
בין ישויות שונות יש יחסים שונים, התלויים בבעיה ובהקשר.

כאשר היחס בין הישויות הוא many to many, מממשים פתרון של many to many ובמקרה שלא, אז לא. גם הפתרון של one to many הוא מאד דומה.

בד"כ היחס הזה ממומש באמצעות טבלת הצמדה בין זוג עמודות שמקיים יחס many to many. במקרים מסוימים אפשר לעשות משהו שהוא מעט יותר יעיל, לדוגמה יש לנו טבלה של קבצים ולכל קובץ יש מספר דגלים (למשל READ ONLY, HIDDEN, ENCRYPTED). היחס הוא many-to-many כי לכל קובץ יכולים להיות מותאמים מספר דגלים ומן הסתם לכל דגל יכולים להיות המון קבצים שהוא דולק בהם. נניח שמעניין אותנו להחזיק לכל קובץ איזה דגלים יש בו (וכך להבחין בין קובץ שהוא רק HIDDEN לקובץ שהוא למשל READ ONLY ו-ENCRYPTED), ז"א לממש יחס של one to many בהקשר של קבצים. במקרה הזה אני יכול לייצג באמצעות ביטים אילו דגלים דולקים לקובץ, נניח הביט השמאלי יהיה אינדיקטור האם הקובץ הוא HIDDEN והביט אחריו יהיה אינדיקטור האם הקובץ הוא READ ONLY. בסופו של דבר יהיה לי מספר שייצג בצורה בינארית את הביטים הדולגים, וכדי לעדכן ערכים בקובץ אני אבצע פעולה של XOR.

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






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net