SQL, dè a dh'fhaodadh a bhith nas sìmplidh? Faodaidh gach fear againn iarrtas sìmplidh a sgrìobhadh - bidh sinn a’ sgrìobhadh tagh, dèan liosta de na colbhan a tha a dhìth, an uairsin bho, ainm bùird, cuid de shuidheachaidhean ann an far a bheil agus sin uile - tha dàta feumail nar pòcaid, agus (cha mhòr) ge bith dè an DBMS a tha fon chochall aig an àm sin (no is dòcha
Agus tòisichidh sinn ceart bho
Mapadh co-cheangailte ri cuspair
Bidh luchd-taic ORM gu traidiseanta a’ cur luach air astar agus furasta an leasachaidh, neo-eisimeileachd bhon DBMS agus còd glan. Airson mòran againn, an còd airson a bhith ag obair leis an stòr-dàta (agus gu tric an stòr-dàta fhèin)
mar as trice bidh e a’ coimhead rudeigin mar seo ...
@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;
}
...
Tha am modail crochte le notaichean snasail, agus an àiteigin air cùl na seallaidhean bidh ORM treun a’ gineadh agus a’ cur an gnìomh tonna de chòd SQL. Air an t-slighe, tha luchd-leasachaidh a 'dèanamh an dìcheall iad fhèin a sgaradh bhon stòr-dàta aca le cilemeatairean de tharraing, a tha a' comharrachadh cuid
Air taobh eile nam barricades, tha luchd-leantainn SQL “air an dèanamh le làimh” fìor-ghlan a’ toirt fa-near gu bheil comas aca an sùgh gu lèir a bhrùthadh a-mach às an DBMS aca gun a bhith a’ cuir a-steach sreathan agus tarraingean a bharrachd. Mar thoradh air an sin, tha pròiseactan “data-centric” a’ nochdadh, far a bheil daoine le trèanadh sònraichte an sàs anns an stòr-dàta (tha iad cuideachd nan “luchd-bunaiteach”, tha iad cuideachd nan “luchd-bunaiteach”, tha iad cuideachd nan “luchd-stèidheachaidh”, msaa), agus an luchd-leasachaidh. chan fheum ach na beachdan deiseil agus na modhan stòraidh a tharraing, gun a bhith a’ dol a-steach gu mion-fhiosrachadh.
Dè nam biodh a’ chuid as fheàrr den dà shaoghal againn? Mar a tha seo air a dhèanamh ann an inneal mìorbhaileach le ainm a tha a 'dearbhadh beatha
Is e cànan fionnar a th’ ann an Clojure airson DSLn a chruthachadh, ach is e DSL fionnar a th’ ann an SQL fhèin, agus chan eil feum againn air fear eile. Tha S-expressions sgoinneil, ach chan eil iad a 'cur dad ùr an seo. Mar thoradh air an sin, bidh sinn a 'faighinn cromagan air sgàth camagan. Chan eil thu ag aontachadh? An uairsin feitheamh ris a’ mhionaid nuair a thòisicheas an tarraing thairis air an stòr-dàta ag aoidion agus a thòisicheas tu a’ sabaid leis a’ ghnìomh (amh-sql)
Mar sin dè a bu chòir dhomh a dhèanamh? Fàgaidh sinn SQL mar SQL àbhaisteach - aon fhaidhle airson gach iarrtas:
-- name: users-by-country
select *
from users
where country_code = :country_code
... agus an uairsin leugh am faidhle seo, ga thionndadh gu bhith na ghnìomh Clojure àbhaisteach:
(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" ...} ...)
Le bhith a’ cumail ris a’ phrionnsapal “SQL leis fhèin, Clojure leis fhèin”, gheibh thu:
- Chan eil iongnadh syntactic ann. Chan eil an stòr-dàta agad (coltach ri gin eile) a’ gèilleadh 100% le inbhe SQL - ach chan eil seo gu diofar airson Yesql. Cha caith thu ùine gu bràth a’ sealg ghnìomhan le co-chòrdadh co-ionann ri SQL. Cha bhith agad ri tilleadh gu gnìomh gu bràth (raw-sql "cuid ('funky'::SYNTAX)")).
- Taic deasaiche as fheàrr. Tha deagh thaic SQL aig an neach-deasachaidh agad mu thràth. Le bhith a’ sàbhaladh SQL mar SQL faodaidh tu a chleachdadh.
- Co-fhreagarrachd sgioba. Faodaidh na DBAn agad an SQL a chleachdas tu sa phròiseact Clojure agad a leughadh agus a sgrìobhadh.
- Tuning coileanaidh nas fhasa. A bheil feum agad air plana a thogail airson ceist trioblaideach? Chan eil seo na dhuilgheadas nuair a tha do cheist SQL cunbhalach.
- Ag ath-chleachdadh cheistean. Slaod is leig às na h-aon fhaidhlichean SQL sin gu pròiseactan eile oir is e dìreach seann SQL a th’ ann - dìreach roinn e.
Na mo bheachd-sa, tha am beachd gu math fionnar agus aig an aon àm gu math sìmplidh, leis an do choisinn am pròiseact mòran
Manaidsearan IDE & DB
Feuch an tòisich sinn le obair làitheil shìmplidh. Gu math tric feumaidh sinn cuid de stuthan a lorg anns an stòr-dàta, mar eisimpleir, lorg clàr san sgeama agus sgrùdadh a dhèanamh air a structar (dè na colbhan, na h-iuchraichean, na clàran-amais, na cuingeadan, msaa). Agus bho IDE grafaigeach sam bith no beagan DB-manaidsear, an toiseach, tha sinn an dùil dìreach na comasan sin. Gus am bi e luath agus nach fheum thu feitheamh leth uair a thìde gus an tèid uinneag leis an fhiosrachadh riatanach a tharraing (gu sònraichte le ceangal slaodach ri stòr-dàta iomallach), agus aig an aon àm, tha am fiosrachadh a gheibhear ùr agus buntainneach, agus chan eil sgudal air a thasgadh. A bharrachd air an sin, mar as iom-fhillte agus as motha a tha an stòr-dàta agus mar as motha an àireamh dhiubh, is ann as duilghe a tha e seo a dhèanamh.
Ach mar as trice bidh mi a 'tilgeil an luchag air falbh agus dìreach a' sgrìobhadh còd. Canaidh sinn gum feum thu faighinn a-mach dè na clàran (agus dè na feartan) a tha anns an sgeama “HR”. Anns a’ mhòr-chuid de DBMSn, faodar an toradh a thathar ag iarraidh a choileanadh leis a’ cheist shìmplidh seo bho information_schema:
select table_name
, ...
from information_schema.tables
where schema = 'HR'
Bho stòr-dàta gu stòr-dàta, bidh susbaint nan clàran fiosrachaidh sin ag atharrachadh a rèir comasan gach DBMS. Agus, mar eisimpleir, airson MySQL, bhon aon leabhar fiosrachaidh gheibh thu paramadairean bùird a tha sònraichte don DBMS seo:
select table_name
, storage_engine -- Используемый "движок" ("MyISAM", "InnoDB" etc)
, row_format -- Формат строки ("Fixed", "Dynamic" etc)
, ...
from information_schema.tables
where schema = 'HR'
Chan eil eòlas aig Oracle air information_schema, ach tha
select table_name
, pct_free -- Минимум свободного места в блоке данных (%)
, pct_used -- Минимум используемого места в блоке данных (%)
, last_analyzed -- Дата последнего сбора статистики
, ...
from all_tables
where owner = 'HR'
Chan eil ClickHouse mar eisgeachd:
select name
, engine -- Используемый "движок" ("MergeTree", "Dictionary" etc)
, ...
from system.tables
where database = 'HR'
Faodar rudeigin coltach ris a dhèanamh ann an Cassandra (aig a bheil teaghlaichean colbh an àite bùird agus prìomh àiteachan an àite sgeamaichean):
select columnfamily_name
, compaction_strategy_class -- Стратегия сборки мусора
, gc_grace_seconds -- Время жизни мусора
, ...
from system.schema_columnfamilies
where keyspace_name = 'HR'
Airson a’ mhòr-chuid de stòran-dàta eile, faodaidh tu cuideachd ceistean coltach ris a thogail (tha eadhon aig Mongo
Gu dearbh, san dòigh seo gheibh thu fiosrachadh chan ann a-mhàin mu bhùird, ach mu rud sam bith san fharsaingeachd. Bho àm gu àm, bidh daoine coibhneil a’ roinn a leithid de chòd airson diofar stòran-dàta, mar, mar eisimpleir, anns an t-sreath de artaigilean habra “Gnìomhan airson stòran-dàta PostgreSQL a chlàradh” (
Mar thoradh air an sin, tha an dòigh seo air seòladh agus lorg nithean mòran nas sùbailte, a 'sàbhaladh mòran ùine, agus a' toirt cothrom dhut am fiosrachadh fhaighinn anns an fhoirm anns a bheil e riatanach a-nis (mar, mar eisimpleir, air a mhìneachadh anns an dreuchd
Obrachaidhean le nithean
Às deidh dhuinn na stuthan riatanach a lorg agus a sgrùdadh, tha an t-àm ann rudeigin feumail a dhèanamh leotha. Gu nàdarra, cuideachd gun a bhith a 'toirt do chorragan far a' mheur-chlàr.
Chan eil e na dhìomhaireachd gum bi dìreach cuir às do chlàr a’ coimhead an aon rud anns cha mhòr a h-uile stòr-dàta:
drop table hr.persons
Ach le cruthachadh a 'bhùird bidh e nas inntinniche. Faodaidh cha mhòr DBMS sam bith (a’ toirt a-steach mòran NoSQL) “clàr a chruthachadh” ann an aon chruth no ann an dòigh eile, agus bidh a’ phrìomh phàirt dheth eadhon beagan eadar-dhealaichte (ainm, liosta de cholbhan, seòrsaichean dàta), ach faodaidh mion-fhiosrachadh eile a bhith gu math eadar-dhealaichte agus an urra ris an inneal a-staigh agus comasan DBMS sònraichte. Is e an eisimpleir as fheàrr leam nach eil ann an sgrìobhainnean Oracle ach BNFn “rùisgte” airson co-chòrdadh “cruthaich clàr”
Cuideachd, tha na seòrsaichean sònraichte de stuthan aca fhèin aig mòran DBMS nach eil rim faighinn ann an DBMSan eile. A bharrachd air an sin, is urrainn dhuinn gnìomhachd a dhèanamh chan ann a-mhàin air stuthan stòr-dàta, ach cuideachd air an DBMS fhèin, mar eisimpleir, “marbhadh” pròiseas, saoradh cuid de chuimhne, lorg lorg, atharrachadh gu modh “leughaidh a-mhàin”, agus mòran a bharrachd.
A-nis leig leinn tarraing beagan
Is e aon de na gnìomhan as cumanta diagram a thogail le stuthan stòr-dàta agus na nithean agus na ceanglaichean eatorra fhaicinn ann an dealbh àlainn. Faodaidh cha mhòr IDE grafaigeach sam bith, goireasan “loidhne àithne” fa leth, innealan grafaigeach sònraichte agus modaireatairean seo a dhèanamh. Tarraingidh iad rudeigin dhut “mar as fheàrr as urrainn dhaibh,” agus faodaidh tu buaidh a thoirt air a ’phròiseas seo beagan a-mhàin le cuideachadh bho ghrunn pharaimearan anns an fhaidhle rèiteachaidh no na bogsaichean sgrùdaidh san eadar-aghaidh.
Ach faodar an duilgheadas seo fhuasgladh mòran nas sìmplidh, nas sùbailte agus nas eireachdail, agus gu dearbh le cuideachadh bho chòd. Gus diagraman de iom-fhillteachd sam bith a chruthachadh, tha grunn chànanan comharrachaidh sònraichte againn (DOT, GraphML msaa), agus dhaibh sgapadh iomlan de thagraidhean (GraphViz, PlantUML, Mermaid) as urrainn an stiùireadh sin a leughadh agus an sealladh ann an grunn chruthan . Uill, tha fios againn mu thràth mar a gheibh sinn fiosrachadh mu nithean agus na ceanglaichean eatorra.
Seo eisimpleir bheag de cò ris a dh’ fhaodadh seo a bhith coltach, a’ cleachdadh PlantUML agus
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'
Agus ma dh'fheuchas tu beagan, an uairsin stèidhichte air
Tha ceist SQL beagan nas iom-fhillte
-- Шапка
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'
Ma sheallas tu gu dlùth, fon chochall bidh mòran innealan seallaidh cuideachd a’ cleachdadh cheistean coltach ris. Fìor, mar as trice tha na h-iarrtasan sin domhainn
Metrics agus sgrùdadh
Gluaisidh sinn air adhart gu cuspair a tha gu traidiseanta iom-fhillte - sgrùdadh coileanadh stòr-dàta. Tha cuimhne agam sgeulachd bheag fhìor a dh’ innseadh dhomh le “fear de mo charaidean.” Air pròiseact eile bha DBA cumhachdach sònraichte a 'fuireach, agus cha robh mòran den luchd-leasachaidh eòlach air gu pearsanta, no a chunnaic iad a-riamh e gu pearsanta (a dh' aindeoin sin, a rèir fathannan, bha e ag obair an àiteigin san ath thogalach). Aig uair “X”, nuair a thòisich siostam sgaoilidh neach-reic mòr “a’ faireachdainn dona ”a-rithist, chuir e gu sàmhach dealbhan-sgrìn de ghrafaichean bho Mhanaidsear Iomairt Oracle, air an do chomharraich e gu faiceallach àiteachan èiginneach le comharra dearg airson“ tuigse ”( seo, airson a chuir gu socair, cha do chuidich e mòran). Agus stèidhichte air a’ “chairt dhealbhan” seo bha agam ri làimhseachadh. Aig an aon àm, cha robh cothrom aig duine air a’ Mhanaidsear Iomairt prìseil (anns an dà chiall den fhacal), oir tha an siostam iom-fhillte agus daor, gu h-obann “tha an luchd-leasachaidh a’ tuiteam air rudeigin agus a ’briseadh a h-uile càil.” Mar sin, lorg an luchd-leasachaidh “gu empirigeach” suidheachadh agus adhbhar nam breicichean agus leig iad a-mach bad. Mura ruigeadh an litir bagarrach bhon DBA a-rithist a dh’ aithghearr, bhiodh a h-uile duine a’ gabhail osna faochadh agus a’ tilleadh gu na gnìomhan gnàthach aca (gu ruige an Litir ùr).
Ach faodaidh am pròiseas sgrùdaidh coimhead nas spòrsail agus nas càirdeile, agus nas cudromaiche, ruigsinneach agus follaiseach don h-uile duine. Co-dhiù a phàirt bunaiteach, a bharrachd air na prìomh shiostaman sgrùdaidh (a tha gu cinnteach feumail agus ann an iomadh cùis nach gabh atharrachadh). Tha DBMS sam bith gu saor agus gu tur an-asgaidh airson fiosrachadh a cho-roinn mun staid agus an coileanadh làithreach aige. Anns an aon “fuilteach” Oracle DB, gheibhear cha mhòr fiosrachadh sam bith mu choileanadh bho sheallaidhean siostam, bho phròiseasan agus sheiseanan gu staid an tasgadan bufair (mar eisimpleir,
Mar sin, le armachd de sheòrsa air choreigin de neach-cruinneachaidh meatrach (Telegraf, Metricbeat, Collectd) as urrainn ceistean sql àbhaisteach a dhèanamh, stòradh de na meatrach sin (InfluxDB, Elasticsearch, Timescaledb) agus inneal-lèirsinn (Grafana, Kibana), gheibh thu gu math furasta agus siostam sgrùdaidh sùbailte a bhios gu dlùth fhilleadh a-steach le meatrach eile air feadh an t-siostaim (air fhaighinn, mar eisimpleir, bho fhrithealaiche an tagraidh, bhon OS, msaa). Mar, mar eisimpleir, tha seo air a dhèanamh ann am pgwatch2, a bhios a’ cleachdadh measgachadh InfluxDB + Grafana agus seata de cheistean mu bheachdan siostam, a gheibhear cuideachd
Iomlan
Agus chan eil an seo ach liosta tuairmseach de na ghabhas dèanamh leis an stòr-dàta againn a’ cleachdadh còd SQL cunbhalach. Tha mi cinnteach gum faigh thu tòrr a bharrachd chleachdaidhean, sgrìobh anns na beachdan. Agus bruidhnidh sinn mu mar (agus nas cudromaiche carson) seo uile a dhèanamh fèin-ghluasadach agus a thoirt a-steach don loidhne-phìoban CI / CD agad an ath thuras.
Source: www.habr.com