לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #1  
ישן 18-06-2007, 16:55
צלמית המשתמש של maxim k
  maxim k maxim k אינו מחובר  
 
חבר מתאריך: 05.08.06
הודעות: 2,860
שלח הודעה דרך MSN אל maxim k
רשימה ממויינת במסד נתונים

בטבלה 'items' לכל רשומה יש את השדות: id,value
הבעיה היא שאני צריך להוציא את השדות בצורה ממויינת (לא לפי סדר לוגי, אלא לפי סדר שהמשתמש קובע). הדרך הפשוטה ביותר היא להוסיף שדה place שיחזיק את המיקום של המיקום של הפריט ברשימה, אבל הבעיה היא שאם אני ארצה לשנות מקום של פריט ברשימה אני אצטרך לעבור על כל הפריטים שאחריו בסדר ולעדכן את השדה place שלהם, וזה פשוט לא פרקטי עקב מספר השורות בטבלה.
המצב כמובן מזכיר (לי לפחות) מקרה של רשימה מקושרת, כלומר להוסיף שדה next_id שיחזיק את הid של השורה הבאה ברשימה, אבל אני לא יודע אם כך איך להוציא את הנתונים בצורה ממויינת.

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

אין ממש חשיבות למסד הנתונים, אבל בשביל הפרוטוקול נגיד שזה mysql
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #2  
ישן 18-06-2007, 17:15
  DCD DCD אינו מחובר  
 
חבר מתאריך: 17.05.05
הודעות: 7,321
בתגובה להודעה מספר 1 שנכתבה על ידי maxim k שמתחילה ב "רשימה ממויינת במסד נתונים"

אתה יכול לפעול עם ה-next_id כשיש לך אצל המשתמש מידע עם ה-id האחרון שהוכנס (נקרא לו last_id)

ואז תעשה שאילתה:

קוד:
SELECT * FROM tbl WHERE next_id BETWEEN 0 AND (SELECT last_id FROM users_table WHERE user_id=4)



בחלק של user_id=4, אתה צריך לשים את המספר של הuser הנוכחי כמובן

מקווה שזה עונה על השאלה

עריכה:
טעיתי...שכחתי בכלל שה-Id הוא לא בסדר עוקב של פלוס 1.
אנסה למצוא פיתרון אחר, נראה לי שאפשר לשלב עם פיסקת IN.

עריכה 2:

האמת לא הכי הבנתי בדיוק מה אתה צריך לעשות...
בכל מקרה, אני חושב שאתה יכול ליצור טור אחד נוסף שיהיה מסוג text ובו תכניס את כל ה-id'ים שצריך שקשורים למשתמש.
בעזרת שפת צד-שרת תוכל בקלות להכניס id ולהוציא id אחר.

ואחרי שכבר יש לך את כל ה-ID'ים, תשתמש בפיסקת IN.

נערך לאחרונה ע"י DCD בתאריך 18-06-2007 בשעה 17:23.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #6  
ישן 19-06-2007, 09:16
  DCD DCD אינו מחובר  
 
חבר מתאריך: 17.05.05
הודעות: 7,321
בתגובה להודעה מספר 5 שנכתבה על ידי maxim k שמתחילה ב "אני ממש לא מבין מה אתה..."

אני אנסה להסביר לך מה שהתכוונתי...:

יש לך טבלה בשם 'items' ולכל רשומה יש את השדות:
id - מספר ה-id הספציפי של הרשומה.
value - ערך מסויים שקשור ל-item.

מה שאני חושב שצריך לעשות זה להוציא את כל המידע שבטבלה items אל תוך טבלה זמנית, שנקרא לה 'temp_items', בעזרת משפט SQL.
בטבלה הזו יהיו את כל הרשומות, שבהן יש את מספרי ה-id שהמשתמש בחר (לא חייב שזה יהיה לפי הסדר שהמשתמש רוצה, אלא מספיק בינתיים שיהיה רק את ה-id שהוא רוצה בתוך הטבלה הזמנית).

אחרי (או לפני) שיצרת טבלה זמנית, תיצור שאילתה שתוסיף לטבלה הזמנית טור של 'user_choise', כלומר זה טור שקובע את סדר הוצאת הרשומה לפי עדיפות המשתמש (לפי מה שהמשתמש בחר).

בעזרת שאילתת UPDATE אתה מעדכן\משנה את התאים של הטור 'user_choise' בערכים שהמשתמש בחר.
הערכים שהמשתמש בחר נמצאים (או אמורים להיות, או שאתה מקבל אותם בדרך אחרת) לדוגמא במשתנה שפת צד-שרת שנקרא לו data. ואתה יודע איזה id הוא ראשון ואיזה אח"כ לפי המיקום שלו במשתנה.

אח"כ אתה שולף מהטבלה הזמנית את הנתונים בצורה רגילה בעזרת
קוד:
ORDER BY user_choise
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #17  
ישן 19-06-2007, 08:26
  borsood borsood אינו מחובר  
 
חבר מתאריך: 26.04.04
הודעות: 2,294
אבל מסדי נתונים זה לא מבני נתונים
בתגובה להודעה מספר 16 שנכתבה על ידי maxim k שמתחילה ב ":O"

פתרונות של מבני נתונים לא זורמים טוב עם מסדי נתונים (אחרת כולם היו משתמשים בISAM וזהו).
מהי הבעייה שאתה מנסה לפתור?
בצורה שאתה מציג אין מנוס מ full table scan למרות שזה לא בהכרח דבר רע בטבלאות קטנות...

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

אני כנראה לא מבין את הבעייה אבל כשנתקלים בבעיות מסוג זה תמיד טוב לקחת צעד אחורה ולחשוב ברמת התכנון.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #20  
ישן 20-06-2007, 01:26
צלמית המשתמש של maxim k
  maxim k maxim k אינו מחובר  
 
חבר מתאריך: 05.08.06
הודעות: 2,860
שלח הודעה דרך MSN אל maxim k
borsood
בתגובה להודעה מספר 19 שנכתבה על ידי borsood שמתחילה ב "מקסים"

ציטוט:
לצערי אתה עדיין חושב במונחי מבני נתונים.

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

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

יש לי רשומות אשר אמורות להיות מוצגות בסדר מסויים אותו קובע מישהו
אני צריך לאפשר למישהו הנ"ל לשנות את הסדר שבו יוצגו הרשומות,להוסיף ולהוציא רשומות, וכל זאת ביעילות מירבית
אני צריך להיות בעל אפשרות לשלוף את הרשומות בסדר בו המישהו הנ"ל קבע


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

אני שמח שהבנת את זה

ציטוט:
אם כך אז אין לך ברירה אלא להגדיר שדה order ולעדכן אותו לפי הצורך

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

ציטוט:

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

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

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

אם השאלה האחרונה מפריעה לך באופן אידיאולוגי אתה רשאי להתעלם ממנה
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #27  
ישן 20-06-2007, 18:58
  DCD DCD אינו מחובר  
 
חבר מתאריך: 17.05.05
הודעות: 7,321
בתגובה להודעה מספר 1 שנכתבה על ידי maxim k שמתחילה ב "רשימה ממויינת במסד נתונים"

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

בפיתרון הזה צריך להיעזר בשפת צד-שרת.
בשפת הצד שרת: נגיד שיש לך במערך מסודר את כל מספרי ה-id שהמשתמש רוצה לקבל לפי הסדר.
כלומר שהמפתח של המערך אומר מי להוציא קודם ( 0 במפתח אומר להוציא ראשון, 1 להוציא אחריו וכו'), והערך של המערך מכיל את ה-id.

בצורה הזאת תיצור מחרוזת שתכיל שאילתות SELECT ואחר-כך תבטא אותן לפי המיקומיות שלהן , לדוגמא זו התכולה של המחרוזת:

קוד:
(SELECT * FROM items WHERE id='38') AS 0, (SELECT * FROM items WHERE id='27') AS 1, (SELECT * FROM items WHERE id='79') AS 2, ... etc


וזהו המערך שמכיל את המיקומות של ה-id'ים במפתח, ואת ה-id'ים עצמם בערך:

קוד:
Array: [0] = 38 [1] = 27 [2] = 79 ... etc


אח"כ תשים את המחרוזת בתוך השאילתה הכללית (והקצרה):

קוד:
SELECT (STRING);


במקום המילה "STRING" תשים את המחרוזת שלך.

אח"כ כשאתה שולף את הנתונים, אם תשלוף אותם בצורה של מערך, נדמה לי שצריך לשלוף כמו שלוקחים נתונים במערך דו-מימדי, כי הנתונים יהיו בצורה כזאת לדוגמא:

קוד:
Array: ['0'] [Array: ['column1'] ['column2'] ..etc] ...etc


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

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

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 11:22

הדף נוצר ב 0.09 שניות עם 10 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר