"Database as Code" Khibrad

"Database as Code" Khibrad

SQL, maxaa ka fududaan kara? Mid kasta oo naga mid ah wuxuu qori karaa codsi fudud - waan ku qornaa dooro, tax tiirarka loo baahan yahay, ka dib ka, magaca miiska, xaaladaha qaarkood ee halkaas oo taasina waa intaas oo dhan - xogta waxtarka leh waxay ku jirtaa jeebkeena, iyo (ku dhawaad) iyada oo aan loo eegin DBMS ay ku hoos jirto daboolka wakhtigaas (ama laga yaabee ma aha DBMS gabi ahaanba). Natiijo ahaan, la shaqeynta ku dhawaad ​​​​ilo kasta oo xog ah (xiriir iyo sidaas maaha) waxaa loo tixgelin karaa marka laga eego aragtida koodka caadiga ah (wax kasta oo ay tilmaamayaan - xakamaynta nooca, dib u eegista code, falanqaynta static, autotests, iyo taasi waa intaas). Oo tani ma khusayso oo keliya xogta lafteeda, schemas iyo guuritaanka, laakiin guud ahaan nolosha oo dhan ee kaydinta. Maqaalkani waxa aanu ka hadli doonaa hawlaha maalinlaha ah iyo dhibaatooyinka la shaqaynta xogta kala duwan ee lens ee "database as code".

Oo aan isla markiiba ka bilowno ORM. Dagaalladii ugu horreeyay ee nooca "SQL vs ORM" ayaa dib loo ogaaday Pre-Petrine Rus.

Maabaynta shayga-xidhiidhka

Taageereyaasha ORM dhaqan ahaan waxay qiimeeyaan xawaaraha iyo fududaynta horumarka, madax-bannaanida DBMS iyo kood nadiif ah. Qaar badan oo naga mid ah, koodka la shaqaynta xogta (iyo badiyaa xogta lafteeda)

inta badan waxay u egtahay wax sidan oo kale ah...

@Entity
@Table(name = "stock", catalog = "maindb", uniqueConstraints = {
        @UniqueConstraint(columnNames = "STOCK_NAME"),
        @UniqueConstraint(columnNames = "STOCK_CODE") })
public class Stock implements java.io.Serializable {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "STOCK_ID", unique = true, nullable = false)
    public Integer getStockId() {
        return this.stockId;
    }
  ...

Qaabka waxa lagu laadlaadsan yahay sharraxaadyo xariif ah, oo meel daaha gadaashiisa ah ORM geesi ah ayaa soo saarta oo fuliya tiro kood ah oo SQL ah. Jid ahaan, horumariyayaashu waxay isku dayayaan intii karaankooda ah inay ka go'doomiyaan xogtooda iyagoo wata kiilo mitir oo muuqaal ah, taas oo tilmaamaysa qaar. "SQL nacaybka".

Dhinaca kale ee xayndaabyada, raacayaasha SQL saafiga ah ee "gacma-samaynta" waxay xusaan awoodda ay ku tuujiyaan dhammaan casiirka DBMS iyaga oo aan lahayn lakabyo iyo waxyaabo kale oo dheeraad ah. Natiijo ahaan, mashaariicda "data-centric" ayaa soo muuqda, halkaas oo dad si gaar ah u tababaran ay ku lug leeyihiin xogta (waxay sidoo kale yihiin "basicists", waxay sidoo kale yihiin "basicists", waxay sidoo kale yihiin "basdeners", iwm.), iyo horumarinta. kaliya waa inaad "jiid" kuwa diyaarsan ee aragtiyaha iyo habraacyada la kaydiyay, adigoon tafaasiil gelin.

Ka waran haddii aan haysano waxa ugu fiican labada adduun? Sida tan lagu sameeyo qalab cajiib ah oo leh magac nolosha xaqiijinaya Yesql. Waxaan ku siin doonaa dhowr sadar oo ka mid ah fikradda guud tarjumaaddayda bilaashka ah, waxaadna si faahfaahsan ula baran kartaa halkan.

Clojure waa luuqad qabow oo loogu talagalay abuurista DSLs, laakiin SQL lafteedu waa DSL qabow, uma baahnid mid kale. S-muujinta waa wax fiican, laakiin halkan kuma soo kordhinayaan wax cusub. Natiijo ahaan, waxaan helnaa dhejisyo aawadood dartood. Ma ogola? Ka dib sug daqiiqadda marka nuxurka xogta ee xogta ay bilaabato inay soo baxdo oo aad bilowdo inaad la dagaallanto shaqada (raw-sql)

Haddaba maxaan sameeyaa? Aan uga tagno SQL sida SQL caadiga ah - hal fayl codsi kasta:

-- name: users-by-country
select *
  from users
 where country_code = :country_code

... ka dibna akhri faylkan, adigoo u rogaya hawl Clojure joogto ah:

(defqueries "some/where/users_by_country.sql"
   {:connection db-spec})

;;; A function with the name `users-by-country` has been created.
;;; Let's use it:
(users-by-country {:country_code "GB"})
;=> ({:name "Kris" :country_code "GB" ...} ...)

Markaad u hoggaansanto "SQL lafteeda, Clojure lafteeda" mabda'a, waxaad helaysaa:

  • Ma jiro wax la yaab leh. Xogtaada (sida kuwa kale) 100% ma waafaqsana heerka SQL - laakiin tani dhib kuma laha Yesql. Weligaa wakhti kama lumin doontid ugaarsiga hawlaha SQL ee u dhigma. Weligaa uma baahnid inaad ku soo noqoto hawlqabad (raw-sql "qaar ('funky':: SYNTAX)")).
  • Taageerada tifaftiraha ugu fiican. Tafatirahaagu wuxuu horey u haystay taageerada SQL ee heer sare ah. Markaad u kaydiso SQL SQL ahaan waxaad si fudud u isticmaali kartaa.
  • waafaqsanaanta kooxda. DBA-yadaadu way akhriyi karaan oo qori karaan SQL-ga aad ku isticmaasho mashruucaaga Clojure.
  • Hagaajinta waxqabadka fudud. Ma u baahan tahay inaad u dhisto qorshe su'aal dhib leh? Tani dhib ma aha marka weydiintaadu tahay SQL joogto ah.
  • Dib u adeegsiga su'aalaha Jiid oo ku rid isla faylalka SQL-ga mashruucyo kale sababtoo ah waa SQL duug ah - kaliya la wadaag.

Fikradayda, fikradda waa mid aad u fiican isla markaana isla markaaba aad u fudud, taas oo ay ugu mahadcelinayaan mashruucu kasbaday dad badan kuwa raacsan luqado kala duwan. Oo waxaan marka xigta isku dayi doonaa in aan dabaqo falsafad la mid ah oo ka sooca SQL code wax kasta oo kale oo ka fog ORM ah.

IDE & maamulayaasha DB

Aan ku bilowno hawl maalmeed fudud. Badanaa waa inaan ka raadinaa shayyada qaarkood ee kaydka, tusaale ahaan, hel miis shaxda oo aan barano qaab-dhismeedkiisa (waxa loo isticmaalo tiirarka, furayaasha, tusmooyinka, xaddidaadaha, iwm.). Iyo IDE kasta oo garaaf ahaan ah ama maamule DB-yar, marka hore, waxaanu filaynaa sida saxda ah awoodahaas. Si ay u dhakhso badan tahay oo aadan u baahnayn inaad sugto nus saac ilaa laga soo saaro daaqad leh macluumaadka lagama maarmaanka ah (gaar ahaan xiriir gaabis ah oo ku saabsan kaydka fog), isla markaana, macluumaadka la helay waa mid cusub oo khuseeya. oo aan la kaydin qashinka. Waxaa intaa dheer, inta badan oo kakan oo ka weyn database iyo tirada badan oo iyaga ka mid ah, aad u adag tahay in tan la sameeyo.

Laakiin sida caadiga ah waxaan tuuraa jiirka oo kaliya qor kood. Aynu nidhaahno waxaad u baahan tahay inaad ogaato jaantusyada (iyo kuwa guryaha leh) ee ku jira qorshaha "HR". Inta badan DBMS-yada, natiijada la rabo waxaa lagu gaari karaa weydiintan fudud ee information_schema:

select table_name
     , ...
  from information_schema.tables
 where schema = 'HR'

Laga soo bilaabo xog-ururinta ilaa xog-ururinta, waxa ku jira jaantusyada tixraacu way kala duwan yihiin iyadoo ku xidhan awoodaha DBMS kasta. Iyo, tusaale ahaan, MySQL, isla buugga tixraaca waxaad ka heli kartaa cabbirro miis oo gaar ah DBMS-kan:

select table_name
     , storage_engine -- Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ "Π΄Π²ΠΈΠΆΠΎΠΊ" ("MyISAM", "InnoDB" etc)
     , row_format     -- Π€ΠΎΡ€ΠΌΠ°Ρ‚ строки ("Fixed", "Dynamic" etc)
     , ...
  from information_schema.tables
 where schema = 'HR'

Oracle ma yaqaan macluumaadka_schema, laakiin wuu hayaa Xogta badan ee Oracle, mana jiraan dhibaato weyn:

select table_name
     , pct_free       -- ΠœΠΈΠ½ΠΈΠΌΡƒΠΌ свободного мСста Π² Π±Π»ΠΎΠΊΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… (%)
     , pct_used       -- ΠœΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ мСста Π² Π±Π»ΠΎΠΊΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… (%)
     , last_analyzed  -- Π”Π°Ρ‚Π° послСднСго сбора статистики
     , ...
  from all_tables
 where owner = 'HR'

ClickHouse ma aha mid ka reeban:

select name
     , engine -- Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ "Π΄Π²ΠΈΠΆΠΎΠΊ" ("MergeTree", "Dictionary" etc)
     , ...
  from system.tables
 where database = 'HR'

Wax la mid ah ayaa lagu samayn karaa Cassandra (kaaso leh qoysas tiirar ah halkii ay ka ahaan lahaayeen miisaska iyo meelaha furaha ah ee aan ahayn schemas):

select columnfamily_name
     , compaction_strategy_class  -- БтратСгия сборки мусора
     , gc_grace_seconds           -- ВрСмя ΠΆΠΈΠ·Π½ΠΈ мусора
     , ...
  from system.schema_columnfamilies
 where keyspace_name = 'HR'

Inta badan xog-ururinta kale, waxa kale oo aad la iman kartaa su'aalo la mid ah (xitaa Mongo ayaa leh ururinta nidaamka gaarka ah, kaas oo ka kooban macluumaadka ku saabsan dhammaan ururinta nidaamka).

Dabcan, habkan waxaad ku heli kartaa macluumaadka ma aha oo kaliya miisaska, laakiin ku saabsan shay kasta guud ahaan. Waqti ka waqti, dadka naxariista leh waxay wadaagaan koodka caynkaas ah ee xog ururin kala duwan, sida, tusaale ahaan, taxanaha maqaallada habra "Functions for documentsing PostgreSQL databases" (Ayuub, Ben, Jirdhiska). Dabcan, in aan buurtan su'aalaha ah madaxayga ku hayo oo aan si joogto ah u qoro waa wax lagu farxo, sidaa awgeed IDE/tifaftiraha aan jeclahay waxa aan haystaa qaybo hore loo sii diyaariyay oo su'aalo ah oo la isticmaalo, waxa hadhayna waa in aan ku qorno magacyada shayga galay template.

Natiijo ahaan, habkan socodka iyo raadinta walxaha waa mid aad u dabacsan, waqti badan ayuu badbaadiyaa, wuxuuna kuu ogolaanayaa inaad si sax ah u hesho macluumaadka qaabka ay hadda lagama maarmaanka u tahay (sida, tusaale ahaan, lagu sharaxay boostada. "Dhoofinta xogta xogta qaab kasta: maxay IDE-yadu ku samayn karaan goobta IntelliJ").

Hawlgallada walxaha

Ka dib markii aan helnay oo aan baranay walxaha lagama maarmaanka ah, waa waqtigii la samayn lahaa wax faa'iido leh iyaga. Dabiici ahaan, sidoo kale adigoon farahaaga ka bixin kiiboodhka.

Wax qarsoodi ah maahan in si fudud u tirtirida miis ay isku si ugu ekaan doonaan ku dhawaad ​​dhammaan xogta macluumaadka:

drop table hr.persons

Laakiin abuurista miiska waxay noqotaa mid aad u xiiso badan. Ku dhawaad ​​DBMS kasta (oo ay ku jiraan NoSQL badan) waxay "abuuri karaan miis" hal qaab ama mid kale, qaybta ugu muhiimsan ee ka mid ah waxay xitaa ka duwanaan doontaa wax yar (magaca, liiska tiirarka, noocyada xogta), laakiin faahfaahinta kale waxay u kala duwanaan karaan si weyn waxayna ku xiran tahay qalabka gudaha iyo awoodaha DBMS gaar ah. Tusaalaha aan jeclahay ayaa ah in dukumeentiyada Oracle ay jiraan kaliya "qaawan" BNFs oo loogu talagalay "miiska abuur" qabsato 31 bog. DBMS-yada kale waxay leeyihiin awoodo dhexdhexaad ah, laakiin mid kasta oo iyaga ka mid ah sidoo kale wuxuu leeyahay astaamo badan oo xiiso leh oo gaar ah oo loogu talagalay abuurista miisaska (postgres, MySQL, baranbaro, cassandra). Uma badna in "saaxir" garaaf ah oo ka socda IDE kale (gaar ahaan mid caalami ah) uu awood u yeelan doono inuu si buuxda u daboolo dhammaan awoodahaas, iyo xitaa haddii ay awooddo, ma noqon doonto muraayad loogu talagalay kuwa qalbi jaban. Isla markaana, bayaan qoran oo sax ah oo ku habboon miis abuur waxay kuu ogolaan doontaa inaad si fudud u isticmaasho dhamaantood, ka dhigto kaydinta iyo helitaanka xogtaada mid la isku halleyn karo, ugu fiican iyo sida ugu macquulsan.

Sidoo kale, DBMS-yo badan ayaa leh noocyo gaar ah oo shay ah oo aan laga helin DBMS-yada kale. Waxaa intaa dheer, waxaan samayn karnaa hawlgallada ma aha oo kaliya walxaha xogta, laakiin sidoo kale DBMS lafteeda, tusaale ahaan, "dilaan" habka, xoraynta aagga xusuusta, awood raadinta, u beddel habka "akhri oo keliya", iyo wax ka badan.

Hadda aan wax yar sawirno

Mid ka mid ah hawlaha ugu caansan waa in la dhiso jaantus leh walxaha keydka xogta iyo in la arko walxaha iyo isku xirka dhexdooda sawir qurux badan. Ku dhawaad ​​IDE kasta oo garaaf ahaan ah, agabka "khadka amarka" ee goonida ah, aaladaha garaafyada gaarka ah iyo moodeellayaasha ayaa tan samayn kara. Waxay kuu sawiri doonaan wax "sida ugu wanaagsan ee ay awoodaan," waxaadna saameyn kartaa habkan wax yar oo kaliya adigoo kaashanaya dhowr cabbir oo ku jira faylka qaabeynta ama sanduuqyada hubinta ee interface.

Laakiin dhibaatadan waxaa lagu xallin karaa mid aad u fudud, dabacsanaan iyo xarrago leh, iyo dabcan iyadoo la kaashanayo code. Si loo abuuro jaantusyo kakanaanta kasta, waxaan leenahay dhowr luqadood oo khaas ah (DOT, GraphML iwm), iyo iyaga oo dhan codsiyada kala firdhiso (GraphViz, PlantUML, Mermaid) kuwaas oo akhrin kara tilmaamahan oo u sawiri kara qaabab kala duwan . Hagaag, waxaan horay u ognahay sida loo helo macluumaadka ku saabsan walxaha iyo isku xirka dhexdooda.

Halkan waxaa ah tusaale yar oo ah waxa ay tani u ekaan karto, iyadoo la isticmaalayo PlantUML iyo Xogta demo ee PostgreSQL (dhinaca bidix waa su'aal SQL ah oo dhalin doonta tilmaamaha loo baahan yahay ee PlantUML, dhanka midigna waa natiijada):

"Database as Code" Khibrad

select '@startuml'||chr(10)||'hide methods'||chr(10)||'hide stereotypes' union all
select distinct ccu.table_name || ' --|> ' ||
       tc.table_name as val
  from table_constraints as tc
  join key_column_usage as kcu
    on tc.constraint_name = kcu.constraint_name
  join constraint_column_usage as ccu
    on ccu.constraint_name = tc.constraint_name
 where tc.constraint_type = 'FOREIGN KEY'
   and tc.table_name ~ '.*' union all
select '@enduml'

Oo haddii aad isku daydo wax yar, ka dibna ku salaysan Qaabka ER ee PlantUML waxaad heli kartaa wax aad ugu eg jaantuska dhabta ah ee ER:

Weydiinta SQL way ka sii dhib badan tahay

-- Π¨Π°ΠΏΠΊΠ°
select '@startuml
        !define Table(name,desc) class name as "desc" << (T,#FFAAAA) >>
        !define primary_key(x) <b>x</b>
        !define unique(x) <color:green>x</color>
        !define not_null(x) <u>x</u>
        hide methods
        hide stereotypes'
 union all
-- Π’Π°Π±Π»ΠΈΡ†Ρ‹
select format('Table(%s, "%s n information about %s") {'||chr(10), table_name, table_name, table_name) ||
       (select string_agg(column_name || ' ' || upper(udt_name), chr(10))
          from information_schema.columns
         where table_schema = 'public'
           and table_name = t.table_name) || chr(10) || '}'
  from information_schema.tables t
 where table_schema = 'public'
 union all
-- Бвязи ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ
select distinct ccu.table_name || ' "1" --> "0..N" ' || tc.table_name || format(' : "A %s may haven many %s"', ccu.table_name, tc.table_name)
  from information_schema.table_constraints as tc
  join information_schema.key_column_usage as kcu on tc.constraint_name = kcu.constraint_name
  join information_schema.constraint_column_usage as ccu on ccu.constraint_name = tc.constraint_name
 where tc.constraint_type = 'FOREIGN KEY'
   and ccu.constraint_schema = 'public'
   and tc.table_name ~ '.*'
 union all
-- Подвал
select '@enduml'

"Database as Code" Khibrad

Haddii aad si dhow u eegto, daboolka hoostiisa qalabyo badan oo muuqaal ah ayaa sidoo kale isticmaala weydiimo la mid ah. Run, codsiyadani badanaa waa kuwo qoto dheer "Haddadwired" galay code ee codsiga laftiisa oo ay adag tahay in la fahmo, ma aha in la xuso wax ka beddelid iyaga.

Metrics iyo la socodka

Aan u gudubno mowduuc dhaqameed kakan - database performance monitoring. Waxaan xasuustaa sheeko yar oo run ah oo uu iiga sheekeeyay β€œmid ka mid ah asxaabtayda”. Mashruuc kale waxaa ku noolaa DBA gaar ah oo awood leh, qaar yar oo ka mid ah horumariyayaashuna waxay yaqaaneen shakhsi ahaan, ama waligood ma arkin shakhsi ahaan (in kasta oo xaqiiqda ah, sida laga soo xigtay xanta, wuxuu ka shaqeeyay meel dhismaha soo socda) . Saacaddii "X", markii nidaamka qulqulka ee tafaariiqda weyn uu bilaabay inuu "dareemo xun" mar kale, wuxuu aamusnaan u soo diray sawirro garaafyo ah Maamulaha Ganacsiga Oracle, kaas oo uu si taxadar leh u muujiyay meelo muhiim ah oo leh calaamad cas oo loogu talagalay "fahamka" ( tani, si tartiib ah, wax badan ma caawin). Oo ku saleysan "kaarka sawirka" waa inaan daaweeyaa. Isla mar ahaantaana, qofna ma helin qiimaha qaaliga ah (labadaba macnaha ereyga) Maamulaha Ganacsiga, sababtoo ah Nidaamku waa mid adag oo qaali ah, si lama filaan ah " horumariyayaashu wax bay ku turunturoodaan oo wax walba jebiyaan." Sidaa darteed, horumariyayaashu "si macquul ah" waxay heleen goobta iyo sababta biriiga waxayna sii daayeen balastar. Haddii warqadda khatarta ah ee ka timid DBA aysan mar kale iman mustaqbalka dhow, markaa qof kastaa wuu neefsan doonaa oo ku noqon lahaa hawlihii ay hadda qabteen (ilaa warqadda cusub).

Laakiin habka kormeerku wuxuu u ekaan karaa madadaalo iyo saaxiibtinimo, iyo tan ugu muhiimsan, mid la heli karo oo daah-furan qof walba. Ugu yaraan qaybteeda aasaasiga ah, iyada oo lagu daro nidaamyada kormeerka ugu muhiimsan (kuwaas oo hubaal ah faa'iido leh iyo xaalado badan oo aan la bedeli karin). DBMS kasta waa bilaash oo gabi ahaanba waa lacag la'aan si loo wadaago macluumaadka ku saabsan xaaladdeeda iyo waxqabadkeeda hadda. Isla "Dhiigi" Oracle DB, ku dhawaad ​​macluumaad kasta oo ku saabsan waxqabadka ayaa laga heli karaa aragtida nidaamka, oo u dhaxaysa hababka iyo fadhiyada ilaa xaaladda kaydka kaydka (tusaale, Qoraallada DBA, qaybta "Monitoring"). Postgresql sidoo kale waxay leedahay farabadan oo aragtiyo nidaam ah oo dhan la socodka xogta xogta, gaar ahaan kuwa aan looga maarmin nolol maalmeedka DBA kasta, sida pg_stat_firfircooni, pg_stat_database, pg_stat_bgwriter. MySQL xitaa waxay leedahay qorshe gooni ah tan. waxqabadka_schema. A In Mongo lagu dhex dhisay profiler wuxuu isu geeyaa xogta waxqabadka ururinta nidaamka nidaamka.profile.

Markaa, hubaysan oo wata nooc ka mid ah mitirka uruuriyaha (Telegraf, Metricbeat, Collectd) oo fulin kara su'aalaha sql, kaydinta cabbiradan (InfluxDB, Elasticsearch, Timescaledb) iyo sawir qaade (Grafana, Kibana), waxaad heli kartaa si fudud oo fudud iyo nidaam la socodka dabacsan oo si dhow ula midoobi doona cabbirada kale ee nidaamka ballaaran (laga helay, tusaale ahaan, server-ka codsiga, OS, iwm.). Sida, tusaale ahaan, tan waxaa lagu sameeyaa pgwatch2, kaas oo adeegsada isku darka InfluxDB + Grafana iyo su'aalo la xidhiidha aragtida nidaamka, kaas oo sidoo kale la geli karo ku dar su'aalo caado ah.

Wadarta

Oo kani waa kaliya liis qiyaas ah oo ah waxa lagu samayn karo xog-ururinteena iyadoo la adeegsanayo koodka SQL ee caadiga ah. Waxaan hubaa inaad ka heli karto adeegsi badan, faallooyinka ku qor. Oo waxaan ka hadli doonaa sida (iyo tan ugu muhiimsan sababta) si otomaatig ah loogu sameeyo waxaas oo dhan oo lagu daro dhuumaha CI / CD-gaaga marka xigta.

Source: www.habr.com

Add a comment