Eòlas air “Stòr-dàta mar Chòd”.

Eòlas air “Stòr-dàta mar Chòd”.

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 chan e DBMS idir). Mar thoradh air an sin, faodar beachdachadh air a bhith ag obair le cha mhòr stòr dàta sam bith (càirdeach agus chan ann mar sin) bho shealladh còd àbhaisteach (leis a h-uile rud a tha e a ’ciallachadh - smachd dreach, ath-sgrùdadh còd, mion-sgrùdadh statach, autotests, agus sin uile). Agus tha seo a 'buntainn chan ann a-mhàin ris an dàta fhèin, sgeamaichean agus imrich, ach san fharsaingeachd ri beatha iomlan an stòraidh. Anns an aiste seo bidh sinn a 'bruidhinn mu dheidhinn gnìomhan làitheil agus duilgheadasan a bhith ag obair le diofar stòran-dàta fo lionsa "stòr-dàta mar chòd".

Agus tòisichidh sinn ceart bho ORM. Chaidh mothachadh a-rithist air a’ chiad bhatail den t-seòrsa “SQL vs ORM”. ro-Petrine Rus'.

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 "SQL fuath".

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 Seadh. Bheir mi loidhne no dhà bhon bhun-bheachd choitcheann anns an eadar-theangachadh an-asgaidh agam, agus gheibh thu eòlas nas mionaidiche air an seo.

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 luchd-leanmhuinn ann an caochladh chànanan. Agus feuchaidh sinn an uairsin ri feallsanachd coltach ris a chuir an sàs ann a bhith a’ sgaradh còd SQL bho gach nì eile fada nas fhaide na an ORM.

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 Oracle meata-dàta, agus cha èirich trioblaidean mòra :

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 cruinneachadh siostam sònraichte, anns a bheil fiosrachadh mu gach cruinneachadh san t-siostam).

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” (Ayb, bin, lùth-chleas). Gu dearbh, tha e na thoileachas dhomh a bhith a’ cumail a’ bheinn seo de cheistean nam cheann agus an-còmhnaidh gan sgrìobhadh, agus mar sin anns an IDE / neach-deasachaidh as fheàrr leam tha seata de chriomagan ullaichte agam airson ceistean a thathas a’ cleachdadh gu tric, agus chan eil air fhàgail ach an sgrìobhadh. ainmean nithean a-steach don teamplaid.

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 “A’ cur a-mach dàta bho stòr-dàta ann an cruth sam bith: dè as urrainn dha IDEan a dhèanamh air àrd-ùrlar IntelliJ").

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” 31 duilleag a ghabhail. Tha comasan nas lugha aig DBMSan eile, ach tha mòran fheartan inntinneach agus sònraichte aig gach fear dhiubh airson bùird a chruthachadh (sgaoileadh, MySQL, coileach-dubh, cassandra). Chan eil e coltach gum bi “draoidh” grafaigeach sam bith bho IDE eile (gu sònraichte fear uile-choitcheann) comasach air na comasan sin uile a chòmhdach, agus eadhon ged as urrainn dha, cha bhith e na shealladh don chridhe lag. Aig an aon àm, aithris sgrìobhte ceart agus ùineail cruthaich clàr leigidh sin leat iad uile a chleachdadh gu furasta, stòradh agus ruigsinneachd don dàta agad a dhèanamh earbsach, as fheàrr agus cho comhfhurtail sa ghabhas.

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 stòr-dàta demo airson PostgreSQL (air an taobh chlì tha ceist SQL a ghineas an stiùireadh riatanach airson PlantUML, agus air an làimh dheis tha an toradh):

Eòlas air “Stòr-dàta mar Chòd”.

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 Teamplaid ER airson PlantUML gheibh thu rudeigin glè choltach ri fìor diagram ER:

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'

Eòlas air “Stòr-dàta mar Chòd”.

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 “hardwired” a-steach do chòd an tagraidh fhèin agus tha iad duilich a thuigsinn, gun luaidh air atharrachadh sam bith orra.

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, Sgriobtaichean DBA, earrann "Sùileachadh"). Tha dòrlach de sheallaidhean siostam aig Postgresql cuideachd airson sgrùdadh stòr-dàta, gu sònraichte an fheadhainn a tha riatanach ann am beatha làitheil DBA sam bith, leithid pg_stat_gnìomh, pg_stat_stòr-dàta, pg_stat_b sgrìobhadair. Tha eadhon sgeama air leth aig MySQL airson seo. taisbeanadh_sgeama. A Ann am Mongo air a thogail a-steach pròifil a’ cruinneachadh dàta coileanaidh ann an cruinneachadh siostam siostam.profile.

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 cuir ceistean gnàthaichte ris.

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

Cuir beachd ann