תשובה לחידה

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

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

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

הערך הקודם פלוס הערך הקודם ושומרת אותו ב sequence בתור הערך הבא. כל זה, כל עוד הערך הוא לא 0 או ריק, כי אז הsequence מכיל את הערך 1.

התוצאה הסופית היא סדרה כזו: 1, 2, 4, 8, 16, 32, 64, 128, 512, 1024 … (דיברתי על 10 הערכים הראשונים).

הפעולה מתבצעת כאמור על ידי פעולת חיבור ולא כפל או חזקה (דיאגו).

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

השימוש ב GEN_ID מספק את הדרך היחידה לגשת ל sequence בגלל שהsequnce חייב להיות מוגן מפני שינויים רנדומליים ורק שינויים שהתכוונו אליהם חייבים להתבצע בצורה שהיא transaction safe, כך שכל טרנזאקציה תוכל לספק ערך חד חד ערכי בלי קשר לשאר החיבורים והטרנזאקציות האחרות בנושא. זו אחת מהדרישות של מבחן ה ACID עבור מסדי נתונים, וכאמור Firebird עובר בציון של 100 את המבחן. הפונקציה ד"א מעלה את הערך של ה sequence בכמות שאנחנו מספקים לה בפרמטר השני, כך שאם הערך הוא 0, זה בסה"כ מחזיר את הערך של sequence ולא מבצע פעולת חיבור.

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

4 מחשבות על “תשובה לחידה

  1. ik_5 מאת

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

  2. shulamy

    חיבור של מספר עם עצמו נקרא בעברית גם כפל ב 2.

    ולכן זאת סדרה הנדסית עם מנה 2 או אם תרצה אפשר

    גם לראות את זה כטור חזקות של 2.

  3. ik_5 מאת

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

כתיבת תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s