'Nete pele, kapa hore na ke hobane'ng ha sistimi e hloka ho raloa ho ipapisitsoe le moralo oa database

Hey Habr!

Re tsoela pele ho etsa lipatlisiso ka sehlooho Java и Spring, ho kenyeletsoa boemong ba database. Kajeno re u mema hore u bale hore na ke hobane'ng ha u theha lits'ebetso tse kholo, ke sebopeho sa database, eseng khoutu ea Java, e lokelang ho ba ea bohlokoa ka ho fetisisa, hore na sena se etsoa joang, le hore na ho na le mekhelo efe molaong ona.

Sengoliloeng sena sa morao-rao, ke tla hlalosa hore na ke hobane'ng ha ke lumela hore hoo e batlang e le maemong 'ohle, mohlala oa datha ts'ebetsong o lokela ho etsoa "ho tsoa ho database" ho fapana le "ho tsoa ho bokhoni ba Java" (kapa puo efe kapa efe eo u e sebelisang. sebetsa le). Ka ho nka mokhoa oa bobeli, u ipehela tsela e telele ea bohloko le mahlomola hang ha morero oa hau o qala ho hola.

Sengoliloeng se ngotsoe ho latela potso e le 'ngoe, e fanoeng ho Stack Overflow.

Lipuisano tse khahlisang mabapi le reddit ka likarolo /r/java и /r/programming.

Ho hlahisa khoutu

Ke ile ka makala hakaakang hore ebe ho na le karolo e nyenyane hakana ea basebelisi bao, ha ba se ba tloaelane le jOOQ, ba halefisitsoeng ke taba ea hore jOOQ e itšetlehile haholo ka tlhahiso ea khoutu ea mohloli hore e sebetse. Ha ho motho ea u thibelang ho sebelisa jOOQ kamoo u bonang ho loketse, kapa ho u qobella ho sebelisa tlhahiso ea khoutu. Empa mokhoa oa kamehla (joalokaha o hlalositsoe bukeng) oa ho sebetsa le jOOQ ke hore o qala ka schema ea (legacy) database, o e khutlisa o sebelisa jenereithara ea khoutu ea jOOQ ho fumana sehlopha sa lihlopha tse emelang litafole tsa hau, ebe o ngola mofuta. - Lipotso tse bolokehileng ho litafole tsena:

	for (Record2<String, String> record : DSL.using(configuration)
//   ^^^^^^^^^^^^^^^^^^^^^^^ Информация о типах выведена на 
//   основании сгенерированного кода, на который ссылается приведенное
// ниже условие SELECT 
 
       .select(ACTOR.FIRST_NAME, ACTOR.LAST_NAME)
//           vvvvv ^^^^^^^^^^^^  ^^^^^^^^^^^^^^^ сгенерированные имена
       .from(ACTOR)
       .orderBy(1, 2)) {
    // ...
}

Khoutu e hlahisoa ka letsoho ka ntle ho kopano, kapa ka letsoho kopanong ka 'ngoe. Ka mohlala, ho tsosolosoa ho joalo ho ka 'na ha latela hang ka mor'a moo Flyway database migration, eo hape e ka etsoang ka letsoho kapa ka boiketsetso.

Ho hlahisa khoutu ea mohloli

Ho na le lifilosofi tse fapa-fapaneng, melemo le bofokoli tse amanang le mekhoa ena ea ho hlahisa khoutu - bukana ea matsoho le e ikemetseng - eo nke keng ka e tšohla ka ho qaqileng sehloohong sena. Empa, ka kakaretso, ntlha eohle ea khoutu e hlahisitsoeng ke hore e re lumella ho hlahisa Java "'nete" eo re e nkang habobebe, ebang ke ka har'a tsamaiso ea rona kapa ka ntle ho eona. Ka tsela e itseng, sena ke seo bahlophisi ba se etsang ha ba hlahisa bytecode, mochine oa khoutu, kapa mofuta o mong oa khoutu ea mohloli - re fumana setšoantšo sa "'nete" ea rona ka puo e' ngoe, ho sa tsotellehe mabaka a tobileng.

Ho na le lijenereithara tse ngata tse joalo tsa khoutu. Ka mohlala, XJC e ka hlahisa khoutu ea Java e thehiloeng ho lifaele tsa XSD kapa WSDL. Molao-motheo o lula o tšoana:

  • Ho na le 'nete e itseng (ka hare kapa ka ntle) - mohlala, tlhaloso, mohlala oa data, joalo-joalo.
  • Re hloka boemeli ba lehae ba 'nete ena ka puo ea rona ea mananeo.

Ho feta moo, hoo e ka bang kamehla ho eletsoa ho hlahisa boemeli bo joalo e le ho qoba ho fokolloa.

Bafani ba Mefuta le Ts'ebetso ea Litlhaloso

Tlhokomeliso: mokhoa o mong, oa sejoale-joale le o ikhethileng oa ho hlahisa khoutu ea jOOQ o sebelisa bafani ba mefuta, joalo ka ha li kengoa tšebetsong ho F#. Tabeng ena, khoutu e hlahisoa ke moqapi, ha e le hantle sethaleng sa ho bokella. Ha e le hantle, khoutu e joalo ha e eo ka mokhoa oa mohloli. Java e na le lisebelisoa tse tšoanang, leha e se tse boreleli - li-processor tsa annotation, mohlala, Lombok.

Ka mantsoe a mang, lintho tse tšoanang li etsahala mona joalo ka tabeng ea pele, ntle le:

  • Ha u bone khoutu e hlahisitsoeng (mohlomong boemo bona bo bonahala bo sa nyenyefatse motho e mong?)
  • U tlameha ho etsa bonnete ba hore mefuta e ka fanoa, ke hore, "'nete" e tlameha ho lula e le teng. Sena se bonolo tabeng ea Lombok, e hlalosang "'nete". E rarahane le ho feta ka mefuta ea database e itšetlehileng ka khokahano e fumanehang kamehla.

Bothata ke bofe ka tlhahiso ea khoutu?

Ntle le potso e qhekellang ea hore na ho molemo ho tsamaisa tlhahiso ea khoutu joang - ka letsoho kapa ka boiketsetso, re boetse re tlameha ho bolela hore ho na le batho ba lumelang hore tlhahiso ea khoutu ha e hlokehe ho hang. Ho lokafatsa ntlha ena ea maikutlo, eo ke ileng ka kopana le eona hangata, ke hore joale ho thata ho theha pipeline ea ho haha. E, ho thata haholo. Ho hlaha litšenyehelo tse ling tsa litšebeletso tsa motheo. Haeba u sa tsoa qala ka sehlahisoa se itseng (ebang ke jOOQ, kapa JAXB, kapa Hibernate, joalo-joalo), ho theha tikoloho ea tlhahiso ho nka nako eo u ka ratang ho e qeta ho ithuta API ka boeona e le hore u ka ntša boleng ho eona. .

Haeba litšenyehelo tse amanang le ho utloisisa sebopeho sa jenereithara li phahame haholo, joale, ka sebele, API e entse mosebetsi o mobe mabapi le ts'ebeliso ea jenereithara ea khoutu ('me hamorao hoa bonahala hore ho thatafala ha mosebedisi ho eona). Tšebeliso e lokela ho ba eona ntho e tlang pele ho API efe kapa efe e joalo. Empa ena ke khang e le 'ngoe feela khahlanong le tlhahiso ea khoutu. Ho seng joalo, ke mokhoa o felletseng oa ho ngola boemeli ba lehae ba 'nete ea kahare kapa kantle.

Ba bangata ba tla re ha ba na nako ea ho etsa sena sohle. Ba felloa ke nako bakeng sa Super Product ea bona. Ka letsatsi le leng re tla lokisa li-conveyors tsa kopano, re tla ba le nako. Ke tla ba araba:

'Nete pele, kapa hore na ke hobane'ng ha sistimi e hloka ho raloa ho ipapisitsoe le moralo oa database
Ntho ea pele, Alan O'Rourke, Stack ea Bamameli

Empa ho Hibernate / JPA ho bonolo haholo ho ngola khoutu ea Java.

Ruri. Ho Hibernate le basebelisi ba eona, sena ke tlhohonolofatso le thohako. Ho Hibernate o ka ngola feela mekhatlo e 'maloa, e kang ena:

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

Mme hoo e ka bang tsohle di lokile. Joale ho ho Hibernate ho hlahisa "lintlha" tse rarahaneng tsa hore na setheo sena se tla hlalosoa joang ho DDL ea "puo" ea hau ea 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);

... ebe o qala ho tsamaisa sesebelisoa. Monyetla o motle haholo oa ho qala kapele le ho leka lintho tse fapaneng.

Leha ho le joalo, ke kopa u ntumelle. Ke ne ke bua leshano.

  • Na Hibernate e hlile e tla tiisa tlhaloso ea senotlolo see se rehiloeng sa mantlha?
  • Na Hibernate e tla theha index ho TITLE? - Ke tseba hantle hore re tla e hloka.
  • Na Hibernate e tla tsebahatsa senotlolo see ho Tlhaloso ea Boitsebiso?

Mohlomong ha ho joalo. Haeba u nts'etsapele projeke ea hau ho tloha qalong, ho bonolo kamehla ho lahla database ea khale ebe o hlahisa e ncha hang ha o kenya litlatsetso tse hlokahalang. Kahoo, mokhatlo oa Buka o tla qetella o nkile sebopeho:

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

Pholile. Hlahisa bocha. Hape, tabeng ena ho tla ba bonolo haholo qalong.

Empa u tla tlameha ho e lefella hamorao

Haufinyane o tla tlameha ho kena tlhahiso. Ke ha mohlala ona o tla emisa ho sebetsa. Hobane:

Ka tlhahiso, ho ke ke ha hlola ho khoneha, haeba ho hlokahala, ho lahla database ea khale le ho qala ho tloha qalong. Database ea hau e tla fetoha lefa.

Ho tloha joale ho ea pele le ka ho sa feleng u tla tlameha ho ngola Mengolo ea ho falla ea DDL, mohlala, ho sebelisa Flyway. Ho tla etsahala'ng ka mekhatlo ea hau tabeng ee? U ka li fetola ka letsoho ('me kahoo u imena habeli mosebetsi oa hau), kapa u ka bolella Hibernate hore a u tsosolose (ho na le menyetla e kae e hlahisoang ka tsela ee ho finyella litebello tsa hau?) Ka tsela efe kapa efe, u lahleheloa.

Kahoo hang ha o kena tlhahiso o tla hloka li-patches tse chesang. 'Me li hloka ho kenngoa tlhahisong kapele haholo. Kaha ha ua itokisetsa le ho hlophisa liphaephe tse boreleli tsa ho falla ha hau bakeng sa tlhahiso, u kopanya ntho e 'ngoe le e' ngoe ka mokhoa o makatsang. 'Me joale ha u sa na nako ea ho etsa ntho e' ngoe le e 'ngoe ka nepo. 'Me u nyatsa Hibernate, hobane kamehla ke phoso ea motho e mong, eseng uena ...

Ho e-na le hoo, lintho li ka be li entsoe ka tsela e fapaneng ka ho feletseng le qalong. Ka mohlala, beha mabili a chitja holim'a baesekele.

Database pele

"'Nete" ea' nete ho schema ea hau ea database le "bobusi" holim'a eona e ka har'a database. schema e hlalosoa feela ka har'a database ka boeona, 'me ha ho kae kapa kae,' me moreki e mong le e mong o na le kopi ea schema ena, kahoo hoa utloahala ho tiisa hore ho latela schema le botšepehi ba eona, ho e etsa hantle sebakeng sa polokelo ea litaba - moo boitsebiso bo leng teng. bolokoa.
Sena ke bohlale ba khale, esita le hackneyed. Linotlolo tsa mantlha le tse ikhethang li ntle. Linotlolo tsa kantle ho naha li ntle. Ho hlahloba lithibelo ho molemo. Boitlamo - Ho lokile.

Ho feta moo, ha se eona feela. Mohlala, ha u sebelisa Oracle, mohlomong u ka batla ho hlakisa:

  • Tafole ea hau e sebakeng sefe?
  • Boleng ba eona ba PCTFREE ke bofe?
  • Ke boholo bofe ba cache ka tatellano ea hau (ka morao ho id)

Sena se kanna sa se be sa bohlokoa lits'ebetsong tse nyane, empa ha ua tlameha ho ema ho fihlela u fallela sebakeng se seholo sa data-u ka qala ho rua molemo ho tsoa ho lintlafatso tsa polokelo tse fanoeng ke barekisi joalo ka tse boletsoeng ka holimo haufinyane. Ha ho le e 'ngoe ea li-ORM tseo ke li boneng (ho kenyeletsoa jOOQ) tse fanang ka phihlello ea likhetho tse felletseng tsa DDL tseo u ka ratang ho li sebelisa polokelong ea hau. Li-ORM li fana ka lisebelisoa tse u thusang ho ngola DDL.

Empa qetellong ea letsatsi, potoloho e entsoeng hantle e ngotsoe ka letsoho ka DDL. DDL efe kapa efe e hlahisitsoeng ke khakanyo feela ea eona.

Ho thoe'ng ka mohlala oa bareki?

Joalokaha ho boletsoe ka holimo, ho moreki u tla hloka kopi ea schema ea hau ea database, pono ea moreki. Ha ho hlokahale hore ho boleloe, pono ena ea bareki e tlameha ho lumellana le mohlala oa sebele. Mokhoa o motle oa ho fihlela see ke ofe? Ho sebelisa jenereithara ea khoutu.

Li-database tsohle li fana ka lintlha tsa bona tsa meta ka SQL. Mona ke mokhoa oa ho fumana litafole tsohle ho database ea hau ka lipuo tse fapaneng tsa 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

Lipotso tsena (kapa tse tšoanang, ho ipapisitsoe le hore na u tlameha ho nahana ka maikutlo, lipono tse fetotsoeng, mesebetsi ea boleng ba tafole) le tsona li etsoa ka ho letsetsa. DatabaseMetaData.getTables() ho tsoa ho JDBC, kapa ho sebelisa jOOQ meta-module.

Ho tsoa liphethong tsa lipotso tse joalo, ho bonolo ho hlahisa setšoantšo se seng le se seng sa bareki sa mofuta oa polokelo ea hau, ho sa tsotelehe hore na u sebelisa theknoloji efe ho moreki.

  • Haeba u sebelisa JDBC kapa Spring, u ka theha sete ea likhoele tse sa fetoheng
  • Haeba u sebelisa JPA, u ka iketsetsa mekhatlo ka bo eona
  • Haeba u sebelisa jOOQ, u ka hlahisa jOOQ meta-model

Ho ipapisitse le hore na API ea moreki oa hau e fana ka ts'ebetso e kae (mohlala jOOQ kapa JPA), mofuta oa meta o hlahisitsoeng o ka ba o ruileng le o phethahetseng. Nka, mohlala, monyetla oa ho kopanya ka botlalo, e hlahisitsoe ho jOOQ 3.11, e itšetlehileng ka lintlha tse hlahisitsoeng tsa meta mabapi le likamano tsa bohlokoa tsa kantle ho naha tse teng lipakeng tsa litafole tsa hau.

Joale keketseho efe kapa efe ea database e tla ntlafatsa khoutu ea bareki ka bo eona. Nahana ka mohlala:

ALTER TABLE book RENAME COLUMN title TO book_title;

Na u hlile u ka rata ho etsa mosebetsi oo habeli? Ha ho joalo. Kenya feela DDL, e tsamaise ka pompo ea hau ea kaho, 'me u fumane sengoloa se ntlafalitsoeng:

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

Kapa sehlopha se ntlafalitsoeng sa jOOQ. Liphetoho tse ngata tsa DDL le tsona li ama semantics, eseng syntax feela. Ka hona, ho ka ba molemo ho sheba khoutu e hlophisitsoeng ho bona hore na khoutu e tla (kapa e ka) e angoa ke keketseho ea database ea hau.

'Nete feela

Ho sa tsotellehe hore na u sebelisa theknoloji efe, kamehla ho na le mohlala o le mong oo e leng oona feela mohloli oa 'nete bakeng sa tsamaiso e itseng - kapa, bonyane, re lokela ho loanela sena le ho qoba pherekano e joalo ea khoebo, moo "'nete" e leng teng hohle le kae kapa kae hang-hang. . Ntho e 'ngoe le e 'ngoe e ka ba bonolo haholoanyane. Haeba u ntse u fapanyetsana lifaele tsa XML ka sistimi e ngoe, sebelisa XSD feela. Sheba INFORMATION_SCHEMA meta-model ho tsoa ho jOOQ ka mokhoa oa XML:
https://www.jooq.org/xsd/jooq-meta-3.10.0.xsd

  • XSD e utloisisoa hantle
  • XSD e tšoaea litaba tsa XML hantle haholo mme e lumella netefatso ka lipuo tsohle tsa bareki
  • XSD e hlophisitsoe hantle 'me e na le tšebelisano e tsoetseng pele ea morao-rao
  • XSD e ka fetoleloa ho Java khoutu ho sebelisoa XJC

Ntlha ea ho qetela ke ea bohlokoa. Ha re buisana le sistimi e kantle re sebelisa melaetsa ea XML, re batla ho netefatsa hore melaetsa ea rona e nepahetse. Sena se bonolo haholo ho se fihlela o sebelisa JAXB, XJC le XSD. E ka ba bohlanya bo boholo ho nahana hore, ka mokhoa oa "Java pele" oa moralo moo re etsang melaetsa ea rona joalo ka lintho tsa Java, hore ka tsela e itseng e ka etsoa 'mapa o lumellanang ho XML ebe e romelloa ho sistimi e ngoe hore e sebelisoe. XML e hlahisitsoeng ka tsela ena e tla ba ea boleng bo tlase haholo, e se nang litokomane, 'me ho le thata ho e nts'etsapele. Haeba ho ne ho e-na le tumellano ea boemo ba tšebeletso (SLA) bakeng sa sebopeho se joalo, re ne re tla e senya hang-hang.

Ka 'nete, sena ke se etsahalang ka linako tsohle ka li-API tsa JSON, empa ke pale e' ngoe, ke tla qabana nakong e tlang ...

Databases: ke ntho e le 'ngoe

Ha u sebetsa le li-database, ua hlokomela hore kaofela li tšoana hantle. Motheo o na le data ea ona mme o tlameha ho laola leano. Liphetoho leha e le life tse entsoeng ho schema li tlameha ho kenngoa ts'ebetsong ka ho toba ho DDL e le hore mohloli o le mong oa 'nete o nchafatsoe.

Ha mohloli o ntlafalitsoe, bareki bohle ba tlameha ho ntlafatsa likopi tsa bona tsa mohlala. Basebelisi ba bang ba ka ngoloa ka Java ba sebelisa jOOQ le Hibernate kapa JDBC (kapa ka bobeli). Bareki ba bang ba ka ngoloa ka Perl (re ba lakaletsa mahlohonolo), ha tse ling li ka ngoloa ho C #. Ha ho na taba. Mohlala o ka sehloohong o polokelong ea litaba. Mehlala e hlahisoang ho sebelisoa li-ORM hangata ke ea boleng bo tlase, ha e ngotsoe hantle, 'me ho thata ho e hlahisa.

Kahoo u se ke ua etsa liphoso. U se ke ua etsa liphoso ho tloha qalong. Sebetsa ho tsoa ho database. Theha phaephe ea ho tsamaisa e ka iketsetsang. Lumella lijenereithara tsa khoutu ho etsa hore ho be bonolo ho kopitsa mohlala oa hau oa polokelo ea litaba le ho o lahlela ho bareki. 'Me u khaotse ho tšoenyeha ka lijenereithara tsa khoutu. Ba molemo. Ka tsona u tla atleha haholoanyane. U hloka feela ho qeta nako e nyane u li hlophisa ho tloha qalong - 'me u letetsoe ke lilemo tsa tlhahiso e eketsehileng, e tla etsa nalane ea projeke ea hau.

O seke oa nteboha, hamorao.

Tlhaloso

Ho hlakisa: Sengoloa sena ha se buelle hore o hloka ho koba sistimi eohle (ke hore, domain, logic ea khoebo, joalo-joalo, joalo-joalo) ho lumellana le mohlala oa hau oa database. Seo ke se buang sehloohong sena ke hore khoutu ea bareki e sebetsanang le database e lokela ho sebetsa motheong oa mohlala oa database, e le hore ka boeona e se ke ea hlahisa mohlala oa database ka boemo ba "sehlopha sa pele". Monahano ona hangata o fumaneha sebakeng sa phihlello ea data ho moreki oa hau.

Mehahong ea mekhahlelo e 'meli, e ntseng e bolokiloe libakeng tse ling, mokhoa o joalo oa tsamaiso e ka ba oona feela o ka khonehang. Leha ho le joalo, litsamaisong tse ngata karolo ea phihlello ea data ho nna e bonahala e le "subsystem" e kenyelletsang mohlala oa database.

Likhetho

Ho na le mekhelo molaong o mong le o mong, 'me ke se ke boletse hore mokhoa oa ho hlahisa database-pele le mohloli oa khoutu ka linako tse ling e ka ba tse sa lokelang. Mona ke tse ling tsa mekhelo e joalo (mohlomong ho na le tse ling):

  • Ha schema e sa tsejoe mme e hloka ho fumanoa. Ka mohlala, u mofani oa sesebelisoa se thusang basebelisi ho sheba setšoantšo leha e le sefe. Ugh. Ha ho na tlhahiso ea khoutu mona. Leha ho le joalo, database e tla pele.
  • Ha potoloho e tlameha ho hlahisoa ka fofa ho rarolla bothata bo itseng. Mohlala ona o bonahala e le mofuta o sa reng letho oa paterone boleng ba sebopeho, ke hore, ha u na morero o hlakileng. Tabeng ena, hangata o ka se be le bonnete ba hore RDBMS e tla o lekana.

Mekhelo ka tlhaho e ikhethile. Maemong a mangata a amanang le tšebeliso ea RDBMS, schema e tsejoa esale pele, e lula ka hare ho RDBMS 'me ke eona feela mohloli oa "'nete",' me bareki bohle ba tlameha ho fumana likopi tse nkiloeng ho eona. Ha e le hantle, o hloka ho sebelisa jenereithara ea khoutu.

Source: www.habr.com

Eketsa ka tlhaloso