כלי סכימה — טבלאות ושדות
שלושה כלים מכסים את שכבת הסכימה: אחד קורא (Get-Schema) ושניים כותבים (Create-Table, Add-Field-to-Table).
זו נקודת הפתיחה של חבילת הבנייה. דף, טבלת תצוגה, דוח או חוק טופס — כולם מפנים לשמות שדות שחייבים להתקיים בסכימה לפני שמזכירים אותם. שדה שלא קיים אינו נכשל בקול; הוא פשוט לא מופיע.
Get-Schema
Section titled “Get-Schema”מחזיר את מבנה הטבלאות והשדות. בלי className — כל הטבלאות במערכת; עם className — טבלה אחת.
| הפרמטר | טיפוס | חובה | המשמעות |
|---|---|---|---|
className |
String | שם המחלקה. בלי הפרמטר מוחזרת הסכימה של כל הטבלאות | |
tablesNameOnly |
Boolean | true = רק שמות הטבלאות, בלי השדות |
// טבלה אחת — זו הקריאה שתעשו בפועל{ "className": "Accounts" }
// רק שמות הטבלאות — מיפוי מהיר של מערכת חדשה{ "tablesNameOnly": true }מה חוזר
Section titled “מה חוזר”התשובה היא אובייקט שמפתחו שם המחלקה: { "Accounts": { "Name": "String", "StatusId": { "type": "Pointer", "targetClass": "AccountStatuses", "dictionary": "סטטוס" }, … } }. שדה פשוט מיוצג במחרוזת הטיפוס; שדה Pointer — באובייקט עם type ו‑targetClass. שדה שיש לו תווית נושא גם dictionary — התווית בעברית שנשמרה עבורו בטבלת _Dictionary (שם הטבלה ב‑tblName, השדה ב‑field, התווית ב‑value), וזו התווית שהמשתמש רואה בדפים ובבורר העמודות.
השדות שכל רשומה מקבלת אוטומטית, בכל טבלה: objectId (10 תווים), createdAt, updatedAt, createdBy (Pointer ל‑_User), updatedBy (Pointer ל‑_User) ו‑ACL.
הטריגרים אינם חלק מתשובת Get-Schema — גם לטבלה בודדת חוזרים השדות בלבד. את הגדרות האוטומציה של טבלה קוראים ב‑Get-Triggers.
הטיפוסים
Section titled “הטיפוסים”ה‑enum של הסכימה החיה — בשני כלי הכתיבה — מכיל עשרה טיפוסים בדיוק:
| הטיפוס | איך זה נראה בטופס | מתי משתמשים |
|---|---|---|
String |
<input type="text"> |
שמות, טקסט חופשי |
Number |
<input type="number"> |
סכומים, דירוגים. סכום/ממוצע/מינימום/מקסימום בטבלאות ובדוחות עובדים רק על Number |
Boolean |
תיבת סימון | דגלים (Active, IsVIP) |
Date |
בורר תאריך | דד‑ליינים, אירועים |
Array |
ווידג’ט רב‑ערכי | תגיות, בחירה מרובה — ראו מוסכמת השם למטה |
Object |
(אין ווידג’ט סטנדרטי) | בלוקים מובנים. הימנעו בשדות שמשתמש נוגע בהם |
Pointer |
<select class="select-pointer"> |
כל רשימה נפתחת וכל קשר בין טבלאות |
File |
ווידג’ט העלאה | קובץ ציבורי |
PrivateFile |
ווידג’ט העלאה | קובץ שדורש הרשאה להורדה |
GeoPoint |
— | מיקום. כמעט לא בשימוש במודולי ה‑CRM |
מוסכמות שמות
Section titled “מוסכמות שמות”- שם שדה:
/^[A-Za-z][A-Za-z0-9_]*$/, CamelCase —PhoneNumber,ContractEndDate. - שדה Pointer מסתיים ב‑
Id—StatusId,OwnerId,AccountId. זו לא דרישה של השרת אלא מוסכמת המוצר, וכל התיעוד וכל הכלים מניחים אותה. - שם טבלה: אותו regex, PascalCase, ברבים —
Projects,SaleRows,ProjectStatuses. - שדה Array של Pointers: השם הוא זה שקובע את סוג הפריטים. המוסכמה שקוד הריצה מזהה היא
array_<purpose>_Pointer_<TargetTable>— למשלarray_languages_Pointer_Languages— והיא מרנדרת<select multiple>אמיתי בלי שורת JS אחת. תיאור הכלי מדגים גם את הצורהSalesId_Pointer_Sales. שדה Array בלי מוסכמת השם מתנהג כמערך אטום, בלי ווידג’ט.
Create-Table
Section titled “Create-Table”יוצר טבלה חדשה. שדה Name מסוג String נוסף אוטומטית — אל תגדירו אותו שוב.
| הפרמטר | טיפוס | חובה | המשמעות |
|---|---|---|---|
name |
String | ✔ | שם הטבלה. /^[A-Za-z][A-Za-z0-9_]*$/ |
fields |
Array<Object> | מערך שדות. בלי הפרמטר — הטבלה נוצרת עם Name בלבד |
אובייקט השדה (זהה בשני כלי הכתיבה):
| המפתח | טיפוס | חובה | המשמעות |
|---|---|---|---|
name |
String | ✔ | שם השדה, באותו regex |
type |
Enum | ✔ | אחד מעשרת הטיפוסים למעלה |
label |
String | התווית בעברית — “to put in the html”. זה מה שהמשתמש רואה | |
targetClass |
String | ל‑Pointer | המחלקה שאליה השדה מצביע |
{ "name": "Suppliers", "fields": [ { "name": "SupplierCode", "type": "String", "label": "קוד ספק" }, { "name": "Rating", "type": "Number", "label": "דירוג (1-5)" }, { "name": "Active", "type": "Boolean", "label": "ספק פעיל" }, { "name": "JoinDate", "type": "Date", "label": "תאריך הצטרפות" }, { "name": "StatusId", "type": "Pointer", "targetClass": "SupplierStatuses", "label": "סטטוס" }, { "name": "AccountId", "type": "Pointer", "targetClass": "Accounts", "label": "לקוח" }, { "name": "OwnerId", "type": "Pointer", "targetClass": "_User", "label": "אחראי" } ]}שימו לב: targetClass אינו נבדק מול הסכימה. Pointer ל‑SupplierStatuses ייווצר גם אם הטבלה הזו עדיין לא קיימת — הכלי יחזיר success, והרשימה הנפתחת תישאר ריקה עד שתיצרו אותה. לכן סדר העבודה מתחיל בטבלאות ה‑lookup.
למה דרך הכלי ולא כתיבת סכימה גולמית
Section titled “למה דרך הכלי ולא כתיבת סכימה גולמית”אפשר ליצור טבלה גם ב‑POST /parse/schemas/<Class> עם Master Key, וזו נראית אותה פעולה. היא לא.
| מה שקורה | דרך הכלי | דרך REST גולמי |
|---|---|---|
| הטבלה והשדות נוצרים | ✔ | ✔ |
התווית בעברית נכתבת ל‑_Dictionary |
✔ (מהפרמטר label) |
✖ — השדה יופיע בשמו האנגלי בכל דף ובכל בורר עמודות |
| הרשאות טבלה (CLP) מוגדרות | ✔ | ✖ — הטבלה נולדת עם CLP ריק |
| ACL לרשומות שנוצרות | לפי המסלול שיצר את הרשומה | ✖ — רשומות שנוצרו ב‑REST נולדות בלי ACL, ומשתמשים מחוברים עלולים לא לראות אותן |
שכבת ה‑REST מדלגת על שתי השכבות הראשונות מפני שהן שכבות מוצר, לא שכבות Parse. התוצאה של יצירה ב‑REST היא טבלה שנראית תקינה ב‑Get-Schema ומייצרת שתי תקלות אצל הלקוח: שמות שדה באנגלית בממשק עברי, ו“אין לך הרשאות” בכל דף שמבוסס עליה.
Add-Field-to-Table
Section titled “Add-Field-to-Table”מוסיף שדות לטבלה קיימת — ויודע ליצור טבלת lookup חדשה ולזרוע בה ערכים באותה קריאה.
| הפרמטר | טיפוס | חובה | המשמעות |
|---|---|---|---|
table |
String | ✔ | הטבלה שמרחיבים |
fields |
Array<Object> | ✔ | אותו אובייקט שדה כמו ב‑Create-Table |
newTableName |
String | שם טבלת lookup חדשה שתיווצר עבור שדה ה‑Pointer | |
newTableValues |
Array<String> | ערכי Name לזריעה בטבלה החדשה |
הוספה פשוטה:
{ "table": "Accounts", "fields": [ { "name": "Website", "type": "String", "label": "אתר אינטרנט" }, { "name": "FoundedYear", "type": "Number", "label": "שנת הקמה" } ]}דפוס הרשימה הנפתחת בקריאה אחת
Section titled “דפוס הרשימה הנפתחת בקריאה אחת”// יוצר את TaskCategories עם 5 רשומות, ומוסיף Tasks.CategoryId שמצביע אליה{ "table": "Tasks", "fields": [ { "name": "CategoryId", "type": "Pointer", "targetClass": "TaskCategories", "label": "קטגוריה" } ], "newTableName": "TaskCategories", "newTableValues": ["פיתוח", "תמיכה", "מכירות", "שיווק", "אחר"]}שימו לב ש‑targetClass בתוך fields ו‑newTableName חייבים להיות אותו שם. הכלי מבצע כאן שלוש פעולות: יוצר טבלה, זורע בה רשומות, ומחבר אליה שדה Pointer.
targetClass — מה זה באמת אומר
Section titled “targetClass — מה זה באמת אומר”targetClass הוא שם המחלקה שאליה השדה מצביע, והוא הרבה יותר ממטא‑דאטה: הוא המנגנון שדרכו המוצר מממש רשימות נפתחות.
כל dropdown ב‑MyBusiness הוא טבלה נפרדת ועוד שדה Pointer — לעולם לא רשימת ערכים סטטית.
- טבלת הערכים — רשומה אחת לכל אפשרות; השדה
Nameהוא הטקסט המוצג. שדות נוספים מקובלים:Color(מחרוזת hex — משמש לתגיות סטטוס ולעיצוב מותנה),Order(Number, למיון) ו‑Active(Boolean). - שדה ה‑Pointer על הטבלה הראשית —
SaleStatusIdשמצביע ל‑SaleStatuses.
ההשלכות המעשיות:
- הוספה, שינוי שם או סידור מחדש של אפשרויות = עריכת רשומות בטבלת הערכים. רשומות קיימות ממשיכות להצביע לאותו
objectId, ולכן שינוי שם של אפשרות לא שובר היסטוריה. - ערך Pointer בפעולת נתונים הוא תמיד האובייקט המלא:
{"__type":"Pointer","className":"SaleStatuses","objectId":"zrP1MSVBoq"}. ראו סוגי נתונים. - ב‑
targetClassשל משתמש הערך הוא_User— ושדות ה‑_Userהם באותיות קטנות:name,email,phone. זו טעות חוזרת בכל מסלול Pointer בטבלאות תצוגה ובדוחות. - רשימות נפתחות מדורגות (סוג ← תת‑סוג) אינן נבנות בחוקי טופס אלא במנגנון האב/בן המובנה —
subclassDependב‑Edit-Page.
מה אי אפשר לעשות
Section titled “מה אי אפשר לעשות”| הפעולה | MCP | ממשק הניהול | REST עם Master Key |
|---|---|---|---|
| הוספת שדה | ✔ Add-Field-to-Table |
✔ | ✔ PUT /parse/schemas/<Class> |
| שינוי שם שדה | ✖ | ✖ | ✖ — מגבלת Parse. הפתרון: שדה חדש + העברת נתונים |
| שינוי טיפוס שדה | ✖ | ✖ | ✖ — אותה מגבלה |
| מחיקת שדה | ✖ | ✔ | ✔ {"fields":{"FieldName":{"__op":"Delete"}}} — מוחק את העמודה ואת הנתונים |
| מחיקת טבלה | ✖ | ✔ | ✔ DELETE /parse/schemas/<Class> (רק כשהיא ריקה) |
עדכון התווית ב‑_Dictionary |
✖ — ה‑label נכתב פעם אחת, ביצירה |
✔ | — |
| הסרת שדה מדף (נשאר ב‑DB) | ✔ Edit-Page |
✔ | — |
שינויי סכימה הם גלובליים ומיידיים. אין מחזור טיוטה/פרסום בשכבת הנתונים — בניגוד לדפים, שיש להם גרסאות.
סדר העבודה לטבלה חדשה
Section titled “סדר העבודה לטבלה חדשה”Get-Schemaעל הטבלאות הקשורות — לאמת יעדי Pointer ולמנוע התנגשות שמות.- טבלאות lookup קודם (
<Entity>StatusesעםNameו‑Color), אחר כך הטבלה הראשית, ואז טבלאות הבן — כל בן מקבל Pointer חזרה לאב. labelבעברית על כל שדה בזמן היצירה — זה הרגע הזול היחיד לעשות את זה.Set-Table-Permissions— CLP מבוסס תפקידים על כל טבלה חדשה.- זריעת ערכי ה‑lookup (
Create-Many) לפני שבונים דפים. - אימות:
Get-Schemaעל הטבלה החדשה מראה את השדות;Get-Table-Permissions(הפרמטר שלו הואtable, לאtableName) מראה מפתחותrole:;Count-Dataמחזיר את הרשומות שנזרעו.
ומכאן ממשיכים לדפים: Create-Form-Page ← Edit-Page ← Create-Table-View-Page ← חוקי טופס.
- אתרים ודפים — קריאה · עריכת דפים ואלמנטים
- תפקידים, הרשאות טבלה וחבילות — הצעד שאסור לדלג עליו אחרי יצירת טבלה
- טבלאות תצוגה ודפי רשימה —
Get-Optional-FieldsודוקטרינתaggrField - כלי נתונים — לזרוע ולקרוא את מה שיצרתם
- סכימות ב‑REST · מפת הטבלאות המרכזיות · סוגי נתונים
- אינדקס הכלים המלא