תבנית כתובת בין לאומית אינה תבנית אחת. זוהי משפחה של מוסכמות שחלוקות ביניהן מה בא קודם, איך נקראת חלוקה מנהלית, והאם שם הנמען יושב מעל הבניין או מתחתיו. כל מי שבונה טופס, תווית או מעטפה מודפסת פוגש במחלוקות האלה במהירות, והפתרון הזול ביותר—תבנית אחת עם כמה שורות רשות—מפסיק לעבוד ברגע שמצטרפת מדינה שנייה לרשימה.
המאמר עובר על סדר הכתובות בעולם בפועל, על השדות שמשתנים, על חשיבות הכתב, ועל אופן הדגלת הנתונים כך שהחלטות התצוגה יישארו נפרדות מהחלטות האחסון.
שני כיווני כתיבה של כתובת
במקומות מסוימים כותבים כתובות מן היחידה הקטנה והחוצה, ובאחרים מן הגדולה והפנימה, ושתי ההרגלים מייצרים סדרי שורות תמונת מראה זה של זה.
בחלק גדול ממזרח אסיה כתובת נעה באופן מסורתי מן היחידה הגדולה לקטנה: קודם מדינה או מחוז, אחר כך עיר או רובע, אחר כך נפה, אחר כך רחוב, אחר כך מספר בניין, ואחר כך היחידה. המוסכמות המערביות נעות לכיוון ההפוך: מספר בית ורחוב, אחר כך עיר, אחר כך אזור, אחר כך מיקוד, ואחר כך מדינה. שום סדר אינו הגיוני יותר; כל אחד מקבץ את המידע כפי שמצפים שירות הדואר המקומי והקורא המקומי.
דואר בין לאומי מוסיף מוסכמה אחת מעל. מכיוון שהמדינה שאליה מיועד המשלוח היא מה שמכונות המיון צריכות קודם, היא ממוקמת באופן מסורתי כשורה האחרונה, לבדה, באותיות גדולות או בולטת אחרת. זהו כלל ניתוב ולא כלל נתונים, ומכאן שמעטפות מודפסות נראות פעמים רבות שונה לחלוטין מן הסדר שבו טופס אוסף את השדות.
| מוסכמה | היכן היא ההרגל | סדר השורות |
|---|---|---|
| יחידה גדולה כלפי חוץ | חלק גדול ממזרח אסיה | מדינה או מחוז, אחר כך עיר או רובע, אחר כך נפה, אחר כך רחוב, אחר כך מספר בניין, ואחר כך היחידה |
| יחידה קטנה כלפי חוץ | המוסכמות המערביות | מספר בית ורחוב, אחר כך עיר, אחר כך אזור, אחר כך מיקוד, ואחר כך מדינה |
| מוסכמת ניתוב | דואר בין לאומי | מדינת היעד אחרונה, לבדה, באותיות גדולות או בולטת אחרת |
האם תבנית אחת יכולה לשרת כל מדינה?
רק באופן גרוע. תבנית מקודדת בהקשחה הנחה אילו שדות קיימים, אילו מהם על אותה שורה, ובאיזה סדר הם מופיעים, וההנחות האלה הן בדיוק מה שמשתנה בין מדינות.
תבנית קבועה אחת תציב מספר בית לפני שם הרחוב במדינה שמעמידה אותו אחריו, תכניס פסיק במקום שבו המוסכמה המקומית משתמשת בתו סימון, או תשמור שורה למדינה שהכתובת כלל אינה משתמשת בה. כדאי לשקול מה קורה בפועל: מדינות מסוימות משמיטות חלוקה מנהלית לגמרי ומאתרות כתובת לפי עיירה ומיקוד, ולכן שדה אזור שהוא חובה מכריח את המשתמש לחזור על העיר או לבחור קירוב. אחרות משתמשות ברמת חלוקה שאין לה מקבילה בתבנית, והשם נזרק לשדה הראשון שהתפנה.
התיקון קטן מכפי שהוא נשמע: יש לשמור את הנתונים שלמים ולתת לשכבת התצוגה להחליט על סדר השורות. הסדר שייך לתצוגה, ושום שדה לא אמור להיות תלוי בו.
מה ההבדל בין מדינה, מחוז ומחוז מנהלי?
כולם חלוקות מנהליות מן הדרג הראשון, והמילה להם משתנה ממדינה למדינה—מדינה, מחוז, נפה, אזור, קנטון, מושלות, אמירות, אובלסט. התווית חשובה לקורא ולא חשובה כלל למודל הנתונים, ומכאן שקריאה לכולם בשם אחד יוצרת יותר בעיות משהיא פותרת.
הבעיות ממשיות. משתמש במדינה שקוראת לחלוקה בשם אחר צריך לנחש למה מתכוון הטופס. סקריפט תמיכה שמסנן רשומות לפי אזור מחריג רשומות שהחלוקה שלהן יושבת תחת שם אחר במערכת המקור. כלל אימות שנבדק כנגד רשימת אזורים של מדינה אחת דוחה כמעט כל כתובת מחוצה לה.
יש להשאיר את השדה גנרי בסכימה ולתרגם את התווית בזמן הרינדור. יש לאחסן את הערך יחד עם קוד המדינה שלו, משום ששם של חלוקה מקבל משמעות רק לצד המדינה שאליה הוא שייך; שתי מדינות יכולות לחלוק שם חלוקה ולהתכוון למקומות שונים. הדמיון המשפחתי בין הקודים האלה מתואר במדריך לקודי מדינה וחלוקה לפי ISO.
כתב, תעתיק והכשל השקט של שדות לטיניים בלבד
כתובות רבות נכתבות בכתב שאינו לטיני. מדינות יעד מסוימות דורשות את הכתב המקומי למסירה פנימית ומקבלות גרסה מתועתקת לניתוב בין לאומי; אחרות מצפות לצורה המתועתקת בדואר נכנס. שום סידור כזה אינו אוניברסלי.
שני דברים נשברים כשמערכת מניחה תווים לטיניים. הראשון הוא דחייה גלויה: ערכת תווים שמחריגה אותיות שאינן לטיניות הופכת כתובת תקפה לשגיאה, והמשתמש אינו יכול לתקן אותה משום שהכתובת נכונה. השני שקט יותר—שדה שמקבל את התווים אבל מנרמל, מתעתק או מקצר אותם, כך שהערך האחסון כבר אינו תואם את מה שהוקלד והשוואה מאוחרת יותר נכשלת.
תווים אינם הסכנה היחידה. חלק מן הכתבים נכתבים בלי רווחים בין מרכיבי הכתובת, כך שמפרסר שמפצל לפי רווחים מוצא אסימון ענק אחד במקום שישה שדות. אחרים משתמשים בתו סימון בין שם הרחוב למספר במקום שבו המוסכמות הלטיניות משתמשות ברווח או בפסיק. גם האורך אינו אחיד: כתובת מתועתקת ארוכה בדרך כלל מן המקור שלה, ולכן שדה שתוכנן לכתב המקומי יכול להיות צר מדי לתעתיק של עצמו.
התמודדות עם שמות בניינים, מספרי יחידות ונפות
כתובות אמיתיות נושאות יחידות שתבניות כמעט אינן צופות מראש: דירות, קומות, בלוקים, מגדלים, מספרי כניסה, שמות בניינים, שמות תת נפה וכיוונים בצורת ציון דרך. הרשימה המקומית של המזהים האלה משתנה בדיוק כמו שמות החלוקות.
שני כללים שומרים עליהם בשליטה. יש לאסוף את פרטי היחידה בשדה משלהם ולא להוסיפם לשורת הרחוב, כדי שהרחוב ישרוד לצורכי פירוק וגיאוקוד. וכשכתובות במדינה מסוימת כוללות באופן שגרתי רמה שחסרה בתבנית—נפה מתחת לעיר, שם בניין מעל הרחוב—יש להוסיף שדה ולא לשרשר. שדה שמשמעותו דבר אחד הוא זול; שדה שמשמעותו כל מה שהיה עוד הוא המקום שבו איכות הנתונים הולכת לאבוד.
למפתחים: שדה אחד, משמעות אחת
עקרון התכנון ששורד מפגש עם המספר הגדול ביותר של מדינות הוא הפחות מתוחכם: יש לתת לכל פיסת מידע של כתובת שדה משלה עם משמעות אחת, ולעולם לא לתת לשם של שדה לרמוז על מדינה.
מבחינה מעשית המשמעות היא שדה של קוד מדינה, שדה חלוקה שאינו נקרא בשם של מדינה מסוימת, שדות נפרדים לנפה, לעיר, לרחוב, למספר הבית ולפרטי היחידה, שדה מיקוד, ושורה חופשית למידע שאינו נכנס לשום מקום. יש להשאיר את השדות רשותיים בסכימה ולדרוש את הנדרש לכל מדינה בזמן האימות, כשהמדינה ידועה.
יש להוסיף הגדרת תצוגה לכל מדינה, נשמרת בנפרד מן הנתונים: סדר השורות, אילו שדות מחוברים זה לזה, האם החלוקה מופיעה בגוש הכתובת, והיכן יושב המיקוד. הפרדה זו מאפשרת להוסיף מדינה בעריכת הגדרה אחת במקום לפתוח מחדש את לוגיקת הטופס. היא גם מבטיחה שתקלה בפריסה אינה יכולה להשחית נתונים שמורים.
לבסוף, יש להיזהר בשרשור. אם בונים כתובת בשורה אחת לקריאת API, יש להפוך את המפריד לחלק מהגדרת התצוגה גם כן, משום שחיבור בפסיק בכל מקום מייצר כתובת שנקראת נכון רק במדינות שמשתמשות בפסיקים.
צעדים הבאים
יש לבחור שלוש מדינות שבאמת משרתים ולכתוב ביד איך כל אחת מהן מסדרת את אותו מידע. במקום שבו השלוש חלוקות, נמצאו התפרים שהתבנית עתידה להישבר עליהם. אחר כך יש להפיק כתובת אחת לכל מדינה במחולל הכתובות ולהדביק כל אחת מהן בטופס כדי לראות אם הפריסה עדיין הגיונית; המדריך לנתוני כתובת במערכי בדיקות מסביר איך לשמור את הדוגמאות האלה משוחזרות. כדאי לזכור מהן הדוגמאות האלה: ערכים מופקים שלהם צורה של כתובות אמיתיות, שנועדו לבדיקות ולא למסירה, ואינם מלמדים דבר על מקום מגוריו של איש.