An fhírinne ar dtús, nó cén fáth ar gá an córas a dhearadh bunaithe ar struchtúr an bhunachair sonraí

Hey Habr!

Leanaimid ag déanamh taighde ar an ábhar java и Earrach, lena n-áirítear ar leibhéal an bhunachair shonraí. Sa lá atá inniu beimid ag iarraidh oraibh léamh faoi cén fáth, agus feidhmchláir mhóra á ndearadh, gurb é struchtúr an bhunachair shonraí, agus ní an cód Java, ba cheart a bheith ríthábhachtach, conas a dhéantar é seo, agus cad iad na heisceachtaí atá ann don riail seo.

San alt sách déanach seo, míneoidh mé cén fáth go gcreidim, i mbeagnach gach cás, gur cheart an tsamhail sonraí in iarratas a dhearadh "ón mbunachar sonraí" seachas "ó chumais Java" (nó cibé teanga cliant atá agat. ag obair le). Tríd an dara cur chuige a ghlacadh, tá tú ag réiteach do chosán fada pianta agus fulaingthe nuair a thosaíonn do thionscadal ag fás.

Scríobhadh an t-alt bunaithe ar ceist amháin, tugtha ar Stack Overflow.

Plé suimiúil ar reddit i rannóga /r/ java и /r/ ríomhchlárú.

Giniúint cód

Is é an t-iontas a bhí orm ná go bhfuil teascán chomh beag úsáideoirí ann atá, tar éis dul i dtaithí ar jOOQ, go bhfuil siad scanraithe ag an bhfíric go mbraitheann jOOQ go mór ar ghiniúint cód foinse chun oibriú. Níl aon duine ag cur bac ort jOOQ a úsáid mar is cuí leat, nó ag cur iachall ort giniúint cód a úsáid. Ach is é an modh oibre réamhshocraithe (mar a thuairiscítear sa lámhleabhar) le jOOQ ná go dtosaíonn tú le scéimre bhunachar sonraí (oidhreacht), déan innealtóir droim ar ais ag baint úsáide as an gineadóir cód jOOQ chun sraith ranganna a fháil a léiríonn do tháblaí, agus ansin scríobh cineál - ceisteanna sábháilte chuig na táblaí seo:

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

Gintear an cód de láimh lasmuigh den tionól, nó de láimh ag gach tionól. Mar shampla, féadfaidh athghiniúint den sórt sin a leanúint díreach ina dhiaidh sin Ascnamh bunachar sonraí Flyway, ar féidir a dhéanamh freisin de láimh nó go huathoibríoch.

Giniúint cód foinse

Tá fealsúnachtaí, buntáistí agus míbhuntáistí éagsúla ag baint leis na cineálacha cur chuige seo maidir le giniúint cód - láimhe agus uathoibríoch - nach bhfuil mé chun a phlé go mion san Airteagal seo. Ach, go ginearálta, is é pointe iomlán an chóid a ghintear ná go gceadaíonn sé dúinn an “fhírinne” sin a ghlacann muid go talamh slán de a atáirgeadh i Java, laistigh dár gcóras nó lasmuigh de. Ar bhealach, is é seo a dhéanann tiomsaitheoirí nuair a ghineann siad bytecode, cód meaisín, nó cineál éigin eile de chód foinse - faigheann muid léiriú ar ár "fhírinne" i dteanga eile, beag beann ar na cúiseanna sonracha.

Tá go leor gineadóirí cód den sórt sin ann. Mar shampla, Is féidir le XJC cód Java a ghiniúint bunaithe ar chomhaid XSD nó WSDL. Tá an prionsabal mar an gcéanna i gcónaí:

  • Tá roinnt fírinne (inmheánach nó seachtrach) - mar shampla, sonraíocht, samhail sonraí, etc.
  • Teastaíonn léiriú áitiúil den fhírinne seo uainn inár dteanga ríomhchlárúcháin.

Ina theannta sin, tá sé inmholta beagnach i gcónaí léiriú den sórt sin a ghiniúint chun iomarcaíocht a sheachaint.

Soláthraithe Cineál agus Próiseáil Anótála

Nóta: tá cur chuige eile atá níos nua-aimseartha agus níos sainiúla maidir le cód a ghiniúint do jOOQ ag baint úsáide as soláthraithe cineáil, mar a chuirtear i bhfeidhm iad in F#. Sa chás seo, gineann an tiomsaitheoir an cód, i ndáiríre ag an gcéim tiomsaithe. I bprionsabal, níl an cód sin i bhfoirm foinse. Tá uirlisí comhchosúla ag Java, cé nach bhfuil siad chomh galánta - próiseálaithe anótála, mar shampla, Lombok.

Ar bhealach, tarlaíonn na rudaí céanna anseo agus a tharla sa chéad chás, cé is moite de:

  • Ní fheiceann tú an cód ginte (b’fhéidir nach bhfuil an chuma ar an scéal go bhfuil an cás seo chomh corraitheach céanna le duine éigin?)
  • Ní mór duit a chinntiú gur féidir cineálacha a sholáthar, is é sin, ní mór "fíor" a bheith ar fáil i gcónaí. Tá sé seo éasca i gcás Lombok, a chuireann “fírinne” anó. Tá sé beagán níos casta le samhlacha bunachar sonraí a bhraitheann ar nasc beo atá ar fáil i gcónaí.

Cad é an fhadhb le giniúint cód?

Chomh maith leis an gceist tricky maidir le conas is fearr giniúint cód a reáchtáil - de láimh nó go huathoibríoch, ní mór dúinn a lua freisin go bhfuil daoine ann a chreideann nach bhfuil gá le giniúint cód ar chor ar bith. Is é an t-údar atá leis an dearcadh seo, ar tháinig mé trasna air go minic, ná go bhfuil sé deacair ansin píblíne tógála a bhunú. Sea, tá sé thar a bheith deacair. Tagann costais bhonneagair bhreise chun cinn. Má tá tú díreach ag tosú le táirge ar leith (cibé acu jOOQ, nó JAXB, nó Hibernate, etc.), tógann sé am chun timpeallacht táirgthe a bhunú gur fearr leat an API féin a fhoghlaim ionas gur féidir leat luach a bhaint as. .

Má tá na costais a bhaineann le struchtúr an ghineadóra a thuiscint ró-ard, ansin, go deimhin, rinne an API droch-phost maidir le hinúsáidteacht an ghineadóra cód (agus ina dhiaidh sin is cosúil go bhfuil saincheaptha úsáideora ann freisin casta). Ba cheart go mbeadh inúsáidteacht mar an tosaíocht is airde d’aon API den sórt sin. Ach níl anseo ach argóint amháin i gcoinne giniúint cód. Seachas sin, tá sé de láimh go hiomlán léiriú áitiúil den fhírinne inmheánach nó sheachtrach a scríobh.

Déarfaidh go leor nach bhfuil am acu é seo go léir a dhéanamh. Tá spriocdhátaí á rith acu dá Sártháirge. Lá éigin déanfaimid na iompróirí tionóil a ghlanadh, beidh am againn. Freagróidh mé iad:

An fhírinne ar dtús, nó cén fáth ar gá an córas a dhearadh bunaithe ar struchtúr an bhunachair sonraí
Bunaidh, Alan O'Rourke, Cruach Lucht Féachana

Ach i Hibernate/JPA tá sé chomh furasta cód Java a scríobh.

I ndáiríre. Do Hibernate agus a chuid úsáideoirí, is beannacht agus mallacht é seo. In Hibernate ní féidir leat ach cúpla aonán a scríobh, mar seo:

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

Agus tá beagnach gach rud réidh. Anois tá sé de dhualgas ar Hibernate na "mionsonraí" casta a ghiniúint faoi conas go díreach a shaineofar an t-aonán seo i DDL do "chanúint" 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);

... agus tús a chur leis an bhfeidhmchlár a rith. Deis iontach chun tús a chur go tapa agus rudaí éagsúla a thriail.

Mar sin féin, le do thoil cead dom. Bhí mé i mo luí.

  • An gcuirfidh Hibernate sainmhíniú ar an eochair phríomhúil ainmnithe seo i bhfeidhm i ndáiríre?
  • An gcruthóidh Hibernate innéacs i TITLE? – Tá a fhios agam go cinnte go mbeidh sé de dhíth orainn.
  • An ndéanfaidh Hibernate an eochair-aithint seo go díreach sa Sonraíocht Aitheantais?

Is dócha nach bhfuil. Má tá do thionscadal á fhorbairt agat ón tús, tá sé áisiúil i gcónaí an seanbhunachar sonraí a chaitheamh amach agus ceann nua a ghiniúint chomh luath agus a chuireann tú na nótaí riachtanacha leis. Mar sin, beidh an t-aonán Leabhar san fhoirm ar deireadh:

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

Cool. Athghin. Arís, sa chás seo beidh sé an-éasca ag an tús.

Ach beidh ort íoc as níos déanaí

Luath nó mall beidh ort dul isteach i dtáirgeadh. Sin nuair a stopfaidh an tsamhail seo ag obair. Mar:

I dtáirgeadh, ní bheidh sé indéanta a thuilleadh, más gá, an seanbhunachar sonraí a chaitheamh amach agus tosú ón tús. Beidh do bhunachar sonraí mar oidhreacht.

As seo amach agus go deo beidh ort scríobh Scripteanna imirce DDL, mar shampla, ag baint úsáide as Flyway. Cad a tharlóidh do d'aonáin sa chás seo? Is féidir leat iad a oiriúnú de láimh (agus dá bhrí sin d'ualach oibre a dhúbailt), nó is féidir leat a rá le Hibernate iad a athnuachan duit (cé chomh dóchúil is a bheidh na cinn a ghintear ar an mbealach seo chun do chuid ionchais a chomhlíonadh?) Cibé bealach, caillfidh tú.

Mar sin, nuair a bheidh tú ag táirgeadh beidh paistí te de dhíth ort. Agus ní mór iad a chur i dtáirgeadh go han-tapa. Ós rud é nár ullmhaigh tú agus nár eagraigh tú píblíne réidh do chuid imirce le haghaidh táirgeadh, déanann tú gach rud a phaisteáil go fiáin. Agus ansin ní bhíonn am agat a thuilleadh gach rud a dhéanamh i gceart. Agus cáineadh tú Hibernate, mar is ar dhuine eile i gcónaí atá an locht, ach ní tusa...

Ina áit sin, d’fhéadfaí rudaí a dhéanamh go hiomlán difriúil ón tús. Mar shampla, cuir rothaí cruinn ar rothar.

Bunachar sonraí ar dtús

Tá an "fhírinne" fíor i do scéimre bhunachar sonraí agus an "cheannasacht" os a chionn laistigh den bhunachar sonraí. Ní shainmhínítear an scéimre ach sa bhunachar sonraí féin agus áit ar bith eile, agus tá cóip den scéimre seo ag gach cliant, mar sin déanann sé ciall foirfe comhlíonadh na scéime agus a sláine a fhorfheidhmiú, é a dhéanamh ceart sa bhunachar sonraí - áit a bhfuil an fhaisnéis. stóráilte.
Tá sé seo sean, fiú hackneyed eagna. Tá eochracha bunscoile agus uathúla go maith. Tá eochracha eachtracha go maith. Is maith an rud srianta a sheiceáil. Dearbhuithe - Go breá.

Thairis sin, ní hé sin go léir. Mar shampla, ag baint úsáide as Oracle, is dócha gur mhaith leat a shonrú:

  • Cén spás boird a bhfuil do bhord ann?
  • Cad é a luach PCTFREE?
  • Cad é méid an taisce i do sheicheamh (taobh thiar den aitheantas)

B'fhéidir nach bhfuil sé seo tábhachtach i gcórais bheaga, ach ní gá duit fanacht go dtí go n-aistríonn tú isteach sa réimse mór sonraí - is féidir leat tosú ag baint leasa as leas iomlán a bhaint as leas iomlán a bhaint as stórais a sholáthraíonn díoltóirí cosúil leis na cinn thuasluaite. Ní sholáthraíonn aon cheann de na ORManna atá feicthe agam (lena n-áirítear jOOQ) rochtain ar an sraith iomlán de roghanna DDL a d’fhéadfadh gur mhaith leat a úsáid i do bhunachar sonraí. Tairgeann ORM roinnt uirlisí a chuidíonn leat DDL a scríobh.

Ach ag deireadh an lae, tá ciorcad dea-dheartha lámhscríofa i DDL. Níl in aon DDL ginte ach comhfhogasú de.

Cad mar gheall ar mhúnla an chliaint?

Mar a luadh thuas, ar an gcliant beidh ort cóip de do scéimre bunachar sonraí, an dearcadh cliant. Ní gá a lua, ní mór an dearcadh cliant seo a bheith ag teacht leis an tsamhail iarbhír. Cad é an bealach is fearr chun é seo a bhaint amach? Ag baint úsáide as gineadóir cód.

Soláthraíonn gach bunachar sonraí a gcuid faisnéise meitea trí SQL. Seo conas na táblaí go léir a fháil ó do bhunachar sonraí i gcanúintí SQL éagsúla:

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

Déantar na fiosrúcháin seo (nó ceisteanna comhchosúla, ag brath ar cibé an gcaithfidh tú tuairimí, tuairimí ábhartha, feidhmeanna a bhfuil luach tábla orthu) a chur i gcrích freisin trí ghlao a chur ar DatabaseMetaData.getTables() ó JDBC, nó ag baint úsáide as an meitea-mhodúl jOOQ.

Ó thorthaí na bhfiosrúchán sin, tá sé sách éasca aon léiriú ó thaobh an chliaint de do mhúnla bunachar sonraí a ghiniúint, is cuma cén teicneolaíocht a úsáideann tú ar an gcliant.

  • Má tá JDBC nó Spring á úsáid agat, is féidir leat sraith tairisigh teaghrán a chruthú
  • Má úsáideann tú JPA, is féidir leat na haonáin a ghiniúint iad féin
  • Má úsáideann tú jOOQ, is féidir leat meitea-mhúnla jOOQ a ghiniúint

Ag brath ar cé mhéad feidhmiúlacht a thairgeann do chliaint API (m.sh. jOOQ nó JPA), is féidir leis an múnla meitea-ghinte a bheith saibhir agus iomlán. Tóg, mar shampla, an fhéidearthacht a bhaineann le ceangail intuigthe, tugtha isteach in jOOQ 3.11, a bhraitheann ar fhaisnéis mheitineach a ghintear faoi na príomhchaidrimh eachtracha atá idir do tháblaí.

Anois déanfaidh aon incrimint bhunachar sonraí an cód cliant a nuashonrú go huathoibríoch. Samhlaigh mar shampla:

ALTER TABLE book RENAME COLUMN title TO book_title;

Ar mhaith leat an post seo a dhéanamh faoi dhó i ndáiríre? In aon chás. Níl ort ach an DDL a thiomnú, é a rith tríd do phíblíne tógála, agus faigh an t-aonán nuashonraithe:

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

Nó an rang jOOQ nuashonraithe. Bíonn tionchar ag formhór na n-athruithe DDL freisin ar shéimeantaic, ní hamháin ar chomhréir. Mar sin, is féidir go mbeadh sé úsáideach breathnú sa chód tiomsaithe chun a fheiceáil cén cód a rachaidh (nó a bhféadfadh) tionchar a bheith aige ar do bhunachar sonraí incriminte.

An fhírinne amháin

Is cuma cén teicneolaíocht a úsáideann tú, tá múnla amháin ann i gcónaí arb í an t-aon fhoinse fírinne í do fhochóras éigin - nó, ar a laghad, ba cheart dúinn ár ndícheall a dhéanamh chun a leithéid de mhearbhall fiontraíochta a sheachaint, áit a bhfuil “fhírinne” i ngach áit agus in áit ar bith. . D'fhéadfadh gach rud a bheith i bhfad níos simplí. Mura bhfuil tú ag malartú comhaid XML ach le córas éigin eile, bain úsáid as XSD. Féach ar an meiteashamhail INFORMATION_SCHEMA ó jOOQ i bhfoirm XML:
https://www.jooq.org/xsd/jooq-meta-3.10.0.xsd

  • Tuigtear go maith XSD
  • Comharthaíonn XSD ábhar XML go han-mhaith agus ceadaíonn sé bailíochtú i ngach teanga cliant
  • Tá leagan maith ar XSD agus tá comhoiriúnacht ar gcúl chun cinn aige
  • Is féidir XSD a aistriú go cód Java ag baint úsáide as XJC

Tá an pointe deireanach tábhachtach. Nuair a dhéanaimid cumarsáid le córas seachtrach ag baint úsáide as teachtaireachtaí XML, ba mhaith linn a bheith cinnte go bhfuil ár dteachtaireachtaí bailí. Tá sé seo an-éasca a bhaint amach ag baint úsáide as JAXB, XJC agus XSD. Bheadh ​​sé iontach buile a cheapadh go bhféadfaí iad a mhapáil go comhleanúnach chuig XML agus iad a chur chuig córas eile le haghaidh tomhaltais le cur chuige dearaidh "Java ar dtús" ina ndéanaimid ár dteachtaireachtaí mar réada Java. Bheadh ​​XML ginte ar an mbealach seo ar cháilíocht an-lag, gan doiciméadú, agus deacair a fhorbairt. Dá mbeadh comhaontú seirbhíse (SLA) ann do chomhéadan den sórt sin, chuirfinn suas é láithreach.

Go hionraic, is é seo a tharlaíonn an t-am ar fad le JSON APIs, ach sin scéal eile, beidh mé ag argóint an chéad uair eile ...

Bunachair shonraí: is é an rud céanna iad

Agus tú ag obair le bunachair shonraí, tuigeann tú go bhfuil siad go léir cosúil go bunúsach. Is leis an mbonn a chuid sonraí agus ní mór dó an scéim a bhainistiú. Ní mór aon mhodhnuithe a dhéantar ar an scéimre a chur i bhfeidhm go díreach sa DDL chun foinse aonair na fírinne a nuashonrú.

Nuair a tharla nuashonrú foinse, ní mór do gach cliant a gcóipeanna den tsamhail a nuashonrú freisin. Is féidir roinnt cliant a scríobh i Java ag baint úsáide as jOOQ agus Hibernate nó JDBC (nó an dá cheann). Is féidir cliaint eile a scríobh i Perl (ní mór dúinn ach gach rath a ghuí orthu), agus is féidir cinn eile a scríobh i C#. Is cuma. Tá an príomhshamhail sa bhunachar sonraí. Is gnách go mbíonn múnlaí a ghintear trí úsáid a bhaint as ORManna ar dhroch-chaighdeán, ar dhrochdhoiciméadú, agus ar deacair iad a fhorbairt.

Mar sin, ná déan botúin. Ná déan botúin ón tús. Oibriú ón mbunachar sonraí. Tóg píblíne imscartha is féidir a uathoibriú. Cumasaigh gineadóirí cód ionas go mbeidh sé éasca do mhúnla bunachar sonraí a chóipeáil agus é a dhumpáil ar chliaint. Agus stop a bheith buartha faoi gineadóirí cód. Tá siad go maith. Leo beidh tú níos táirgiúla. Ní mór duit ach beagán ama a chaitheamh ag socrú iad ón tús - agus ansin tá blianta de tháirgiúlacht mhéadaithe ag fanacht leat, rud a dhéanfaidh stair do thionscadal.

Ná gabh buíochas liom fós, níos déanaí.

Míniú

Le bheith soiléir: Ní mholann an t-alt seo ar bhealach ar bith nach mór duit an córas iomlán a lúbadh (i.e., fearann, loighic ghnó, etc., etc.) chun do mhúnla bunachar sonraí a fheistiú. Is é an rud atá á rá agam san Airteagal seo ná gur cheart don chód cliaint a idirghníomhaíonn leis an mbunachar sonraí gníomhú ar bhonn mhúnla an bhunachair shonraí, ionas nach ndéanann sé féin samhail an bhunachair shonraí a atáirgeadh i stádas “den chéad scoth”. De ghnáth bíonn an loighic seo suite ag an gciseal rochtana sonraí ar do chliant.

In ailtireachtaí dhá leibhéal, atá fós caomhnaithe i roinnt áiteanna, b'fhéidir gurb é múnla córais den sórt sin an t-aon cheann is féidir. Mar sin féin, i bhformhór na gcóras feictear dom gur “fochóras” é an ciseal rochtana sonraí a chuimsíonn samhail an bhunachair shonraí.

Eisceachtaí

Tá eisceachtaí ann do gach riail, agus tá sé ráite agam cheana féin go mbíonn an cur chuige maidir le giniúint an chéad bhunachair agus an bhunchóid mí-oiriúnach uaireanta. Seo cúpla eisceacht den sórt sin (is dócha go bhfuil cinn eile ann):

  • Nuair a bhíonn an scéimre anaithnid agus is gá a fháil amach. Mar shampla, is soláthraí uirlis thú a chuidíonn le húsáideoirí nascleanúint a dhéanamh ar aon léaráid. Ugh. Níl aon ghiniúint cód anseo. Ach fós féin, tagann an bunachar sonraí ar dtús.
  • Nuair a chaithfear ciorcad a ghiniúint ar an eitilt chun fadhb éigin a réiteach. Is cosúil gur leagan beagán fanciful den phatrún an sampla seo luach aitreabúide aonáin, i.e., níl scéim shainithe soiléir agat i ndáiríre. Sa chás seo, is minic nach féidir leat a bheith cinnte go mbeidh RDBMS oiriúnach duit.

Is eisceachtaí iad de réir nádúr. I bhformhór na gcásanna a bhaineann le húsáid RDBMS, tá an scéimre ar eolas roimh ré, tá sé laistigh den RDBMS agus is é an t-aon fhoinse “fírinne”, agus caithfidh gach cliant cóipeanna a fháil a dhíorthaítear uaidh. Go hidéalach, ní mór duit gineadóir cód a úsáid.

Foinse: will.com

Add a comment