Përshëndetje, Habr!
Ne vazhdojmë të eksplorojmë temën dhe , duke përfshirë, në nivelin e bazave të të dhënave. Sot ofrojmë të lexoni përse, kur projektoni aplikacione të mëdha, struktura e bazës së të dhënave duhet të ketë rëndesi vendimtare, si funksionon kjo dhe cilat janë përjashtimet nga ky rregull.
NĂ« kĂ«tĂ« artikull mjaft tĂ« vonuar, do tĂ« shpjegoj se pĂ«rse e besoj se nĂ« pothuajse tĂ« gjitha rastet modeli i tĂ« dhĂ«nave nĂ« njĂ« aplikacion duhet tĂ« projektohet ânga baza e tĂ« dhĂ«naveâ, jo ânga mundĂ«sitĂ« e Java-sâ (ose ndonjĂ« gjuhe tjetĂ«r klienti me tĂ« cilĂ«n punoni). Duke zgjedhur qasjen e dytĂ«, ju hyni nĂ« njĂ« rrugĂ« tĂ« gjatĂ« dhimbjeje dhe vuajtjeje, sapo projekti juaj fillon tĂ« rritet.
Artikulli është shkruar duke u mbështetur në , e cila u bë në Stack Overflow.
Diskutime interesante në reddit në seksionet dhe .
Gjenerimi i kodit
Sa shumë u befasova që ekziston një grup i vogël përdoruesish, të cilët, pasi u njohën me jOOQ, janë të habitur nga fakti se kur punoni me jOOQ, besoheni seriozisht në gjenerimin e kodit burimor. Askush nuk ju pengon ta përdorni jOOQ ashtu siç e konsideroni të nevojshme, dhe askush nuk ju detyron të përdorni gjenerimin e kodit. Por, si parazgjedhje (ashtu siç përshkruhet në manual), puna me jOOQ ndodh kështu: filloni me (ndërprerjen) e skemës së bazës së të dhënave, bëni seksionin e saj si pasqyrë me ndihmën e gjeneratorit të kodit jOOQ, në mënyrë që të merrni një grup klasash që përfaqësojnë tabelat tuaja, dhe pastaj shkruani pyetje të sigurta për këto tabela:
for (Record2 record : DSL.using(configuration)
// ^^^^^^^^^^^^^^^^^^^^^^^ Informacioni për llojet është nxjerrë
// mbi bazën e kodit të gjeneruar, në të cilin i referohet kushti
// SELECT
.select(ACTOR.FIRST_NAME, ACTOR.LAST_NAME)
// vvvvv ^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ emrat e gjeneruar
.from(ACTOR)
.orderBy(1, 2)) {
// ...
}Kodi gjenerohet ose manualisht jashtë ndërtimit, ose manualisht gjatë çdo ndërtimi. Për shembull, një rregjenerim i tillë mund të ndodhë menjëherë pas .
Gjenerimi i kodit burimor
Me kĂ«to qasje pĂ«r gjenerimin e kodit â manuale dhe automatike â lidhen filozofi tĂ« ndryshme, pĂ«rparĂ«si dhe disavantazhe, tĂ« cilat nuk kam ndĂ«rmend t'i diskutoj nĂ« detaje nĂ« kĂ«tĂ« artikull. Por, pĂ«r pĂ«rgjithĂ«si, thelbi i kodit tĂ« gjeneruar Ă«shtĂ« se ai lejon riprodhimin nĂ« Java tĂ« âtĂ« vĂ«rtetĂ«sâ qĂ« e pranojmĂ« si tĂ« dhĂ«nĂ«, qoftĂ« brenda sistemit tonĂ«, apo jashtĂ« saj. NĂ« njĂ« farĂ« kuptimi, tĂ« njĂ«jtĂ«n gjĂ« bĂ«jnĂ« kompilatorĂ«t, qĂ« gjenerojnĂ« kod bajt, kod makine ose ndonjĂ« lloj tjetĂ«r kodi mbi bazĂ«n e kodit burimor â marrim njĂ« pĂ«rfaqĂ«sim tĂ« âtĂ« vĂ«rtetĂ«sâ sonĂ« nĂ« njĂ« gjuhĂ« tjetĂ«r, pavarĂ«sisht nga arsyet specifike.
Ekzistojnë shumë gjenerues të tillë të kodit. Për shembull, Parimi është gjithmonë i njëjtë:
- Ekziston njĂ« e vĂ«rtetĂ« e caktuar (brenda apo jashtĂ«) â pĂ«r shembull, specifikimi, modeli i tĂ« dhĂ«nave, etj.
- Na nevojitet një përfaqësim lokal i kësaj të vërtete në gjuhën tonë të programimit.
Dhe Ă«shtĂ« gjithmonĂ« e arsyeshme tĂ« gjenerohet njĂ« pĂ«rfaqĂ«sim i tillĂ« â pĂ«r tĂ« shmangur pĂ«rsĂ«ritjen.
Ofruesit e llojeve dhe përpunimi i annotimeve
PĂ«r t'u mbajtur mend: njĂ« qasje mĂ« moderne dhe specifike pĂ«r gjenerimin e kodit pĂ«r jOOQ Ă«shtĂ« e lidhur me pĂ«rdorimin e ofruesve tĂ« llojeve, NĂ« kĂ«tĂ« rast, kodi gjenerohet nga kompilator, nĂ« fakt nĂ« fazĂ«n e kompilimit. NĂ« formĂ«n e burimorĂ«ve, ky kod nuk ekziston nĂ« parim. NĂ« Java ekzistojnĂ« mjete tĂ« ngjashme, edhe pse ndoshta jo aq elegante â ato janĂ« procesorĂ«t e annotimeve. pĂ«r shembull, .
Në një farë kuptimi, këtu ndodhin të njëjtat gjëra si në rastin e parë, përveçse:
- Nuk e shihni kodin e gjeneruar (ndoshta kjo situatë dikujt i dukej jo aq e frikshme?)
- Duhet tĂ« garantoni qĂ« llojet mund tĂ« ofrohen, dmth, âe vĂ«rtetaâ duhet tĂ« jetĂ« gjithmonĂ« e qasshme. Kjo Ă«shtĂ« e lehtĂ« nĂ« rastin e Lombok, i cili annoton âtĂ« vĂ«rtetĂ«nâ. MĂ« e vĂ«shtirĂ« me modelet e bazave tĂ« tĂ« dhĂ«nave, puna e tĂ« cilave varet nga njĂ« lidhje aktive dhe gjithmonĂ« e disponueshme.
Cila është problemi me gjenerimin e kodit?
PĂ«rveç pyetjes se si Ă«shtĂ« mĂ« mirĂ« tĂ« nisni gjenerimin e kodit â manualisht apo automatikisht, duhet tĂ« pĂ«rmendim edhe ata qĂ« besojnĂ« se gjenerimi i kodit nuk Ă«shtĂ« i nevojshĂ«m fare. Justifikimi mĂ« i zakonshĂ«m pĂ«r kĂ«tĂ« pikĂ«pamje Ă«shtĂ« se e bĂ«n tĂ« vĂ«shtirĂ« konfigurimin e linjĂ«s sĂ« ndĂ«rtimit. Po, Ă«shtĂ« me tĂ« vĂ«rtetĂ« e vĂ«shtirĂ«. Kemi kosto tĂ« shtesĂ« infrastrukturore. NĂ«se sapo keni filluar tĂ« punoni me njĂ« produkt tĂ« caktuar (qoftĂ« jOOQ, JAXB, Hibernate, etj.), ju nevojitet kohĂ« pĂ«r tĂ« vendosur mjedisin e punĂ«s, kohĂ« qĂ« do tĂ« dĂ«shironit ta shpenzonit pĂ«r tĂ« mĂ«suar API-nĂ«, pĂ«r tĂ« nxjerrĂ« pastaj vlerĂ« prej saj.
NĂ«se kostot pĂ«r tĂ« kuptuar funksionimin e gjeneratorit janĂ« tepĂ«r tĂ« mĂ«dha â atĂ«herĂ«, me tĂ« vĂ«rtetĂ«, API-ja ka bĂ«rĂ« punĂ« tĂ« keqe nĂ« pĂ«rdorshmĂ«rinĂ« e gjeneratorit tĂ« kodit (ndĂ«rsa mĂ« vonĂ« ndodh qĂ« edhe konfigurimi i pĂ«rdoruesit nĂ« tĂ« Ă«shtĂ« i vĂ«shtirĂ«). LehtĂ«sia e pĂ«rdorimit duhet tĂ« jetĂ« prioriteti mĂ« i lartĂ« pĂ«r çdo API tĂ« tillĂ«. Por kjo Ă«shtĂ« vetĂ«m njĂ« argument kundĂ«r gjenerimit tĂ« kodit. Pjesa tjetĂ«r Ă«shtĂ« se absolutisht do tĂ« duhet ta shkruani manualisht pĂ«rfaqĂ«simin lokal tĂ« sĂ« vĂ«rtetĂ«s sĂ« brendshme ose tĂ« jashtme.
ShumĂ« do tĂ« thonĂ« se nuk kanĂ« kohĂ« pĂ«r tĂ« gjithĂ« kĂ«to punĂ«. Ata kanĂ« afate tĂ« ngushta nĂ« Super-Produktin e tyre. NdonjĂ«herĂ« mĂ« vonĂ« do tâi pĂ«rmirĂ«sojmĂ« linjat e ndĂ«rtimit, do tĂ« na dalĂ«. AtĂ«herĂ« do t'u pĂ«rgjigjem:

,
Por në Hibernate/JPA është kaq e lehtë të shkruash kod "për Java".
E vërtetë. Për Hibernate dhe përdoruesit e tij, kjo është njëherësh një bekim dhe një mallkim. Në Hibernate mund të shkruash lehtësisht disa entitete, kështu:
@Entity
class Book {
@Id
int id;
String title;
}Dhe pothuajse gjithçka Ă«shtĂ« gati. Tani, fokusi i Hibernate Ă«shtĂ« tĂ« gjenerojĂ« detaje tĂ« komplikuara se si do tĂ« pĂ«rcaktohet kjo entitet nĂ« DDL tĂ« SQL âdialektitâ tuaj:
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);⊠dhe fillojmë të ekzekutojmë aplikacionin. Një mundësi vërtet e shkëlqyer për të filluar shpejt dhe për të provuar gjëra të ndryshme.
Megjithatë, lejoni. Kam gënjyer.
- A do të aplikojë vërtet Hibernate përcaktimin e këtij çelësi primar të emëruar?
- A do tĂ« krijojĂ« Hibernate indeksin nĂ« TITLE? â unĂ« e di saktĂ«sisht, do ta kemi nevojĂ«.
- A do ta bëjë Hibernate këtë çelës identifikues në Specifikimin Identity?
Me siguri se jo. Nëse po zhvilloni projektin tuaj nga zero, është gjithmonë e lehtë të hiqni bazën e të dhënave të vjeter dhe të gjeneroni një të re, sa herë që të shtoni annotimet e nevojshme. Kështu, entiteti Book në fund do të marrë këtë pamje:
@Entity
@Table(name = "book", indexes = {
@Index(name = "i_book_title", columnList = "title")
})
class Book {
@Id
@GeneratedValue(strategy = IDENTITY)
int id;
String title;
}
Shkëlqyer. Riperitni nga e para. Prapë, në një rast të tillë do të jetë shumë e lehtë në fillim.
Por më vonë do të duhet të paguani për këtë.
Herët ose vonë do të duhet të kaloni në prodhim. Pikërisht atëherë një model i tillë do të ndalojë së funksionuari. Sepse:
Në prodhim nuk do të jeni në gjendje të hiqni bazën e të dhënave të vjeter dhe të filloni gjithçka nga e para. Baza juaj e të dhënave do të bëhet e trashëguar.
Që nga tani e tutje do të duhet të shkruani . E çfarë do të ndodhë në këtë rast me entitetet tuaja? Ju do të mund të adaptoni ato manualisht (dhe kështu do të dyfishoni punën tuaj), ose do t'i thoni Hibernate të gjenerojë përsëri ato për ju (sa të mëdha janë shanset që kjo gjeneratë të përputhet me pritshmëritë tuaja?) Në çdo rast, ju humbni.
Prandaj, sapo tĂ« kaloni nĂ« prodhim, do t'ju nevojiten patches tĂ« nxehta. Dhe ato duhet tĂ« ndodhin shpejt nĂ« prodhim. PĂ«rveçse nuk jeni pĂ«rgatitur dhe nuk keni organizuar njĂ« rrjedhĂ« tĂ« qetĂ« tĂ« migrimeve tuaja pĂ«r prodhim, do tĂ« jeni tĂ« ngarkuar me patching. Dhe pastaj do tĂ« filloni tĂ« mos arrini tĂ« bĂ«ni gjithçka siç duhet. Dhe do ta fajĂ«soni Hibernate, sepse gjithmonĂ« Ă«shtĂ« fajtor kushdo tjetĂ«r, pĂ«rveç jushâŠ
Në vend të kësaj, që nga fillimi mund ta bëni gjithçka ndryshe. Për shembull, të vendosni goma të rrethit në biçikletë.
Fillimisht baza e të dhënave
E vĂ«rteta e vĂ«rtetĂ« e skemĂ«s sĂ« bazĂ«s suaj tĂ« tĂ« dhĂ«nave dhe "sovraniteti" mbi tĂ« qĂ«ndron brenda bazĂ«s sĂ« tĂ« dhĂ«nave. Skema pĂ«rcaktohet vetĂ«m brenda bazĂ«s sĂ« tĂ« dhĂ«nave dhe asnjĂ«vend tjetĂ«r, dhe çdo klient ka njĂ« kopje tĂ« kĂ«saj skeme, kĂ«shtu qĂ« Ă«shtĂ« krejtĂ«sisht e arsyeshme tĂ« insistoni nĂ« respektimin e skemĂ«s dhe integritetit tĂ« saj, ta bĂ«ni kĂ«tĂ« nĂ« vetĂ« bazĂ«n e tĂ« dhĂ«nave â aty ku ruhet informacioni.
Kjo Ă«shtĂ« njĂ« mençuri e vjetĂ«r dhe e pĂ«rdorur. ĂelĂ«sat primarĂ« dhe unikĂ« janĂ« tĂ« mirĂ«. ĂelĂ«sat e jashtĂ«m â tĂ« mirĂ«. Kontrolli i kufizimeve â i mirĂ«. â tĂ« mirĂ«.
Për më tepër, kjo nuk është gjithçka. Për shembull, duke përdorur Oracle, ndoshta do të dëshironit të specifikoni:
- Në cilin hapësirë tabelash ndodhet tabela juaj
- Cila është vlera e saj PCTFREE
- Cili është madhësia e caches në sekuencën tuaj (pas identifikuesit)
Mund tĂ« mos jetĂ« gjithçka kaq e rĂ«ndĂ«sishme nĂ« sistemet e vogla, por nuk Ă«shtĂ« e nevojshme tĂ« prisni kalimin nĂ« fushĂ«n e "tĂ« dhĂ«nave tĂ« mĂ«dha" â mund tĂ« filloni tĂ« shfrytĂ«zoni pĂ«rfitimet e optimizimeve tĂ« ruajtjes sĂ« tĂ« dhĂ«nave qĂ« ofrohen nga ofruesi shumĂ« mĂ« herĂ«t, si ato tĂ« pĂ«rmendura mĂ« sipĂ«r. AsnjĂ« nga ORM-tĂ« qĂ« kam parĂ« (pĂ«rfshirĂ« jOOQ) nuk ofron qasje nĂ« tĂ« gjitha opsionet DDL qĂ« mund tĂ« dĂ«shironi tĂ« pĂ«rdorni nĂ« bazĂ«n tuaj tĂ« tĂ« dhĂ«nave. ORM-tĂ« ofrojnĂ« disa mjete qĂ« ndihmojnĂ« nĂ« shkruarjen e DDL.
Por, nĂ« fund tĂ« fundit, njĂ« skemĂ« e mirĂ« e dizajnuar Ă«shtĂ« shkruar manualisht nĂ« DDL. Ădo DDL i gjeneruar Ă«shtĂ« vetĂ«m njĂ« aproximim i saj.
ĂfarĂ« ndodh me modelin e klientit?
Siç u përmend më sipër, në klient do t'ju nevojitet një kopje e skemës së bazës suaj të të dhënave, një paraqitje klienti. Nuk është e nevojshme të përmendet që kjo paraqitje klienti duhet të jetë e sinkronizuar me modelin e vërtetë. Si është mënyra më e mirë për ta arritur atë? Nëpërmjet një gjeneruesi kod.
Të gjitha bazat e të dhënave ofrojnë metainformacionin e tyre përmes SQL. Ja se si të merrni të gjitha tabelat nga baza juaj e të dhënave në dialekte të ndryshme 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
Këto pyetje (ose të ngjashme, varësisht nga nëse duhet gjithashtu të llogariten paraqitjet, paraqitjet e materializuara, funksionet me vlerë tabelare) gjithashtu ekzekutohen nëpërmjet thirrjes në JDBC, apo nëpërmjet modulit të metainformacionit jOOQ.
Nga rezultatet e këtyre pyetjeve është mjaft e lehtë të gjeneroni çdo paraqitje klienti të modelit të bazës suaj të të dhënave, pavarësisht nga teknologjia që përdorni në klient.
- Nëse përdorni JDBC ose Spring, mund të krijoni një set konstantash string
- Nëse përdorni JPA, mund të gjeneroni entitetet tuaja
- Nëse përdorni jOOQ, mund të gjeneroni metamodelin e jOOQ
Varësisht nga sasia e mundësive që ofron API juaj i klientit (p.sh. jOOQ ose JPA), metamodeli i gjeneruar mund të jetë me të vërtetë i pasur dhe i plotë. Merrni, për shembull, mundësinë e bashkimeve të implicit që , e cila mbështetet në metainformacionin e gjeneruar për marrëdhëniet e çelësave të jashtëm që veprojnë midis tabelave tuaja.
Tani çdo rritje e bazës së të dhënave do të çojë automatikisht në përditësimin e kodit të klientit. Imagjinoni, për shembull:
ALTER TABLE book RENAME COLUMN title TO book_title;A do të dëshironit vërtet ta bënit këtë punë dy herë? Aspak. Thjesht regjistrojeni DDL-në, kalojeni përmes linjës së ndërtimit dhe merrni entitetin e përditësuar:
@Entity
@Table(name = "book", indexes = {
// A e keni menduar për këtë?
@Index(name = "i_book_title", columnList = "book_title")
})
class Book {
@Id
@GeneratedValue(strategy = IDENTITY)
int id;
@Column("book_title")
String bookTitle;
}Ose klasa e përmirësuar jOOQ. Shumica e ndryshimeve DDL gjithashtu reflektohen në semantikë, jo vetëm në sintaksë. Prandaj, ndonjëherë është e dobishme të shikoni në kodin e kompiluar se cili kod do të (ose mund të) preket nga rritja e bazës suaj të të dhënave.
E vërteta e vetme
PavarĂ«sisht nga teknologjia qĂ« pĂ«rdorni, gjithmonĂ« ka njĂ« model qĂ« Ă«shtĂ« burimi i vetĂ«m i vĂ«rtetĂ« i sĂ« vĂ«rtetĂ«s pĂ«r njĂ« nĂ«n-sistem â ose, tĂ« paktĂ«n, ne duhet tĂ« pĂ«rpiqemi pĂ«r kĂ«tĂ« dhe tĂ« shmangim atĂ« ndotjen sipĂ«rmarrĂ«se, ku "e vĂ«rteta" Ă«shtĂ« menjĂ«herĂ« kudo dhe askund. Gjithçka mund tĂ« jetĂ« shumĂ« mĂ« e thjeshtĂ«. NĂ«se thjesht shkĂ«mbeni skedarĂ« XML me ndonjĂ« sistem tjetĂ«r, thjesht pĂ«rdorni XSD. Shikoni metamodelin e INFORMATION_SCHEMA nga jOOQ nĂ« formatin XML:
- XSD është e lehtë për tu kuptuar
- XSD e ndan shumë mirë përmbajtjen XML dhe lejon validimin në të gjitha gjuhët e klientit
- XSD ka versionim të shkëlqyer dhe ka një përputhshmëri të zhvilluar me versionet e mëparshme
- XSD mund të testohet në kod Java duke përdorur XJC
Pika e fundit Ă«shtĂ« e rĂ«ndĂ«sishme. Kur komunikojmĂ« me njĂ« sistem tĂ« jashtĂ«m pĂ«rmes mesazheve XML, duam tĂ« jemi tĂ« sigurt pĂ«r vlefshmĂ«rinĂ« e mesazheve tona. Kjo Ă«shtĂ« shumĂ« e lehtĂ« tĂ« arrihet duke pĂ«rdorur JAXB, XJC dhe XSD. Do tĂ« ishte njĂ« marrĂ«zi tĂ« mendojmĂ« se, me qasjen e dizajnit "Java si prioritet", ku i bĂ«jmĂ« mesazhet tona nĂ« formĂ«n e objekteve Java, ato do tĂ« mund tĂ« shndĂ«rrohen nĂ« XML dhe tĂ« dĂ«rgohen pĂ«r konsum nĂ« njĂ« sistem tjetĂ«r. XML i gjeneruar nĂ« kĂ«tĂ« mĂ«nyrĂ« do tĂ« ishte me cilĂ«si tĂ« dobĂ«t, pa dokumentim, dhe e vĂ«shtirĂ« pĂ«r tâu zhvilluar. NĂ«se do tĂ« kishte njĂ« marrĂ«veshje pĂ«r nivelin e cilĂ«sisĂ« sĂ« shĂ«rbimit (SLA) pĂ«r kĂ«tĂ« ndĂ«rfaqe, do ta kishim sabotuar menjeherĂ«.
Sinqerisht, kjo Ă«shtĂ« gjithmonĂ« ajo qĂ« ndodh me API-tĂ« nĂ« JSON, por kjo Ă«shtĂ« njĂ« tjetĂ«r histori, herĂ«n tjetĂ«r do ta kritikojâŠ
Baza të dhënash: është e njëjta gjë
Duke punuar me baza tĂ« dhĂ«nash, kupton se tĂ« gjitha ato, nĂ« thelb, janĂ« tĂ« ngjashme. Baza zotĂ«ron tĂ« dhĂ«nat e saj dhe duhet tĂ« drejtojĂ« skemĂ«n. Ădo modifikim qĂ« bĂ«het nĂ« skemĂ« duhet tĂ« realizohet drejtpĂ«rdrejt nĂ« DDL, nĂ« mĂ«nyrĂ« qĂ« tĂ« pĂ«rditĂ«sohet burimi i vetĂ«m i sĂ« vĂ«rtetĂ«s.
Kur burimi Ă«shtĂ« pĂ«rditĂ«suar, tĂ« gjitha klientĂ«t gjithashtu duhet tĂ« pĂ«rditĂ«sojnĂ« kopjet e tyre tĂ« modelit. Disa klientĂ« mund tĂ« jenĂ« shkruajtur nĂ« Java duke pĂ«rdorur jOOQ dhe Hibernate ose JDBC (ose tĂ« gjitha njĂ«herazi). KlientĂ« tĂ« tjerĂ« mund tĂ« jenĂ« shkruar nĂ« Perl (tĂ« gjithĂ« vetĂ«m mund t'u urojmĂ« fat), tĂ« tjerĂ« â nĂ« C#. Nuk ka rĂ«ndĂ«si. Modeli kryesor ndodhet nĂ« bazĂ«n e tĂ« dhĂ«nave. Modelet e gjeneruara me ORM janĂ« zakonisht tĂ« dobĂ«ta, pa dokumentim tĂ« mirĂ«, dhe tĂ« vĂ«shtira pĂ«r t'u zhvilluar.
Prandaj, mos bĂ«ni gabime. Mos bĂ«ni gabime qĂ« nga fillimi. Punoni duke u bazuar nĂ« bazĂ«n e tĂ« dhĂ«nave. NdĂ«rtoni njĂ« pipeline deploye qĂ« mund tĂ« automatizohet. NĂ«fshini gjeneratorĂ«t e kodit nĂ« mĂ«nyrĂ« qĂ« tĂ« ishte e lehtĂ« tĂ« kopjonit modelin e bazĂ«s suaj tĂ« tĂ« dhĂ«nave dhe ta dĂ«rgoni atĂ« te klientĂ«t. Dhe ndaloni sĂ« shqetĂ«suari pĂ«r gjeneratorĂ«t e kodit. Ata janĂ« tĂ« mirĂ«. Me ta do tĂ« bĂ«heni mĂ« produktivĂ«. Duhet vetĂ«m tĂ« shpenzoni pak kohĂ« nĂ« fillim pĂ«r t'i konfiguruar ata â dhe mĂ« pas ju presin vite produktiviteti tĂ« rritur, nga tĂ« cilat do tĂ« krijohet historia e projektit tuaj.
Mos më falenderoni tani, më vonë.
Shpjegim
Për qartësi: Ky artikull nuk propagandon aspak që modeli i bazës suaj të dhënash duhet të imponojë gjithë sistemin (dmth., zonën e subjektit, logjikën e biznesit, etj.). Në këtë artikull po flas se kodi i klientit, që interakton me bazën e të dhënave, duhet të veprojë duke u nisur nga modeli i bazës së të dhënave, në mënyrë që në vetë të mos riprodhoj modelin e bazës së të dhënave në statusin e "klasës së parë". Një logjikë e tillë zakonisht ndodhet në nivelin e aksesit në të dhëna nga ana juaj në klient.
Në arkitekturat me dy nivele, që kanë mbetur ende ndonjëherë, një model i tillë sistemi mund të jetë i vetmi i mundshëm. Megjithatë, në shumicën e sistemeve niveli i aksesit në të dhëna më duket si një "nën sistem", që inkapsulon modelin e bazës së të dhënave.
Përjashtimet
Nga çdo rregull ka përjashtime, dhe kam thënë më parë se qasja me prioritet të bazës së të dhënave dhe gjenerimin e kodit mund të duket ndonjëherë e papërshtatshme. Ja disa përjashtime të tilla (me siguri do të ketë edhe të tjera):
- Kur skema Ă«shtĂ« e panjohur, dhe duhet hapur. PĂ«r shembull, jeni njĂ« ofrues mjeti, qĂ« ndihmon pĂ«rdoruesit tĂ« orientohen nĂ« çdo skemĂ«. Uf. KĂ«tu nuk ka gjenerim kodi. Por prapĂ«seprapĂ« â baza e tĂ« dhĂ«nave Ă«shtĂ« e para.
- Kur skema duhet të gjenerohet në flutur për të zgjidhur një detyrë të caktuar. Ky shembull duket si një version paksa i çuditshëm i modelit , dmth., në të vërtetë nuk keni një skemë të qartë të përcaktuar. Në këtë rast shpesh madje nuk është e sigurt se do t'ju përshtatet një RDBMS.
Përjashtimet për natyrën e tyre janë përjashtuese. Në shumicën e rasteve që lidhen me përdorimin e RDBMS, skema është e njohur paraprakisht, ajo ndodhet brenda RDBMS dhe është burimi i vetëm i "të vërtetës", dhe të gjithë klientët duhet të fitojnë kopje të saj, të nxjerra prej saj. Në mënyrë ideale, në këtë rast duhet përdorur një gjenerator kodi.
Burimi: habr.com
