Chokwadi chekutanga, kana nei sisitimu ichida kugadzirwa zvichibva pane dhatabhesi mudziyo

Hei Habr!

Tinoenderera mberi nekuongorora musoro Java ΠΈ chitubukusanganisira pamwero wedatabase. Nhasi tinopa kuverenga pamusoro pekuti nei, pakugadzira maapplication makuru, ndiyo dhizaini dhizaini, uye kwete iyo Java kodhi, iyo inofanirwa kuve yakakosha kukosha, kuti izvi zvinoitwa sei, uye ndezvipi zvinosiya kune mutemo uyu.

Muchinyorwa ichi chakanonoka, ini ndichatsanangura chikonzero nei ndichifunga kuti mune dzinenge dzese nyaya, iyo data modhi mune application inofanirwa kugadzirwa "kubva kune dhatabhesi" pane "kubva pane kugona kweJava" (kana chero mutauro wevatengi wauri. kushanda pamwe). Nekusarudza nzira yechipiri, unopinda munzira refu yekurwadziwa uye kutambura kana chirongwa chako chatanga kukura.

Nyaya yakanyorwa zvichibva pa mubvunzo mumwe chete, yakapihwa paStack Overflow.

Nhaurirano dzinonakidza pa reddit muzvikamu /r/java ΠΈ /r/programming.

Code generation

Ndiri kushamisika sei kuti kune diki diki revashandisi avo, vajaira jOOQ, vanoramba chokwadi chekuti jOOQ inotsamira padanho rekugadzira kodhi kumhanya. Hapana ari kukumisa kushandisa jOOQ nenzira yaunoona yakakodzera, uye hapana ari kukumanikidza kushandisa kodhi yekugadzira. Asi nekukasira (sezvinotsanangurwa mubhuku), jOOQ inoshanda seizvi: unotanga ne (legacy) schema dhatabhesi, dzosera mainjiniya neiyo jOOQ kodhi jenareta kuti uwane seti yemakirasi anomiririra matafura ako, wobva wanyora mhando- yakachengeteka mibvunzo pamusoro pematafura aya:

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

Iyo kodhi inogadzirwa nemaoko kunze kwekuvaka, kana nemaoko pane yega yega kuvaka. Semuenzaniso, kuberekwa patsva kwakadaro kunogona kutevera pakarepo mushure Flyway dhatabhesi kutama, izvo zvinogona zvakare kuitwa nemaoko kana otomatiki.

Source kodhi kugadzirwa

Kune akasiyana mafirosofi, zvakanakira uye zvakaipira zvine chekuita nemaitiro aya ekugadzira kodhi - bhuku uye otomatiki - izvo zvandisiri kuzokurukura zvakadzama muchinyorwa chino. Asi, kazhinji, pfungwa yose yekodhi yakagadzirwa ndeyokuti inokubvumira kuberekazve muJava "chokwadi" chatinotora zvishoma, kana mukati mehurongwa hwedu kana kunze kwayo. Neimwe nzira, vagadziri vanogadzira bytecode, kodhi yemuchina, kana imwe mhando yekodhi kubva kunobva kodhi vanoita chinhu chimwe chete - tinowana chinomiririra che "chokwadi" chedu mune mumwe mutauro, zvisinei nezvikonzero chaizvo.

Kune akawanda macode generator akadaro. Semuyenzaniso, XJC inogona kugadzira Java kodhi yakavakirwa paXSD kana WSDL mafaera. Nheyo yacho inogara yakafanana:

  • Pane chokwadi (chemukati kana chekunze) - semuenzaniso, yakatarwa, data data, nezvimwe.
  • Tinoda mumiriri wenzvimbo yechokwadi ichi mumutauro wedu wechirongwa.

Uyezve, zvinogara zvichikurudzirwa kugadzira chimiro chakadaro - kuitira kuti udzivise kuregererwa.

Type Providers uye Annotation Processing

Ongorora: Imwe, yazvino uye yakananga nzira yekugadzira kodhi yejOOQ inosanganisira kushandiswa kwemhando vanopa, sezviri kuitwa muF#. Mune ino kesi, iyo kodhi inogadzirwa nemuunganidzi, chaizvo padanho rekubatanidza. Muchidimbu, kodhi yakadaro haipo mumhando yemakodhi makodhi. MuJava, kune akafanana, kunyangwe asina kuyevedza, maturusi - aya ma processors, semuenzaniso, Lombok.

Mune imwe pfungwa, zvinhu zvakafanana zvinoitika pano sepakutanga, kunze kwe:

  • Iwe hausi kuona iyo yakagadzirwa kodhi (pamwe mamiriro aya haaite seanosemesa kune mumwe munhu?)
  • Iwe unofanirwa kuve nechokwadi chekuti mhando dzinogona kupihwa, kureva kuti, "chokwadi" chinofanira kugara chiripo. Izvi zviri nyore munyaya yeLombok, iyo inotsanangura "chokwadi". Zvakanyanya kuoma nemhando dzedatabase dzinotsamira pane mhenyu yekubatanidza inogara iripo.

Dambudziko nderei nekugadzirwa kwekodhi?

Mukuwedzera kumubvunzo unonyengera wekuti zviri nani kutanga kugadzirwa kwekodhi - pamaoko kana kuti otomatiki, ndinofanira kutaura kuti kune vanhu vanotenda kuti chizvarwa chekodhi hachidiwi zvachose. Kururamisa kweiyi pfungwa yekuona, yandakasangana nayo kazhinji, ndeyekuti zvinozonetsa kumisikidza pombi yekuvaka. Hongu zvakaoma hazvo. Kune mamwe mari yezvivakwa. Kana iwe uchangotanga nechimwe chigadzirwa (chingave jOOQ, kana JAXB, kana Hibernate, nezvimwewo), zvinotora nguva kumisa bhenji rebasa raungade kushandisa kudzidza iyo API pachayo kuti uwane kukosha kubva mairi. .

Kana mari inobatanidza nekunzwisisa chigadziro chejenareta chakanyanyisa, saka, zvechokwadi, API yakaita basa rakashata pamusoro pekushandiswa kwekodhi jenareta (uye mune ramangwana rinoratidza kuti kugadzirisa mairi kwakaomawo). Kushandiswa kunofanirwa kuve kwekutanga kwepamusoro kune chero API yakadai. Asi iyo ingori imwe nharo yekupokana nekodhi kugadzirwa. Zvikasadaro, nyora zvachose neruoko kumiririra kwemukati kana kwekunze chokwadi.

Vazhinji vachati havana nguva yekuita zvese izvi. Ivo vari panguva yekupedzisira kune yavo Super Product. Rimwe zuva gare gare tichazobatanidza maconveyors egungano, tichave nenguva. ndichavapindura.

Chokwadi chekutanga, kana nei sisitimu ichida kugadzirwa zvichibva pane dhatabhesi mudziyo
Chekutanga, Alan O'Rourke, Vateereri Stack

Asi muHibernate / JPA zviri nyore kunyora kodhi "muJava".

Chokwadi. Kune Hibernate nevashandisi vayo, izvi zvese mabhonzo uye kutukwa. MuHibernate, unogona kungonyora akati wandei masangano, seizvi:

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

Uye zvinenge zvose zvakagadzirira. Ikozvino iyo yakawanda yeHibernate ndeyekugadzira "details" dzakaoma dzekuti chii chaizvo chinotsanangurwa ichi muDDL ye "dialect" yako yeSQL:

	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);

... uye tanga kumhanyisa application. Chinhu chinotonhorera chaizvo kusimuka uye kumhanya nekukurumidza uye kuyedza zvinhu zvakasiyana.

Zvisinei, ndirege. Ndainyepa hangu.

  • Ko Hibernate achanyatso simbisa tsananguro yeiyi inonzi kiyi yekutanga?
  • Ko Hibernate ichagadzira index paTITLE? Ndinonyatsoziva kuti tinoda.
  • Ko Hibernate ichaita kiyi iyi kiyi yekuzivikanwa muIdentity Specification?

Zvimwe kwete. Kana iwe uri kugadzira purojekiti yako kubva pakutanga, zvinogara zviri nyore kungorasa dhatabhesi rekare uye kugadzira imwe nyowani paunongowedzera zvinodikanwa. Saka, bhuku reBhuku rinozopedzisira ratora fomu:

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

Kutonhora. Regenerate. Zvakare, munyaya iyi, zvichava nyore kwazvo pakutanga.

Asi unozofanira kuribhadhara gare gare.

Nenguva isipi iwe uchafanirwa kuenda mukugadzira. Ndipo apo modhi inomira kushanda. Nokuti:

Mukugadzira, hazvichagoneki, kana zvichidikanwa, kurasa dhatabhesi yekare uye kutanga zvese kubva pakutanga. Dhatabhesi yako inoshanduka kuita yenhaka.

Kubva zvino zvichienda mberi uye nekusingaperi uchafanirwa kunyora DDL zvinyorwa zvekutama, semuenzaniso kushandisa Flyway. Uye chii chichaitika kumasangano ako munyaya iyi? Unogona kuzvigadzirisa nemaoko (uye kaviri mutoro wako webasa) kana kuita kuti Hibernate ikugadzirire iwe (yakawanda sei iyo inogadzirwa nenzira iyi kuti isangane nezvaunotarisira?) Unorasikirwa neimwe nzira.

Saka, paunongoenda mukugadzira, iwe unozoda zvigamba zvinopisa. Uye dzinoda kuunzwa mukugadzirwa nekukurumidza. Sezvo usina kugadzirira uye kuronga kutsetseka kwepombi yekutama kwako kugadzirwa, uri kupeta zvisingaite. Uye ipapo iwe hauna nguva yekuita zvese nemazvo. Uye iwe unotuka Hibernate, nekuti inogara iri mhosva yemunhu wese, asi kwete iwe ...

Panzvimbo pezvo, kubvira pakutanga, zvinhu zvose zvingadai zvakaitwa zvakasiyana zvachose. Semuenzaniso, isa mavhiri akatenderera pabhasikoro.

Database kutanga

Iyo chaiyo "chokwadi" mune yako dhatabhesi schema uye "changamire" pamusoro payo iri mukati me database. Iyo schema inotsanangurwa chete mudhatabhesi pachayo uye hakuna kumwe kumwe, uye mumwe nemumwe wevatengi ane kopi yeiyi schema, saka zvine musoro kumanikidza kutevedzera schema uye kutendeseka kwayo, kuzviita mudura re database - uko mashoko anochengetwa.
Uhwu huchenjeri hwekare nyangwe hackneyed. Makiyi ekutanga uye akasiyana akanaka. Makiyi ekunze akanaka. Constraint checking yakanaka. Assertions - Zvakanaka.

Uye, handizvo zvoga. Semuenzaniso, uchishandisa Oracle, ungangoda kutsanangura:

  • Ndeipi tablespace iri tafura yako
  • Chii chinonzi PCTFREE kukosha kwake
  • Ndeipi saizi yecache mukuteerana kwako (kuseri kweid)

Zvose izvi zvingave zvisina basa mumasikirwo maduku, asi hazvidikanwi kumirira kusvikira kuchinja kune nzvimbo ye "data guru" - unogona kutanga kubatsirwa nemutengesi-akapiwa kuchengetedza optimizations, zvakadai sezvakataurwa pamusoro apa, kare kare. Hapana yeORM yandaona (kusanganisira jOOQ) inopa mukana kune yakazara seti yeDDL sarudzo dzaungade kushandisa mudura rako. MaORM anopa mamwe maturusi ekukubatsira kunyora DDL.

Asi pakupera kwezuva, schema yakanyatsogadzirwa yakanyorwa nemaoko muDDL. Chero yakaitwa DDL ingori fungidziro yayo.

Zvakadini nemuenzaniso wevatengi?

Sezvambotaurwa pamusoro, pane mutengi iwe uchada kopi ye database yako schema, iyo mutengi maonero. Hazvina basa kutaura, maonero emutengi uyu anofanira kunge achienderana neiyo chaiyo modhi. Ndeipi nzira yakanakisa yekuzadzisa izvi? Nejenareta rekodhi.

Yese dhatabhesi inopa yavo meta-ruzivo kuburikidza neSQL. Heano maitiro ekuwana ese matafura mune akasiyana SQL dialects kubva kune yako database:

	-- 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

Iyi mibvunzo (kana yakafanana, zvichienderana nekuti iwe unofanirwawo kufunga nezve maonero, maonero enyama, tafura-inokosheswa mabasa) inoitwawo nekufona. DatabaseMetaData.getTables() kubva kuJDBC, kana kushandisa iyo jOOQ meta-module.

Kubva pane zvawanikwa zvemibvunzo yakadai, zviri nyore kugadzira chero mutengi-padivi anomiririra yemodhi yako yedatabase, zvisinei kuti unoshandisa tekinoroji pamutengi.

  • Kana iwe uri kushandisa JDBC kana Chitubu iwe unogona kugadzira seti yetambo inomira
  • Kana iwe uri kushandisa JPA, saka unogona kugadzira masangano iwo pachawo
  • Kana uri kushandisa jOOQ unogona kugadzira jOOQ meta modhi

Zvichienderana nekugona kwakawanda sei mutengi wako API inopa (semuenzaniso jOOQ kana JPA), iyo yakagadzirwa meta modhi inogona kupfuma uye yakakwana. Tora, semuenzaniso, mukana wekubatanidzwa kwakajeka, yakaunzwa mujOOQ 3.11, iyo inovimba neyakagadzirwa meta-ruzivo nezve ekunze kiyi hukama pakati pematafura ako.

Ikozvino chero dhatabhesi yekuwedzera inozogadzirisa otomatiki kodhi yemutengi. Fungidzira semuenzaniso:

ALTER TABLE book RENAME COLUMN title TO book_title;

Ungada here kuita basa iri kaviri? Hapana zvakadaro. Isu tinongopa iyo DDL, toimhanyisa kuburikidza nepombi yako yekuvaka, uye tora iyo yakagadziridzwa mubatanidzwa:

@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;
}

Kana iyo yakagadziridzwa jOOQ kirasi. Zvizhinji zveDDL shanduko dzinobatawo semantics, kwete chete syntax. Naizvozvo, zvinogona kuve nyore kuona mune yakanyorwa kodhi iyo kodhi ichave (kana inogona) kukanganiswa nekuwedzera dhatabhesi rako.

Chokwadi chete

Zvisinei ne tekinoroji yaunoshandisa, panogara paine imwe modhi inova ndiyo chete sosi yechokwadi kune imwe subsystem - kana zvirinani isu tinofanirwa kuyedza izvi uye kudzivirira kuvhiringidzika kwebhizinesi uko "chokwadi" chiri pese pese uye hapana kwese kamwechete. Zvose zvinogona kuva nyore zvikuru. Kana iwe uchingochinjanisa mafaera eXML neimwe system, ingoshandisa XSD. Tarisa uone jOOQ's INFORMATION_SCHEMA meta-modhi muXML fomu:
https://www.jooq.org/xsd/jooq-meta-3.10.0.xsd

  • XSD inonzwisiswa zvakanaka
  • XSD inomaka zvirimo zveXML zvakanaka kwazvo uye inobvumira kusimbiswa mumitauro yese yemutengi
  • XSD yakanyatso shandurwa uye inodzokera kumashure inoenderana
  • XSD inogona kushandurirwa muJava kodhi uchishandisa XJC

Pfungwa yekupedzisira yakakosha. Kana tichitaura nekunze sisitimu tichishandisa mameseji eXML, tinoda kuve nechokwadi chekuti meseji yedu ndeyechokwadi. Izvi zviri nyore kwazvo kuwana neJAXB, XJC uye XSD. Kungave kupenga chaiko kufunga kuti, mune yeJava-yekutanga dhizaini maitiro kwatinoita mameseji edu sezvinhu zveJava, anogona neimwe nzira kupihwa zvine hungwaru kuXML uye kutumirwa kushandiswa kune imwe system. Iyo XML inogadzirwa nenzira iyi ingave yemhando yakashata kwazvo, isina kunyorwa, uye yakaoma kugadzira. Kana paine chibvumirano padanho remhando yebasa (SLA) pane yakadaro interface, isu taizobva tazviputira.

Kutaura chokwadi, izvi ndizvo chaizvo zvinoitika nguva dzese neJSON API, asi ndiyo imwe nyaya, ndichapokana nguva inotevera ...

Databases: dzakafanana

Kushanda nemadhatabhesi, unonzwisisa kuti ese akafanana. Iyo dhatabhesi ine data rayo uye inofanirwa kubata iyo schema. Chero shanduko dzakaitwa kune schema dzinofanirwa kuitwa zvakananga muDDL kuitira kuti iyo chete sosi yechokwadi ivandudzwe.

Kana iyo sosi yekuvandudza yaitika, vatengi vese vanofanirwa kuvandudza makopi avo emuenzaniso. Vamwe vatengi vanogona kunyorwa muJava vachishandisa jOOQ uye Hibernate kana JDBC (kana zvese). Vamwe vatengi vanogona kunyorwa muPerl (ngativashuvirei rombo rakanaka), vamwe muC #. Hazvina basa. Iyo huru modhi iri mudhatabhesi. Mamodheru anogadzirwa neORM anowanzo kuve asina kunaka, asina kunyorwa zvakanaka, uye anonetsa kugadzira.

Saka usakanganisa. Usaita zvikanganiso kubva pakutanga. Shanda kubva kune database. Vaka pombi yekuendesa iyo inogona kuita otomatiki. Gonesa macode jenareta kuti akope zviri nyore modhi yako yedatabase uye oirasira kune vatengi. Uye rega kunetseka nezve kodhi jenareta. Ivo vakanaka. Nadzo, iwe unowedzera kubudirira. Zvese zvaunoda kuti uite kushandisa nguva shoma uchivamisa kubva pakutanga, uye iwe unenge uine makore ekuvandudza mashandiro ekuvaka nyaya yeprojekiti yako.

Usazonditenda zvakare, gare gare.

Tsananguro

Kuti zvive zvakajeka: Ichi chinyorwa hachirevedzeri nenzira ipi zvayo kuti iyo yose system (kureva, domain, business logic, etc., etc., etc.) inoda kuchinjwa kuti ienderane nemuenzaniso wako we database. Zvandiri kutaura munyaya ino ndezvekuti kodhi yemutengi inodyidzana nedhatabhesi inofanirwa kuita pahwaro hweiyo dhatabhesi modhi kuitira kuti irege kuburitsa iyo dhatabhesi modhi mu "first class" mamiriro. Mafungiro akadai anowanzo kuwanikwa padanho rekuwana data pane mutengi wako.

Mune maviri-level architectures, ayo achiri kuchengetedzwa mune dzimwe nzvimbo, yakadaro system modhi inogona kunge iri yega inogoneka. Nekudaro, mune mazhinji masisitimu, iyo data yekuwana layer inoratidzika kwandiri se "subsystem" inofukidza iyo dhatabhesi modhi.

Kusiyanisa

Pane zvinosarudzika kune wese mutemo, uye ndakambotaura kuti dhatabhesi yekutanga uye sosi kodhi kodhi nzira dzimwe nguva inogona kuve isina kufanira. Heano mamwe akati wandei akadai (pamwe pane mamwe):

  • Kana iyo schema isingazivikanwe uye inoda kuvhurwa. Semuenzaniso, unopa chishandiso chekubatsira vashandisi kufamba chero dhayagiramu. Phew. Hapana chizvarwa chekodhi pano. Asi zvakadaro - iyo database yekutanga pane zvese.
  • Kana dunhu richida kugadzirwa panhunzi kugadzirisa rimwe dambudziko. Uyu muenzaniso unoratidzika kuva shanduro shoma yemuenzaniso kukosha kwehunhu, kureva, iwe hauna chaizvo schema yakanyatsotsanangurwa. Muchiitiko ichi, kazhinji haugone kuve nechokwadi zvachose kuti RDBMS ichakukodzera.

Zvisizvo zvakasikwa. Muzviitiko zvakawanda zvinosanganisira kushandiswa kweRDBMS, schema inozivikanwa pamberi, iri mukati meRDBMS uye ndiyo chete sosi ye "chokwadi", uye vatengi vese vanofanirwa kutora makopi anobva kwairi. Zvakanaka, izvi zvinofanirwa kusanganisira jenareta yekodhi.

Source: www.habr.com

Voeg