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
Oo aan isla markiiba ka bilowno
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.
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
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
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
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
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" (
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.
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"
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
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
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'
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
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,
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
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