בדף הזה מוסבר על אסטרטגיות ליצירת ערכי מפתח ראשי בטבלה באמצעות ביטויי ערך ברירת מחדל. המידע בדף הזה רלוונטי למסדי נתונים של ניב GoogleSQL ולמסדי נתונים של ניב PostgreSQL. היתרונות של השיטות האלה:
- מניעת נקודות חמות
- פישוט ההעברות ממסדי נתונים אחרים
- הלוגיקה המרכזית מוטמעת במסד הנתונים, כך שלא צריך לדאוג לניהול שלה באפליקציה
- ברוב המקרים, לא צריך ליצור ולנהל רצפים משלכם
שיטות ליצירת מפתחות ראשיים באופן אוטומטי
כדי ליצור באופן אוטומטי ערכים של מפתח ראשי, אפשר להשתמש באסטרטגיות הבאות בעמודה עם ביטויי DEFAULT:
- פונקציית UUID שמייצרת ערכי UUID בגרסה 4.
- עמודות
IDENTITYשיוצרות באופן אוטומטי ערכים מספריים שלמים לעמודות מפתח ולעמודות שאינן מפתח. -
SERIALב-PostgreSQL ו-AUTO_INCREMENTב-GoogleSQL, שהם כינויים של DDL לעמודותIDENTITY. - אובייקט סכימה,
SEQUENCE, עם אפשרותbit_reversed_positive. SEQUENCEזמין גם ב-GoogleSQL וגם ב-PostgreSQL.
מזהה ייחודי אוניברסלי (UUID)
מערכת Spanner יכולה ליצור באופן אוטומטי מזהה ייחודי אוניברסלי (UUID) בגרסה 4 לשימוש כמפתח ראשי. מזהי UUID מתאימים במיוחד לאפליקציות חדשות ולטבלאות עם הרבה שורות. הם מפוזרים באופן אחיד בערך במרחב המפתחות, מה שמונע נקודות חמות בקנה מידה גדול. יצירת UUID יכולה ליצור מספר גדול של ערכים (2122), וכל ערך הוא ייחודי למעשה. לדוגמה, כדי לקבל הסתברות של 50% להתנגשות, צריך 2.71×1018 ערכים, או מיליארד ערכים בשנייה למשך 86 שנים. השימוש בפונקציה הזו מבטיח ערכים ייחודיים כשמשתמשים בה בטבלאות גדולות. מזהי UUID הם ייחודיים, בין אם יוצרים אותם במסד הנתונים או בלקוח. מומלץ להשתמש ב-UUID כשזה אפשרי. אפשר לשלב בבטחה מזהי UUID שנוצרו על ידי הלקוח ומזהי UUID שנוצרו על ידי Spanner באותה טבלה, אם מזהי ה-UUID שנוצרו על ידי הלקוח עוברים סריאליזציה באותיות קטנות, בהתאם ל-RFC 4122.
כדי ליצור ערכי ברירת מחדל לעמודה, אפשר להשתמש בפונקציה NEW_UUID של GoogleSQL או בפונקציה gen_random_uuid() של PostgreSQL. בדוגמה הבאה מוצג איך ליצור טבלה שבה FanId עמודת המפתח כוללת UUID שנוצר בעמודת הערך כערך ברירת המחדל.
GoogleSQL
CREATE TABLE Fans (
FanId UUID DEFAULT (NEW_UUID()),
Name STRING(MAX),
) PRIMARY KEY (FanId);
PostgreSQL
CREATE TABLE Fans (
FanId uuid DEFAULT gen_random_uuid(),
Name text,
PRIMARY KEY (FanId)
);
GoogleSQL
INSERT INTO Fans (Name) VALUES ('Melissa Garcia')
THEN RETURN FanId;
PostgreSQL
INSERT INTO fans (name) VALUES ('Melissa Garcia')
RETURNING (fanid);
ההצהרה הזו מחזירה תוצאה שדומה לזו:
| FanId |
|---|
| 6af91072-f009-4c15-8c42-ebe38ae83751 |
מידע נוסף על פונקציות UUID שנוצרו זמין בדף העזר בנושא GoogleSQL או PostgreSQL.
IDENTITY עמודות
בעזרת עמודות IDENTITY, אפשר ליצור באופן אוטומטי ערכים מספריים שלמים לעמודות מפתח ולעמודות שאינן מפתח. בעמודות IDENTITY אין צורך לתחזק באופן ידני רצף בסיסי או לנהל את הקשר בין העמודה לרצף הבסיסי. כשמוחקים עמודת זהות שנוצרה אוטומטית, גם הרצף הבסיסי נמחק אוטומטית.
כדי להשתמש בעמודות IDENTITY, אפשר לספק ערך של מספר שלם להתחלה כשיוצרים את הרצף, או לאפשר ל-Spanner ליצור את רצף המספרים השלמים בשבילכם. כדי לספק ערך התחלתי מסוג מספר שלם, צריך להשתמש באפשרות START COUNTER WITH ובערך התחלתי חיובי INT64.
מערכת Spanner משתמשת בערך הזה כדי להגדיר את הערך הבא עבור מונה הרצף הפנימי שנוצר אוטומטית, והופכת את סדר הביטים של הערך לפני שהיא מוסיפה אותו לעמודה הזו.
ב-Spanner, עמודות IDENTITY נתמכות גם ב-GoogleSQL וגם ב-PostgreSQL.
GoogleSQL
בדוגמה הבאה מוצג אופן השימוש בעמודות IDENTITY כדי ליצור עמודה של מפתח ראשי מסוג מספר שלם שנוצר אוטומטית עבור SingerId כשיוצרים טבלה חדשה באמצעות הפקודה CREATE TABLE:
CREATE TABLE Singers (
SingerId INT64 GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
Name STRING(MAX),
Rank INT64
) PRIMARY KEY (SingerId);
אפשר גם לציין את נקודת ההתחלה של המונה בעמודה באמצעות האפשרות START_WITH_COUNTER. בדוגמה הבאה, נוצרת עמודה של מספרים שלמים שנוצרה אוטומטית עבור SingerId, עם ערכים חיוביים שהביטים שלהם הפוכים ומונה פנימי שמתחיל ב-1,000.
CREATE TABLE Singers (
SingerId INT64 GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE START COUNTER WITH 1000),
Name STRING(MAX),
Rank INT64
) PRIMARY KEY (SingerId);
PostgreSQL
בדוגמה הבאה מוצג שימוש בעמודות IDENTITY כדי ליצור עמודת מספרים שלמים שנוצרת אוטומטית עבור SingerId כשיוצרים טבלה חדשה באמצעות הפקודה CREATE
TABLE:
CREATE TABLE Singers (
SingerId bigint GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
Name text,
PRIMARY KEY (SingerId)
);
אפשר גם לציין את נקודת ההתחלה של המונה בעמודה באמצעות האפשרות START COUNTER WITH. בדוגמה הבאה, נוצרת עמודה של מספרים שלמים שנוצרה אוטומטית עבור SingerId, שמייצרת ערכים חיוביים עם היפוך ביטים, והמונה הפנימי, לפני היפוך הביטים, מתחיל מ-1,000.
CREATE TABLE Singers (
SingerId bigint GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE START COUNTER WITH 1000),
Name text,
PRIMARY KEY (SingerId)
);
SERIAL וגם AUTO_INCREMENT
Spanner תומך ב-SERIAL ב-PostgreSQL וב-AUTO_INCREMENT ב-GoogleSQL, שהם כינויים של DDL לעמודות IDENTITY ומשמשים ליצירת עמודות ייחודיות של מספרים שלמים. לפני שמשתמשים ב-SERIAL או ב-AUTO_INCREMENT, צריך להגדיר את האפשרות default_sequence_kind של מסד הנתונים.
אפשר להשתמש בהצהרת ה-SQL הבאה כדי להגדיר את האפשרות של מסד הנתונים default_squence_kind:
GoogleSQL
ALTER DATABASE db SET OPTIONS (default_sequence_kind = 'bit_reversed_positive');
CREATE TABLE Singers (
id INT64 AUTO_INCREMENT PRIMARY KEY,
name STRING(MAX),
)
PostgreSQL
ALTER DATABASE db SET spanner.default_sequence_kind = 'bit_reversed_positive';
CREATE TABLE Singers (
id serial PRIMARY KEY,
name text
);
שימו לב: מכיוון שהמיפוי של SERIAL ו-AUTO_INCREMENT הוא לעמודות IDENTITY, הן לא יופיעו כשמבצעים סריאליזציה של הסכימה. עבור הסכימה הזו, הפלט של GetDatabaseDDL יהיה:
GoogleSQL
ALTER DATABASE db SET OPTIONS (default_sequence_kind = 'bit_reversed_positive');
CREATE TABLE Singers (
id INT64 GENERATED BY DEFAULT AS IDENTITY,
name STRING(MAX),
) PRIMARY KEY (id);
PostgreSQL
ALTER DATABASE db SET spanner.default_sequence_kind = 'bit_reversed_positive';
CREATE TABLE Singers (
id bigint GENERATED BY DEFAULT AS IDENTITY NOT NULL,
name character varying,
PRIMARY KEY(id)
);
רצף הפוך של ביטים
רצף עם היפוך ביטים הוא אובייקט סכימה שמפיק רצף של מספרים שלמים והופך את הביטים שלהם. האובייקט הזה משתמש בהיפוך ביטים במונה פרטי פנימי של Spanner כדי להבטיח ייחודיות. הערכים ההפוכים בביטים שמתקבלים עוזרים להימנע מנקודות חמות בקנה מידה גדול כשמשתמשים בהם כמפתח ראשי.
ב-Spanner, משתמשים בהצהרות DDL עם המאפיין bit_reversed_positive כדי ליצור, לשנות או להסיר רצף שמפיק ערכים חיוביים הפוכים (GoogleSQL או PostgreSQL).SEQUENCE
כל רצף שומר על קבוצה של מוני פנימיים ומשתמש בהם כדי ליצור ערך. מונה הרצף מספק את הקלט לאלגוריתם של היפוך הביטים.
כשמגדירים עמודה עם ביטוי DEFAULT שמשתמש בפונקציה GET-NEXT-SEQUENCE-VALUE של GoogleSQL או בפונקציה nextval של PostgreSQL כערך ברירת המחדל שלה, מערכת Spanner קוראת לפונקציה באופן אוטומטי ומכניסה לעמודה את ערכי הפלט שהתקבלו אחרי היפוך הביטים. רצפים הפוכים של ביטים שימושיים במיוחד למפתחות ראשיים, כי הערכים ההפוכים של הביטים מפוזרים באופן שווה במרחב המפתחות, כך שהם לא גורמים לנקודות חמות.
בדוגמה הבאה מוצג איך ליצור רצף עם היפוך סיביות וטבלה שבה עמודת המפתח משתמשת ברצף כערך ברירת המחדל:
GoogleSQL
CREATE SEQUENCE SingerIdSequence OPTIONS (
sequence_kind="bit_reversed_positive"
);
CREATE TABLE Singers (
SingerId INT64 DEFAULT (GET_NEXT_SEQUENCE_VALUE(SEQUENCE SingerIdSequence)),
Name STRING(MAX),
Rank INT64,
) PRIMARY KEY (SingerId);
PostgreSQL
CREATE SEQUENCE SingerIdSequence bit_reversed_positive;
CREATE TABLE Singers (
SingerId bigint DEFAULT nextval('SingerIdSequence'),
Name text,
PRIMARY KEY (SingerId)
);
אחר כך אפשר להשתמש בהצהרת ה-SQL הבאה כדי להוסיף את ערך המפתח הראשי ולהחזיר אותו:
GoogleSQL
INSERT INTO Singers (Name) VALUES ('Melissa Garcia')
THEN RETURN SingerId;
PostgreSQL
INSERT INTO Singers (name) VALUES ('Melissa Garcia')
RETURNING (SingerId);
ההצהרה הזו מחזירה תוצאה שדומה לזו:
| SingerId |
|---|
| 3458764513820540928 |
תרחישים לשימוש ב-UUID וברצפים כערכי ברירת מחדל למפתחות ראשיים
התרחישים של UUID ורצפים כוללים את האפשרויות הבאות:
- אפליקציות חדשות
- מיגרציות
בקטעים הבאים מתואר כל תרחיש.
אפליקציות חדשות
באפליקציות חדשות, מומלץ להשתמש במזהה ייחודי אוניברסלי (UUID) כמפתחות ראשיים. מידע נוסף זמין במאמר שימוש במזהה ייחודי אוניברסלי (UUID).
אם האפליקציה הקיימת שלכם דורשת מפתחות INT64 ב-GoogleSQL או מפתחות bigint ב-PostgreSQL, Spanner מציע את אובייקט הסכימה של רצף חיובי הפוך-ביטים (PostgreSQL או GoogleSQL).
מיגרציות
כשמעבירים טבלאות ל-Spanner, יש לכם את האפשרויות הבאות:
- אם אתם משתמשים ב-UUID במסד הנתונים של המקור, ב-Spanner אתם יכולים להשתמש בעמודה מסוג UUID ובפונקציה ליצירת UUID (GoogleSQL או PostgreSQL) כערך ברירת המחדל שלה.
- אם אתם משתמשים במפתח ראשי מסוג מספר שלם, והאפליקציה שלכם צריכה רק שהמפתח יהיה ייחודי, אתם יכולים להשתמש בעמודת מפתח ב-
INT64ולהשתמש ברצף חיובי הפוך ביטים כערך ברירת המחדל של המפתח הראשי. ראו העברה של עמודות מפתחות עם היפוך סיביות. - אין ב-Spanner תמיכה בדרך ליצור ערכים מונוטוניים.
אם אתם משתמשים במפתח מונוטוני, כמו סוג
SERIALב-PostgreSQL או מאפייןAUTO_INCREMENTב-MySQL, ואתם צריכים מפתחות מונוטוניים חדשים ב-Spanner, אתם יכולים להשתמש במפתח מורכב. מידע נוסף זמין במאמרים החלפת הסדר של המפתחות וגיבוב של המפתח הייחודי והפצת פעולות הכתיבה על פני רסיסים לוגיים. - אם האפליקציה שלכם מבצעת היפוך ביטים ידני של מפתח
INT64ב-GoogleSQL או של מפתחbigintב-PostgreSQL, אתם יכולים להשתמש ברצף חיובי עם היפוך ביטים (GoogleSQL או PostgreSQL) כדי ליצור ערכי מפתח חדשים. למידע נוסף, ראו העברת עמודות של מפתחות עם היפוך ביטים.
המאמרים הבאים
- מידע נוסף על שימוש ברצפים עם בקרת גישה מפורטת
- מידע על הצהרות DDL
SEQUENCEל-GoogleSQL או ל-PostgreSQL. - מידע על פונקציות של רצפים ב-GoogleSQL או ב-PostgreSQL
- מידע על רצפים ב-INFORMATION_SCHEMA ב-GoogleSQL או ב-PostgreSQL
- מידע על אפשרויות של קמפיינים בהמשכים ב-INFORMATION_SCHEMA של GoogleSQL