Chowonadi choyamba, kapena chifukwa chake dongosololi liyenera kupangidwa motengera kapangidwe ka database

Pa Habr!

Tikupitiriza kufufuza mutuwo Java ΠΈ Spring, kuphatikiza pamlingo wa database. Lero tikukupemphani kuti muwerenge chifukwa chake, popanga mapulogalamu akuluakulu, ndizomwe zili m'dawunilodi, osati Java code, zomwe ziyenera kukhala zofunika kwambiri, momwe izi zimachitikira, ndi zina zomwe zilipo pa lamuloli.

M'nkhani yomalizayi, ndifotokoza chifukwa chake ndikukhulupirira kuti pafupifupi nthawi zonse, mtundu wa data mu pulogalamu uyenera kupangidwa "kuchokera ku database" osati "kuchokera ku Java" (kapena chilankhulo chilichonse cha kasitomala chomwe muli. ntchito ndi). Pogwiritsa ntchito njira yachiwiri, mukudzipangira njira yayitali yowawa komanso kuzunzika polojekiti yanu ikayamba kukula.

Nkhaniyi inalembedwa potengera funso limodzi, yoperekedwa pa Stack Overflow.

Zokambirana zochititsa chidwi pa reddit m'magawo /r/java ΠΈ /r/programming.

Kupanga ma code

Ndinadabwitsidwa bwanji kuti pali kagawo kakang'ono ka ogwiritsa ntchito omwe, atadziwana ndi jOOQ, amakwiya ndi mfundo yoti jOOQ imadalira kwambiri kupanga ma code code kuti igwire ntchito. Palibe amene akukuletsani kugwiritsa ntchito jOOQ momwe mukuonera, kapena kukukakamizani kugwiritsa ntchito ma code. Koma njira yosasinthika (monga momwe tafotokozera m'buku) yogwirira ntchito ndi jOOQ ndikuti mumayamba ndi (cholowa) schema ya database, ndikuyisintha pogwiritsa ntchito jOOQ code generator kuti mutenge makalasi omwe akuyimira matebulo anu, kenako lembani. -mafunso otetezeka ku matebulo awa:

	for (Record2<String, String> record : DSL.using(configuration)
//   ^^^^^^^^^^^^^^^^^^^^^^^ Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎ Ρ‚ΠΈΠΏΠ°Ρ… Π²Ρ‹Π²Π΅Π΄Π΅Π½Π° Π½Π° 
//   основании сгСнСрированного ΠΊΠΎΠ΄Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ссылаСтся ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ΅
// Π½ΠΈΠΆΠ΅ условиС SELECT 
 
       .select(ACTOR.FIRST_NAME, ACTOR.LAST_NAME)
//           vvvvv ^^^^^^^^^^^^  ^^^^^^^^^^^^^^^ сгСнСрированныС ΠΈΠΌΠ΅Π½Π°
       .from(ACTOR)
       .orderBy(1, 2)) {
    // ...
}

Khodiyo imapangidwa pamanja kunja kwa msonkhano, kapena pamanja pamsonkhano uliwonse. Mwachitsanzo, kubadwanso koteroko kungatsatire mwamsanga pambuyo pake Flyway database migration, yomwe imatha kuchitika pamanja kapena zokha.

Kupanga ma code source

Pali mafilosofi osiyanasiyana, ubwino ndi zovuta zomwe zimagwirizanitsidwa ndi njira izi zopangira ma code - manual ndi automatic - zomwe sindidzakambirana mwatsatanetsatane m'nkhaniyi. Koma, kawirikawiri, mfundo yonse ya kachidindo yopangidwa ndi yakuti imatithandiza kuberekanso mu Java kuti "choonadi" chomwe timachitenga mopepuka, kaya mkati mwa dongosolo lathu kapena kunja kwake. Mwanjira ina, izi ndi zomwe opanga ma compilers amachita akapanga bytecode, makina code, kapena mtundu wina wa code code - timapeza chiwonetsero cha "chowonadi" chathu m'chilankhulo china, mosasamala kanthu za zifukwa zenizeni.

Pali ambiri ma code jenereta. Mwachitsanzo, XJC ikhoza kupanga Java code kutengera mafayilo a XSD kapena WSDL. Mfundoyi ndi yofanana nthawi zonse:

  • Pali chowonadi china (chamkati kapena chakunja) - mwachitsanzo, mawonekedwe, mtundu wa data, ndi zina zambiri.
  • Tikufuna choyimilira chapafupi cha chowonadichi m'chinenero chathu chadongosolo.

Komanso, nthawi zonse zimakhala bwino kupanga chiwonetsero chotere kuti tipewe kubwezeredwa.

Type Providers ndi Annotation Processing

Zindikirani: njira ina, yamakono komanso yeniyeni yopangira code ya jOOQ ikugwiritsa ntchito opereka mitundu, monga zikukwaniritsidwa mu F#. Pankhaniyi, code imapangidwa ndi compiler, makamaka panthawi yophatikizira. M'malo mwake, code yotereyi ilibe mawonekedwe. Java ili ndi zofananira, ngakhale sizowoneka bwino, zida - ma processor ofotokozera, mwachitsanzo, tsabola.

Mwanjira ina, zinthu zomwezi zimachitika pano monga momwe zinalili poyamba, kupatulapo:

  • Simukuwona nambala yomwe idapangidwa (mwina izi zikuwoneka kuti sizonyansa kwa wina?)
  • Muyenera kuwonetsetsa kuti mitundu ingaperekedwe, ndiye kuti, "zowona" ziyenera kupezeka nthawi zonse. Izi ndizosavuta pankhani ya Lombok, yomwe imatanthauzira "choonadi". Ndizovuta kwambiri ndi mitundu ya database yomwe imadalira kulumikizana komwe kumapezeka nthawi zonse.

Vuto ndi chiyani popanga ma code?

Kuphatikiza pa funso lachinyengo la momwe mungayendetsere bwino kupanga ma code - pamanja kapena mwachisawawa, tiyeneranso kunena kuti pali anthu omwe amakhulupirira kuti kupanga ma code sikofunikira nkomwe. Kulungamitsidwa kwa malingaliro awa, omwe ndimakumana nawo nthawi zambiri, ndikuti ndizovuta kukhazikitsa payipi yomanga. Inde, ndizovuta kwambiri. Ndalama zowonjezera zowonjezera zimakhalapo. Ngati mutangoyamba kumene ndi chinthu china (kaya ndi jOOQ, kapena JAXB, kapena Hibernate, ndi zina zotero), kukhazikitsa malo opangira zinthu kumatenga nthawi yomwe mungafune kumathera pophunzira API yokhayo kuti muthe kuchotsapo phindu. .

Ngati ndalama zomwe zimagwirizana ndi kumvetsetsa kapangidwe ka jenereta ndizokwera kwambiri, ndiye kuti, API idachita bwino kwambiri pakugwiritsa ntchito ma code jenereta (ndipo pambuyo pake zikuwonekeranso kuti kusintha kwa ogwiritsa ntchito momwemo kumakhala kovuta). Kugwiritsa ntchito kuyenera kukhala kofunikira kwambiri pa API iliyonse yotere. Koma uwu ndi mkangano umodzi wotsutsana ndi kupanga ma code. Kupanda kutero, ndi mwamtheradi kwathunthu kulemba choyimira chakumaloko cha chowonadi chamkati kapena chakunja.

Ambiri anganene kuti alibe nthawi yochitira zonsezi. Atha kutha masiku omaliza a Super Product yawo. Tsiku lina tidzakonza ma conveyor a msonkhano, tidzakhala ndi nthawi. Ndidzawayankha:

Chowonadi choyamba, kapena chifukwa chake dongosololi liyenera kupangidwa motengera kapangidwe ka database
Zachiyambi, Alan O'Rourke, Omvera Stack

Koma ku Hibernate / JPA ndikosavuta kulemba Java code.

Zoonadi. Kwa Hibernate ndi ogwiritsa ntchito, izi ndi dalitso komanso temberero. Mu Hibernate mutha kungolemba mabungwe angapo, monga chonchi:

	@Entity
class Book {
  @Id
  int id;
  String title;
}

Ndipo pafupifupi chirichonse chiri chokonzeka. Tsopano zili kwa Hibernate kuti apange "zambiri" zovuta za momwe gululi lidzafotokozedwera mu DDL ya "chilankhulo" chanu cha 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);

... ndikuyamba kugwiritsa ntchito pulogalamuyi. Mwayi wabwino kwambiri kuti muyambe mwachangu ndikuyesa zinthu zosiyanasiyana.

Komabe, chonde ndiloleni. Ndinanama.

  • Kodi Hibernate adzatsimikizira tanthauzo la kiyi yoyamba iyi?
  • Kodi Hibernate apanga index mu TITLE? - Ndikudziwa motsimikiza kuti tidzazifuna.
  • Kodi Hibernate apangadi chinsinsi ichi mu Identity Specification?

Mwina ayi. Ngati mukupanga pulojekiti yanu kuyambira pachiyambi, ndikwabwino kungotaya nkhokwe yakale ndikupanga yatsopano mukangowonjezera mawu ofunikira. Chifukwa chake, gulu la Bukuli litenga mawonekedwe:

	@Entity
@Table(name = "book", indexes = {
  @Index(name = "i_book_title", columnList = "title")
})
class Book {
  @Id
  @GeneratedValue(strategy = IDENTITY)
  int id;
  String title;
}

Zabwino. Bweretsaninso. Apanso, mu nkhani iyi zidzakhala zophweka kwambiri pachiyambi.

Koma mudzayenera kulipira pambuyo pake

Posakhalitsa mudzayenera kupita kukupanga. Ndipamene chitsanzo ichi chidzasiya kugwira ntchito. Chifukwa:

Popanga, sizidzakhalanso zotheka, ngati kuli kofunikira, kutaya deta yakale ndikuyamba kuyambira pachiyambi. Nawonso database yanu ikhala cholowa.

Kuyambira tsopano mpaka kalekale muyenera kulemba Zolemba za kusamuka kwa DDL, mwachitsanzo, pogwiritsa ntchito Flyway. Kodi chidzachitika ndi chiyani kwa mabungwe anu pankhaniyi? Mutha kuzisintha pamanja (ndipo kuwirikiza kawiri kuchuluka kwa ntchito yanu), kapena mutha kuuza Hibernate kuti akukonzereninso (motheka bwanji kuti omwe amapangidwa mwanjira iyi kuti akwaniritse zomwe mukuyembekezera?) Mwanjira iliyonse, mumataya.

Chifukwa chake mukangoyamba kupanga mudzafunika zigamba zotentha. Ndipo ziyenera kuyikidwa muzopanga mwachangu kwambiri. Popeza simunakonzekere ndipo simunakonze njira yosinthira kusamuka kwanu kuti mupange, mumayika chilichonse. Ndiyeno mulibenso nthawi yochita zonse molondola. Ndipo mumadzudzula Hibernate, chifukwa nthawi zonse ndi vuto la wina, osati inu ...

M’malo mwake, zinthu zikanatheka kuchitidwa mosiyana kwambiri ndi poyamba. Mwachitsanzo, ikani mawilo ozungulira panjinga.

Database choyamba

"Chowonadi" chenicheni mu schema yanu ya database ndi "ulamuliro" pamwamba pake zili mkati mwa nkhokwe. Schema imatanthauzidwa mu database yokha ndipo kwina kulikonse, ndipo kasitomala aliyense ali ndi kopi ya schema iyi, kotero ndizomveka kukakamiza kutsata schema ndi kukhulupirika kwake, kuti azichita bwino mu nkhokwe - komwe chidziwitso chili. kusungidwa.
Izi ndi zakale, ngakhale zanzeru zachinyengo. Mafungulo oyambira komanso apadera ndi abwino. Makiyi akunja ndi abwino. Kuwunika zoletsa ndizabwino. Ndemanga - Chabwino.

Komanso, si zokhazo. Mwachitsanzo, pogwiritsa ntchito Oracle, mungafune kufotokoza:

  • Kodi tebulo lanu lili m'malo otani?
  • Mtengo wake wa PCTFREE ndi wotani?
  • Kodi cache kukula kwake ndi chiyani (kumbuyo kwa id)

Izi sizingakhale zofunika m'makina ang'onoang'ono, koma simuyenera kudikirira mpaka mutalowa m'malo akuluakulu a data-mutha kuyamba kupindula ndi kukhathamiritsa kosungirako komwe kumaperekedwa ndi ogulitsa monga zomwe tazitchula pamwambapa posachedwa. Palibe ORM yomwe ndawona (kuphatikiza jOOQ) yomwe imapereka mwayi wopeza zonse za DDL zomwe mungafune kugwiritsa ntchito munkhokwe yanu. Ma ORM amapereka zida zina zomwe zimakuthandizani kulemba DDL.

Koma kumapeto kwa tsikulo, dera lopangidwa bwino limalembedwa pamanja mu DDL. DDL iliyonse yopangidwa ndikungoyerekeza.

Nanga bwanji chitsanzo cha kasitomala?

Monga tafotokozera pamwambapa, pa kasitomala mudzafunika kopi ya schema yanu ya database, mawonekedwe a kasitomala. Mosafunikira kutchula, mawonekedwe a kasitomala awa ayenera kugwirizana ndi chitsanzo chenicheni. Njira yabwino yokwaniritsira izi ndi iti? Kugwiritsa ntchito code jenereta.

Ma database onse amapereka mauthenga awo a meta kudzera pa SQL. Umu ndi momwe mungapezere matebulo onse kuchokera pankhokwe yanu m'zilankhulo zosiyanasiyana za SQL:

	-- H2, HSQLDB, MySQL, PostgreSQL, SQL Server
SELECT table_schema, table_name
FROM information_schema.tables
 
-- DB2
SELECT tabschema, tabname
FROM syscat.tables
 
-- Oracle
SELECT owner, table_name
FROM all_tables
 
-- SQLite
SELECT name
FROM sqlite_master
 
-- Teradata
SELECT databasename, tablename
FROM dbc.tables

Mafunso awa (kapena ofanana, kutengera ngati mukuyeneranso kuganizira malingaliro, mawonedwe opangidwa ndi thupi, ntchito zamtengo wapatali) amachitidwanso poyimba foni. DatabaseMetaData.getTables() kuchokera ku JDBC, kapena kugwiritsa ntchito meta-module ya jOOQ.

Kuchokera pazotsatira zamafunso oterowo, ndizosavuta kupanga choyimira chamakasitomala chamtundu wanu wa database, mosasamala kanthu zaukadaulo womwe mumagwiritsa ntchito pa kasitomala.

  • Ngati mukugwiritsa ntchito JDBC kapena Spring, mutha kupanga zingwe zokhazikika
  • Ngati mugwiritsa ntchito JPA, mutha kupanga mabungwewo
  • Ngati mugwiritsa ntchito jOOQ, mutha kupanga jOOQ meta-model

Kutengera kuchuluka kwa magwiridwe antchito omwe amaperekedwa ndi kasitomala wanu API (mwachitsanzo jOOQ kapena JPA), meta yopangidwa ikhoza kukhala yolemera komanso yokwanira. Tengani, mwachitsanzo, kuthekera kwa majowidwe obisika, idayambitsidwa mu jOOQ 3.11, yomwe imadalira zambiri za meta zokhudzana ndi maubwenzi ofunika akunja omwe alipo pakati pa matebulo anu.

Tsopano kuwonjezereka kulikonse kwa database kumangosintha ma code kasitomala. Tangoganizani mwachitsanzo:

ALTER TABLE book RENAME COLUMN title TO book_title;

Kodi mungafunedi kugwira ntchitoyi kawiri? Ayi ndithu. Ingoperekani DDL, yendetsani paipi yanu yomanga, ndikupeza zomwe zasinthidwa:

@Entity
@Table(name = "book", indexes = {
 
  // Π’Ρ‹ ΠΎΠ± этом Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°Π»ΠΈΡΡŒ?
  @Index(name = "i_book_title", columnList = "book_title")
})
class Book {
  @Id
  @GeneratedValue(strategy = IDENTITY)
  int id;
 
  @Column("book_title")
  String bookTitle;
}

Kapena kalasi yosinthidwa ya jOOQ. Zosintha zambiri za DDL zimakhudzanso semantics, osati ma syntax okha. Chifukwa chake, zitha kukhala zothandiza kuyang'ana mu code yomwe idapangidwa kuti muwone kuti ndi code iti (kapena ingakhudzidwe) ndi kuchuluka kwa database yanu.

Choonadi chokha

Mosasamala kanthu zaukadaulo womwe mumagwiritsa ntchito, nthawi zonse pamakhala mtundu umodzi womwe umakhala gwero lokhalo la chowonadi pazigawo zina - kapena, osachepera, tiyenera kuyesetsa izi ndikupewa chisokonezo chamabizinesi, pomwe "chowonadi" chili paliponse ndipo palibe paliponse nthawi imodzi. . Chilichonse chikhoza kukhala chophweka. Ngati mukungosintha mafayilo a XML ndi makina ena, ingogwiritsani ntchito XSD. Onani INFORMATION_SCHEMA meta-model kuchokera ku jOOQ mu mawonekedwe a XML:
https://www.jooq.org/xsd/jooq-meta-3.10.0.xsd

  • XSD imamveka bwino
  • XSD imawonetsa zomwe zili mu XML bwino kwambiri ndikuloleza kutsimikizika m'zilankhulo zonse zamakasitomala
  • XSD ndi yosinthidwa bwino ndipo ili ndi mayendedwe obwerera kumbuyo
  • XSD ikhoza kumasuliridwa ku Java code pogwiritsa ntchito XJC

Mfundo yomaliza ndiyofunika. Polankhulana ndi makina akunja pogwiritsa ntchito mauthenga a XML, tikufuna kutsimikizira kuti mauthenga athu ndi ovomerezeka. Izi ndizosavuta kukwaniritsa pogwiritsa ntchito JAXB, XJC ndi XSD. Zingakhale misala kwambiri kuganiza kuti, ndi njira yopangira "Java yoyamba" pomwe timapanga mauthenga athu ngati zinthu za Java, kuti mwanjira ina atha kujambulidwa ku XML ndikutumizidwa ku makina ena kuti amwe. XML yopangidwa motere ingakhale yotsika kwambiri, yopanda zikalata, komanso yovuta kupanga. Pakadakhala mgwirizano wautumiki (SLA) wamawonekedwe oterowo, tikadawononga nthawi yomweyo.

Moona mtima, izi ndi zomwe zimachitika nthawi zonse ndi JSON APIs, koma iyi ndi nkhani ina, ndidzakangana nthawi ina ...

Databases: ndi chinthu chomwecho

Mukamagwira ntchito ndi ma database, mumazindikira kuti onse ndi ofanana. Maziko ali ndi deta yake ndipo ayenera kuyang'anira ndondomekoyi. Zosintha zilizonse zomwe zapangidwa ku schema ziyenera kukhazikitsidwa mwachindunji mu DDL kuti gwero limodzi lachowonadi lisinthidwe.

Pamene kusintha kwa gwero kwachitika, makasitomala onse ayenera kusinthanso makope awo a chitsanzo. Makasitomala ena amatha kulembedwa mu Java pogwiritsa ntchito jOOQ ndi Hibernate kapena JDBC (kapena onse). Makasitomala ena amatha kulembedwa ku Perl (timangowafunira zabwino), pomwe ena amatha kulembedwa mu C #. Zilibe kanthu. Chitsanzo chachikulu chiri mu database. Ma Model opangidwa pogwiritsa ntchito ma ORM nthawi zambiri amakhala osawoneka bwino, osalembedwa bwino, komanso ovuta kupanga.

Choncho musalakwitse. Osalakwitsa kuyambira pachiyambi. Gwirani ntchito kuchokera ku database. Pangani payipi yotumizira yomwe ingakhale yodzichitira. Yambitsani makina opanga ma code kuti zikhale zosavuta kukopera mtundu wa database yanu ndikuutaya kwa makasitomala. Ndipo lekani kudandaula za ma code jenereta. Iwo ndi abwino. Ndi iwo mudzakhala obala zipatso. Mukungoyenera kuthera nthawi yochepa kuti muwakhazikitse kuyambira pachiyambi - ndiyeno zaka zowonjezera zokolola zikukuyembekezerani, zomwe zimapanga mbiri ya polojekiti yanu.

Osandithokoza ine panobe, kenako.

Kufotokozera

Kunena zomveka: Nkhaniyi sichikukulimbikitsani kuti mukuyenera kupindika dongosolo lonse (ie, domain, logic yamalonda, etc., etc.) kuti mugwirizane ndi chitsanzo chanu cha database. Zomwe ndikunena m'nkhaniyi ndikuti nambala yamakasitomala yomwe imalumikizana ndi database iyenera kuchitapo kanthu pamaziko a database yachitsanzo, kuti iyo yokha isaberekenso mtundu wa database mu "gulu loyamba". Lingaliro ili nthawi zambiri limakhala pamalo ofikira deta pa kasitomala wanu.

Muzomangamanga ziwiri, zomwe zimasungidwabe m'malo ena, mtundu woterewu ukhoza kukhala wotheka. Komabe, m'makina ambiri gawo lofikira la data likuwoneka kwa ine ngati "subsystem" yomwe imaphatikiza mtundu wa database.

Kupatulapo

Pali zosiyana ndi lamulo lililonse, ndipo ndanena kale kuti njira yopangira database-yoyamba ndi magwero-code-code nthawi zina imakhala yosayenera. Nazi zina mwazosiyana (mwina zina):

  • Pamene schema sichidziwika ndipo ikufunika kupezedwa. Mwachitsanzo, ndinu opereka chida chomwe chimathandiza ogwiritsa ntchito kuyang'ana chithunzi chilichonse. Ugh. Palibe kupanga ma code pano. Komabe, database imabwera koyamba.
  • Pamene dera liyenera kupangidwa pa ntchentche kuti lithetse vuto lina. Chitsanzo ichi chikuwoneka ngati mtundu wongopeka pang'ono wa chitsanzo mtengo wazinthu, mwachitsanzo, mulibe dongosolo lodziwika bwino. Pankhaniyi, nthawi zambiri simungakhale otsimikiza kuti RDBMS ingakukwanireni.

Kupatulapo mwachibadwa ndi kwapadera. Nthawi zambiri zokhudzana ndi kugwiritsa ntchito RDBMS, schema imadziwika pasadakhale, imakhala mkati mwa RDBMS ndipo ndiye gwero lokha la "chowonadi", ndipo makasitomala onse amayenera kupeza makope omwe amachokera. Moyenera, muyenera kugwiritsa ntchito code jenereta.

Source: www.habr.com

Kuwonjezera ndemanga