MYSQL וטבלאת IOT

MYSQL וטבלאת IOT

אני עושה בסיס נתונים של שירים. פיצלתי את המידע לשתי טבלאות, היות ולכל שיר יכולים להיות כמה מלחינים. עשיתי גם טבלאת IOT שמקשרת בין שני השירים. טבלאת SONGS: name lyrics written_by טבלאת ARTISTS id name טבלאת IOT song_id composer_id performer_id טבלאת הIOT מחזיקה את החיבור בין הID של השיר לבין הזיהוי של המבצע והמלחין (שנמצאים בטבלאת ARTISTS). הבעייה מתחילה כשאני רוצה לחפש את כל השירים שכתב או הלחין או ביצע אלטון ג'ון. קודם אני הולך לחפש מה הID של אלטון ג'ון בטבלאת ARTISTS אח"כ אני הולך לחפש את כל השירים שהוא הלחין או ביצע בטבלאת IOT ומוציא ממנה רשימה של SONG_ID ובנוסף אני הולך לחפש את כל השירים שהוא כתב להם את המילים בטבלאת SONGS. עכשיו יש לי ערימה של SONG_ID ואני צריך על כל אחד מהם לעשות SELECT נפרד בשביל למצוא את שמות השירים בטבלאת הSONGS. קיצר - יש פה ים של שאילתות בשביל למצוא רשימה מסכנה. יש דרך לקצר את זה או לחילופין לתכנן את הDB בצורה יותר חכמה?
 
OK, תודה

(זה אתה כתבת את המאמר? אם כן, האם אפשר ליישר את האנגלית שמאלה? זה מתחרבש קצת) הבנתי את העניין עם הJOIN, אבל רק ברמה הבסיסית, אני לא מצליח לצרף שני JOINS באותה שאילתא (שלא לדבר על קינון). אני אתן בעייה מפושטת - טבלאת CITIES: ID NAME טבלאת CUSTOMERS ID NAME טבלאת IOT (לקוח יכול להיות ממוקם בכמה ערים במקביל וזו הטבלא שמצליבה): ID CUSTOMER_ID - מצביע על ID בטבלת לקוחות CITY_ID - מצביע על ID בטבלאת "ערים" הצלחתי להציג את טבלת IOT כאשר כל CUSTOMER_ID הומר לשם הלקוח
SELECT `iot`.`id` `iot_id`, `iot`.`customer_id` `iot_cust_id`, `customers`.`id` `customers_customer_id`, `customers`.`name` `customers_customer_name`, FROM `customers` JOIN `iot` ON `iot`.`customer_id`=`customers`.`id`​
וזה עובד יופי, אבל... אני רוצה בתוצאות שלי שגם ישאב את שם העיר מהרשימה של הערים. איך אני משלב את זה יחד?
 
נראה לי שהסתדרתי איכשהו...

SELECT `iot`.`id` `iot_id`, `iot`.`customer_id` `iot_customer_id`, `customers`.`id` `customers_customer_id`, `customers`.`name` `customers_customer_name`, `iot`.`city_id` `iot_city_id`, `cities`.`id` `cties_city_id`, `cities`.`name` `cities_city_name` FROM `iot`, `customers`, `cities` WHERE `iot`.`customer_id`=`customers`.`id` AND `iot`.`city_id`=`cities`.`id`​
עכשיו הבעייה איך לרשום את זה עם JOIN. יש איזה הבדל או שזה זהה לגמרי מבחינת ביצועים?
 
טוב, נראה לי שהצלחתי גם עם JOIN

SELECT `iot`.`id` `iot_id`, `iot`.`customer_id` `iot_customer_id`, `customers`.`id` `customers_customer_id`, `customers`.`name` `customers_customer_name`, `iot`.`city_id` `iot_city_id`, `cities`.`id` `cties_city_id`, `cities`.`name` `cities_city_name` FROM `iot` JOIN `customers` ON `iot`.`customer_id`=`customers`.`id` JOIN `cities` ON `iot`.`city_id`=`cities`.`id`​
נראה שאני מתחיל לתפוס את העסק המעפן הזה.
 
ואם אני כבר פה... איך מקננים?

לגבי אותו מבנה DB מהשאלה הקודמת - אני רוצה שאילתא שמחזירה לי שתי שדות: שמות לקוחות והעיר בה הם ממוקמים, אבל רק לגבי ערים שמתחילות באות A
`cilies`.`name` LIKE 'A%'​
זה צריך איכשהו להעזר בטבלת IOT אבל לא ברור לי איך מסדרים קינון במצב כזה. מה בחוץ? מה בפנים? איך???
 

שוּלה

New member
ה-DB אני חושב שהוא מתוכנן מוזר

משום מה אתה יוצר קשר בין מבצע לבין מחבר, וזה נראה לי מיותר. מה גם שיכולים להיות יותר ממחבר אחד או ממבצע אחד לשיר ("דון קישוט" למשל). אם כבר אתה מניח שיש רק מחבר אחד ומבצע אחד לשיר (משהו שלא תמיד נכון במציאות) אז תחזיק כבר את ה-IDs של המחבר ושל המבצע ברשומה של השיר וסגרת עניין עם 2 טבלאות. אם אתה רוצה להיות יותר קומפטיבילי עם המציאות, אז אני מציע:
table IOT ( song_id, artist_id, role ENUM ('performer', 'composer', ...?) )​
(דרך אגב - שכחת לשים SONG_ID בטבלת SONGS) עכשיו לשאלתך: אני לא מבין גדול במסדי נתונים, אז אולי יש דרך יותר יעילה מבחינת המסד לעשות את זה. לפי תכנון ה-DB שלי (גירסא 2, עם טבלת IOT), צריך בסה"כ לכתוב
SELECT lyrics FROM songs, artists WHERE songs.song_id = artists.song_id AND artist_id=7 ואם אתה מתעקש על דיוק אז תחליף את זה ב AND artist_id=7 AND artist_role='performer'​
 
לשיר יש רק מחבר אחד.

גם אם זה "לנון-מקרטני". בטבלאת ARTISTS יש כניסה אחת ללנון, כניסה שנייה למקרטני, וכניסה שלישית "לנון-מקרטני". ולא הבנתי איך ההצעה שלך חוסכת את הצורך בטבלא אחת: זה זהה לגמרי למה שאני הצעתי בהודעה הראשונה. תסביר? (אגב, שדה songs.written_by שבהודעה שלי לא מכיל מחרוזת אלא הצבעה לטבלת ARTISTS)
 

שוּלה

New member
יש ביננו אי הבנה מהותית (או יותר)

אם יש לך "written by", למה אתה צריך גם את טבלת IOT ? (והפוך) מעבר לכך, לא נראה לי שיש טעם להמשיך את הדיון בפורום. כתוב לי מסר אם תרצה, ונמשיך במסנג'ר או משהו.
 
OK:

WRITTEN_BY מתייחס לכותב המילים. קח למשל את השיר "אומרים ישנה ארץ", מילים שאול טשרניחובסקי. המשורר הוא חד-חד ערכי מול הזיהוי של השיר בטבלאת SONGS. אם עוד מישהו כתב שיר בשם זהה, אז מדובר בשיר שונה. לכן לא יכול להיות שני שירי "אומרים ישנה ארץ" זהים, עם שני מחברי מילים שונים (מבחינתי "לנון-מקרתני" זה מחבר שהוא לא לנון ולא מקרתני). אבל לשיר הזה יש לחן של נעמי שמר ויש לחן אחר לגמרי של שלמה ארצי. אותו שיר, אותו מחבר, שני לחנים שונים. ללחן של נעמי שמר יש כמה וכמה מבצעים שונים. איך היית מבטא את זה בלי IOT שמקשר בין טבלת השירים לטבלת האמנים?
 

שוּלה

New member
אוקי, אז זה המקרה השני שהצגתי

אני רואה איפה הבילבול: כתבתי על 2 אפשרויות שונות, ולא עשיתי הפרדה טובה. האפשרות השניה שהצגתי כוללת את טבלת IOT. קרא את התשובה שלי שוב. בינתיים שמתי לב לדבר מעניין שקיים בתהליך פיתוח כל תוכנה כמעט: הישות שאתה קורא לה "שיר" היא לא מה שאני חשבתי עליו. - אתה מתאר "שיר" בתור מילים, הפואמה (נניח מחרוזת טקסט) - אני הנחתי שאתה מתכוון לביצוע מסויים של מילים+מנגינה+מבצע (נניח קובץ MP3) כך או כך, אתה צריך, משיקולי מניעת כפילות ונפח, את טבלת IOT (בחיאת רבאק, תן לה שם מלא: זה יעזור לך בעתיד) אבל המימוש שלך נראה לי בעייתי. קרא את התשובה הראשונה שלי.
 
IOT=INDEX ORGENIZE TABLE

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

itaym02

New member
תשקול לכתוב view ששמאחד את כל

הטבלאות ואז לבצע עליו את השאילתות - יהיה לך הרבה יותר פשוט
 

itaym02

New member
יותר מלהריץ שאילתה, מכוון שהקוד כבר

מקומפל, ואלי יש גם מנגנון שלcaching שמעורב ביצירת view - אם תגלה תעדכן.
 
למעלה