פּראָהאָסטער > בלאָג > אַדמיניסטראַציע > אמת ערשטער, אָדער וואָס די סיסטעם דאַרף זיין דיזיינד באזירט אויף די דאַטאַבייס סטרוקטור
אמת ערשטער, אָדער וואָס די סיסטעם דאַרף זיין דיזיינד באזירט אויף די דאַטאַבייס סטרוקטור
היי האבר!
מיר פאָרזעצן צו ויספאָרשן די טעמע ז'אבא и פרילינגאַרייַנגערעכנט אין די דאַטאַבייס מדרגה. הייַנט מיר פאָרשלאָגן צו לייענען וועגן וואָס, ווען דיזיינינג גרויס אַפּלאַקיישאַנז, עס איז די דאַטאַבייס סטרוקטור, און נישט די דזשאַוואַ קאָד, וואָס זאָל זיין פון באַשטימענדיק וויכטיקייט, ווי דאָס איז געטאן, און וואָס זענען די אויסנעמען צו דעם הערשן.
אין דעם גאַנץ שפּעט אַרטיקל, איך וועט דערקלערן וואָס איך טראַכטן אַז אין כּמעט אַלע קאַסעס, די דאַטן מאָדעל אין אַ אַפּלאַקיישאַן זאָל זיין דיזיינד "פֿון די דאַטאַבאַסע" אלא ווי "פֿון די קייפּאַבילאַטיז פון Java" (אָדער וועלכער קליענט שפּראַך איר זענט. ארבעטן מיט). דורך טשוזינג די רגע צוגאַנג, איר אַרייַן אַ לאַנג וועג פון ווייטיק און צאָרעס אַמאָל דיין פּרויעקט סטאַרץ צו וואַקסן.
ווי סאַפּרייזד איך בין אַז עס איז אַזאַ אַ קליין סובסעט פון יוזערז וואָס, זיי זענען באַקאַנט מיט jOOQ, זענען אַוטריידזשד דורך די פאַקט אַז jOOQ עמעס פאַרלאָזנ אויף די מקור קאָד דזשענעריישאַן צו לויפן. קיין איינער איז סטאָפּפּינג איר פון ניצן jOOQ ווי איר זען פּאַסיק, און קיין איינער איז פאָרסינג איר צו נוצן קאָד דור. אָבער דורך פעליקייַט (ווי דיסקרייבד אין די מאַנואַל), jOOQ אַרבעט ווי דאָס: איר אָנהייבן מיט אַ (לעגאַט) דאַטאַבייס סטשעמאַ, פאַרקערט ינזשעניר עס מיט די jOOQ קאָד גענעראַטאָר צו באַקומען אַ סכום פון קלאסן וואָס רעפּראַזענץ דיין טישן, און דעמאָלט שרייַבן טיפּ- זיכערע פֿראגן קעגן די טישן:
for (Record2<String, String> record : DSL.using(configuration)
// ^^^^^^^^^^^^^^^^^^^^^^^ Информация о типах выведена на
// основании сгенерированного кода, на который ссылается приведенное
// ниже условие SELECT
.select(ACTOR.FIRST_NAME, ACTOR.LAST_NAME)
// vvvvv ^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ сгенерированные имена
.from(ACTOR)
.orderBy(1, 2)) {
// ...
}
עס זענען פאַרשידן פילאָסאָפיעס, אַדוואַנטידזשיז און דיסאַדוואַנטידזשיז פֿאַרבונדן מיט די אַפּראָוטשיז צו קאָד דור - מאַנואַל און אָטאַמאַטיק - וואָס איך בין נישט געגאנגען צו דיסקוטירן אין דעטאַל אין דעם אַרטיקל. אָבער, אין אַלגעמיין, די גאנצע פונט פון די דזשענערייטאַד קאָד איז אַז עס אַלאַוז איר צו רעפּראָדוצירן אין Java די "אמת" וואָס מיר נעמען פֿאַר געגעבן, אָדער אין אונדזער סיסטעם אָדער אַרויס עס. אין אַ זינען, קאָמפּילערס וואָס דזשענערייט בייטעקאָוד, מאַשין קאָד אָדער עטלעכע אנדערע סאָרט פון קאָד פון מקור קאָד טאָן די זעלבע זאַך - מיר באַקומען אַ פאַרטרעטונג פון אונדזער "אמת" אין אן אנדער שפּראַך, ראַגאַרדלאַס פון ספּעציפיש סיבות.
מיר דאַרפֿן אַ היגע פאַרטרעטונג פון דעם אמת אין אונדזער פּראָגראַממינג שפּראַך.
דערצו, עס איז כּמעט שטענדיק קעדייַיק צו דזשענערייט אַזאַ אַ פאַרטרעטונג - אין סדר צו ויסמיידן יבעריקייַט.
טיפּ פּראַוויידערז און אַנאַטיישאַן פּראַסעסינג
באַמערקונג: אן אנדער, מער מאָדערן און ספּעציפיש צוגאַנג צו דזשענערייטינג קאָד פֿאַר jOOQ ינוואַלווז די נוצן פון טיפּ פּראַוויידערז, ווי זיי זענען ימפּלאַמענאַד אין F #. אין דעם פאַל, די קאָד איז דזשענערייטאַד דורך די קאַמפּיילער, אַקשלי אין די זאַמלונג בינע. אין פּרינציפּ, אַזאַ קאָד טוט נישט עקסיסטירן אין די פאָרעם פון מקור קאָודז. אין Java, עס זענען ענלעך מכשירים, כאָטש ניט ווי עלעגאַנט - דאָס זענען אַנאַטיישאַן פּראַסעסערז, למשל, לאָמבאָק.
אין אַ געוויסן זינען, די זעלבע זאכן פּאַסירן דאָ ווי אין דער ערשטער פאַל, אַחוץ:
איר טאָן ניט זען די דזשענערייטאַד קאָד (אפֿשר די סיטואַציע איז נישט אַזוי ריפּאַלסיוו פֿאַר עמעצער?)
וואָס איז די פּראָבלעם מיט די פּראָדוקציע פון קאָד?
אין אַדישאַן צו די טריקי קשיא פון ווי עס איז בעסער צו אָנהייבן קאָד דזשענערייטינג - מאַניואַלי אָדער אויטאָמאַטיש, איך האָבן צו דערמאָנען אַז עס זענען מענטשן וואָס גלויבן אַז קאָד דור איז נישט דארף. די טערעץ פֿאַר דעם פונט פון מיינונג, וואָס איך געפֿונען רובֿ אָפט, איז אַז עס איז שווער צו שטעלן די בויען רערנ - ליניע. יא, עס איז טאַקע שווער. עס זענען נאָך ינפראַסטראַקטשער קאָס. אויב איר נאָר אָנהייבן מיט אַ באַזונדער פּראָדוקט (זיין עס jOOQ, אָדער JAXB, אָדער Hibernate, אאז"ו ו), עס נעמט צייט צו שטעלן אַ וואָרקבענטש וואָס איר וואָלט ווי צו פאַרברענגען צו לערנען די API זיך צו באַקומען ווערט פון עס. .
אויב די קאָס פֿאַר די פארשטאנד פון די גענעראַטאָר מיטל זענען צו הויך, טאַקע, די API האט אַ נעבעך אַרבעט אויף די וסאַביליטי פון די קאָד גענעראַטאָר (און אין דער צוקונפֿט עס טורנס אויס אַז קוסטאָמיזאַטיאָן אין עס איז אויך שווער). וסאַביליטי זאָל זיין די העכסטן בילכערקייַט פֿאַר אַזאַ אַפּי. אָבער דאָס איז בלויז איין אַרגומענט קעגן די דור פון קאָד. אַנדערש, שרייַבן לעגאַמרע דורך האַנט די היגע פאַרטרעטונג פון ינערלעך אָדער פונדרויסנדיק אמת.
אָבער אין Hibernate / JPA עס איז אַזוי גרינג צו שרייַבן קאָד "אין דזשאַוואַ".
טאַקע. פֿאַר Hibernate און זיין יוזערז, דאָס איז ביידע אַ ברכה און אַ קללה. אין Hibernate, איר קענען פשוט שרייַבן אַ פּאָר פון ענטיטיז, ווי דאָס:
@Entity
class Book {
@Id
int id;
String title;
}
און כּמעט אַלץ איז גרייט. איצט די פּלאַץ פון כייבערנייט איז צו דזשענערייט קאָמפּלעקס "דעטאַילס" פון ווי פּונקט דעם ענטיטי וועט זיין דיפיינד אין די DDL פון דיין "דיאַלעקט" פון SQL:
CREATE TABLE book (
id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
title VARCHAR(50),
CONSTRAINT pk_book PRIMARY KEY (id)
);
CREATE INDEX i_book_title ON book (title);
... און אָנהייבן פליסנדיק די אַפּלאַקיישאַן. א טאַקע קיל שטריך צו באַקומען אַרויף און פליסנדיק געשווינד און פּרובירן פאַרשידענע טינגז.
אָבער, לאָזן מיר. איך בין געלעגן.
וועט Hibernate אַקשלי דורכפירן די דעפֿיניציע פון דעם געהייסן ערשטיק שליסל?
וואָס איז די קאַש גרייס אין דיין סיקוואַנס (הינטער די שייַן)
אַלע דעם קען נישט ענין אין קליין סיסטעמען, אָבער עס איז ניט נייטיק צו וואַרטן ביז די יבערגאַנג צו די מעלוכע פון "גרויס דאַטן" - איר קענען אָנהייבן צו נוץ פון פאַרקויפער-צוגעשטעלט סטאָרידזש אָפּטימיזאַטיאָנס, אַזאַ ווי די דערמאנט אויבן, פיל פריער. קיינער פון די אָרמס איך ווע געזען (אַרייַנגערעכנט jOOQ) צושטעלן אַקסעס צו די פול גאַנג פון DDL אָפּציעס וואָס איר זאל וועלן צו נוצן אין דיין דאַטאַבייס. ORMs פאָרשלאָגן עטלעכע מכשירים צו העלפן איר שרייַבן DDL.
אבער אין די סוף פון די טאָג, אַ געזונט-דיזיינד סטשעמאַ איז האַנט-געשריבן אין DDL. קיין דזשענערייטאַד DDL איז בלויז אַן אַפּראַקסאַמיישאַן פון עס.
די לעצטע פונט איז וויכטיק. ווען קאַמיונאַקייטינג מיט אַ פונדרויסנדיק סיסטעם ניצן קסמל אַרטיקלען, מיר ווילן צו זיין זיכער אַז אונדזער אַרטיקלען זענען גילטיק. דאָס איז זייער גרינג צו דערגרייכן מיט JAXB, XJC און XSD. עס וואָלט זיין לויטער מעשוגאַס צו טראַכטן אַז, אין אַ Java-ערשטער פּלאַן צוגאַנג, ווו מיר מאַכן אונדזער אַרטיקלען ווי Java אַבדזשעקץ, זיי קען עפעס זיין רענדערד ינטעלידזשאַבלי צו XML און געשיקט פֿאַר קאַנסאַמשאַן צו אן אנדער סיסטעם. די קסמל דזשענערייטאַד אין דעם וועג וואָלט זיין פון זייער נעבעך קוואַליטעט, אַנדאַקיאַמעניד און שווער צו אַנטוויקלען. אויב עס איז געווען אַ העסקעם אויף דער מדרגה פון דינסט קוואַליטעט (SLA) אויף אַזאַ אַ צובינד, מיר וואָלט מיד שרויף עס.
צו זיין ערלעך, דאָס איז פּונקט וואָס כאַפּאַנז אַלע מאָל מיט די JSON API, אָבער דאָס איז אן אנדער געשיכטע, איך וועט טייַנען ווייַטער מאָל ...
דאַטאַבייסיז: זיי זענען די זעלבע
ארבעטן מיט דאַטאַבייסיז, איר פֿאַרשטיין אַז זיי זענען אַלע בייסיקלי די זעלבע. די דאַטאַבייס אָונז זייַן דאַטן און מוזן פירן די סטשעמאַ. כל מאָדיפיקאַטיאָנס געמאכט צו די סטשעמאַ מוזן זיין ימפּלאַמענאַד גלייַך אין DDL אַזוי אַז די איין מקור פון אמת איז דערהייַנטיקט.
ווען דער מקור דערהייַנטיקן איז פארגעקומען, אַלע קלייאַנץ מוזן אויך דערהייַנטיקן זייער קאָפּיעס פון די מאָדעל. עטלעכע קלייאַנץ קען זיין געשריבן אין Java ניצן jOOQ און Hibernate אָדער JDBC (אָדער ביידע). אנדערע קלייאַנץ קענען זיין געשריבן אין פּערל (לאָמיר ווינטשן זיי גליק), אנדערע אין C #. עס טוט נישט ענין. דער הויפּט מאָדעל איז אין די דאַטאַבייס. ORM-דזשענערייטאַד מאָדעלס זענען יוזשאַוואַלי פון נעבעך קוואַליטעט, שוואַך דאַקיומענטאַד און שווער צו אַנטוויקלען.
אַזוי טאָן ניט מאַכן מיסטייקס. דו זאלסט נישט מאַכן מיסטייקס פון די אָנהייב. אַרבעט פֿון אַ דאַטאַבייס. בויען אַ דיפּלוימאַנט רערנ - ליניע וואָס קענען זיין אָטאַמייטיד. געבן קאָד גענעראַטאָרס צו קאַנוויניאַנטלי נאָכמאַכן דיין דאַטאַבייס מאָדעל און דאַמפּ עס אויף קלייאַנץ. און האַלטן זאָרג וועגן קאָד גענעראַטאָרס. זיי זענען גוט. מיט זיי, איר וועט ווערן מער פּראָדוקטיוו. כל איר דאַרפֿן צו טאָן איז צו פאַרברענגען אַ ביסל צייט צו באַשטעטיקן זיי גלייך פֿון די אָנהייב, און איר וועט האָבן יאָרן פון ימפּרוווד פאָרשטעלונג צו בויען דיין פּרויעקט ס געשיכטע.
דאנק מיר נאך נישט, שפעטער.
קלעראַפאַקיישאַן
צו זיין קלאָר: דער אַרטיקל טוט נישט אַדוואָקאַט אין קיין וועג אַז די גאנצע סיסטעם (ד"ה פעלד, געשעפט לאָגיק, אאז"ו ו, אאז"ו ו) דאַרף זיין פלעקסיד צו פּאַסיק דיין דאַטאַבייס מאָדעל. וואָס איך רעדן וועגן אין דעם אַרטיקל איז אַז קליענט קאָד וואָס ינטעראַקץ מיט אַ דאַטאַבייס זאָל זיין אַקט אויף די יקער פון די דאַטאַבייס מאָדעל אַזוי אַז עס קען נישט רעפּראָדוצירן די דאַטאַבייס מאָדעל אין "ערשטער קלאַס" סטאַטוס. אַזאַ לאָגיק איז יוזשאַוואַלי ליגן אין די דאַטן אַקסעס שיכטע אויף דיין קליענט.
אין צוויי-שטאַפּל אַרקאַטעקטשערז, וואָס זענען נאָך אפגעהיט אין עטלעכע ערטער, אַזאַ אַ סיסטעם מאָדעל קען זיין דער בלויז מעגלעך. אָבער, אין רובֿ סיסטעמען, די דאַטן אַקסעס שיכטע מיינט צו מיר אַ "סובסיסטעם" וואָס ענקאַפּסאַלייץ די דאַטאַבייס מאָדעל.
Exceptions
עס זענען אויסנעמען צו יעדער הערשן, און איך האָבן געזאָגט פריער אַז די דאַטאַבייס ערשטער און מקור קאָד דור צוגאַנג קענען מאל זיין ינאַפּראָופּרייט. דאָ זענען אַ פּאָר פון אַזאַ אויסנעמען (עס זענען מיסטאָמע אנדערע):
ווען די סטשעמאַ איז אומבאַקאַנט און דאַרף זיין געעפנט. פֿאַר בייַשפּיל, איר צושטעלן אַ געצייַג צו העלפֿן ניצערס צו נאַוויגירן קיין דיאַגראַמע. פיי. עס איז קיין קאָד דור דאָ. אבער נאָך - די דאַטאַבאַסע ערשטער פון אַלע.
אויסנעמען זענען פון נאַטור יקסעפּשאַנאַל. אין רובֿ פאלן מיט די נוצן פון RDBMS, די סטשעמאַ איז באקאנט אין שטייַגן, עס איז ין די RDBMS און איז דער בלויז מקור פון "אמת", און אַלע קלייאַנץ האָבן צו קריגן קאָפּיעס דערייווד פון עס. ידעאַללי, דאָס זאָל אַרייַנציען אַ קאָד גענעראַטאָר.