"Database as Code" Experience

"Database as Code" Experience

SQL, inona no mety ho tsotra kokoa? Ny tsirairay amintsika dia afaka manoratra fangatahana tsotra - mitendry mifidy, tanisao ireo tsanganana ilaina, avy eo avy amin'ny, anarana latabatra, fepetra sasany ao izay ary izay ihany - angona mahasoa ao am-paosintsika, ary (saika) na inona na inona DBMS eo ambanin'ny saron-tava tamin'izany fotoana izany (na angamba tsy DBMS mihitsy). Vokatr'izany, ny fiaraha-miasa amin'ny loharano angon-drakitra rehetra (mifandray fa tsy izany) dia azo raisina amin'ny fomba fijerin'ny kaody mahazatra (miaraka amin'izay rehetra ambarany - fanaraha-maso ny dikan-teny, famerenana ny code, famakafakana static, autotest, ary izay ihany). Ary izany dia tsy mihatra amin'ny angon-drakitra, skema ary fifindra-monina ihany, fa amin'ny ankapobeny amin'ny androm-piainan'ny fitahirizana. Ato amin'ity lahatsoratra ity dia hiresaka momba ny asa isan'andro sy ny olana amin'ny fiaraha-miasa amin'ny angon-drakitra isan-karazany eo ambanin'ny family "database as code".

Ary andeha isika hanomboka avy hatrany ORM. Ny ady voalohany amin'ny karazana "SQL vs ORM" dia tsikaritra indray talohan'ny Petrine Rus'.

Sarintany mifandraika amin'ny zavatra

Ny mpanohana ORM dia manome lanja ny hafainganam-pandeha sy ny fanamorana ny fampandrosoana, ny fahaleovan-tena amin'ny DBMS ary ny kaody madio. Ho an'ny maro amintsika, ny kaody miasa amin'ny angon-drakitra (ary matetika ny angon-drakitra mihitsy)

mazΓ na dia toa izao...

@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;
    }
  ...

Ny maodely dia mihantona miaraka amin'ny fanoritsoritana marani-tsaina, ary any ambadiky ny sehatra misy ORM mahery fo mamokatra sy manatanteraka kaody SQL maromaro. Raha ny tokony ho izy, ny mpamorona dia miezaka ny manasaraka ny tenany amin'ny tahiry misy azy miaraka amin'ny abstractions kilometatra, izay manondro ny sasany. "fankahalana SQL".

Amin'ny lafiny ilany amin'ny sakana, ireo mpanaraka ny SQL madio "vita tanana" dia manamarika ny fahafahana manindry ny ranom-boankazo rehetra amin'ny DBMS tsy misy sosona fanampiny sy abstractions. Vokatr'izany dia miseho ny tetikasa "data-centric", izay misy olona voaofana manokana ao anatin'ny tahiry ("basicists" ihany koa izy ireo, "basicists" koa izy ireo, "basdeners" koa izy ireo, sns.), ary ny developers. Tsy maintsy "misintona" fotsiny ny fomba fijery efa vita sy ny fomba voatahiry, nefa tsy miditra amin'ny antsipiriany.

Ahoana raha manana ny tsara indrindra amin'ny tontolo roa isika? Ahoana no anaovana izany amin'ny fitaovana mahafinaritra misy anarana manamafy ny fiainana Yesql. Hanome andalana roa avy amin'ny foto-kevitra ankapobeny aho amin'ny fandikan-teny maimaim-poana, ary azonao atao ny mahafantatra azy amin'ny antsipiriany bebe kokoa eto.

Clojure dia fiteny mahafinaritra amin'ny famoronana DSL, fa ny SQL mihitsy dia DSL mangatsiatsiaka, ary tsy mila iray hafa isika. Tsara ny S-expression, saingy tsy manampy zava-baovao eto. Vokatr'izany dia mahazo bracket izahay ho an'ny brackets. Tsy manaiky? Avy eo andraso ny fotoana izay manomboka mitete ny abstraction amin'ny angon-drakitra ary manomboka miady amin'ny fiasa ianao (raw-sql)

Inona Γ ry no tokony hataoko? Andao hamela SQL ho SQL mahazatra - rakitra iray isaky ny fangatahana:

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

... ary vakio ity rakitra ity, ary avadiho ho fiasa Clojure mahazatra:

(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" ...} ...)

Amin'ny fanarahana ny fitsipika "SQL irery, Clojure irery" dia mahazo:

  • Tsy misy surprise syntactic. Ny angon-drakitrao (tahaka ny hafa) dia tsy mifanaraka amin'ny fenitra SQL 100% - fa tsy maninona ho an'ny Yesql izany. Tsy handany fotoana hihazana asa miaraka amin'ny syntax mitovy amin'ny SQL ianao. Tsy voatery hiverina amina asa iray na oviana na oviana ianao (raw-sql "sasany ('funky'::SYNTAX)")).
  • Fanohanana tonian-dahatsoratra tsara indrindra. Efa manana fanohanana SQL tena tsara ny mpanonta anao. Amin'ny fitahirizana SQL ho SQL dia azonao ampiasaina fotsiny izany.
  • Fifanarahana ekipa. Ny DBA-nao dia afaka mamaky sy manoratra ny SQL ampiasainao amin'ny tetikasa Clojure-nao.
  • Fampitaovana mora kokoa. Mila manangana drafitra ho an'ny fanontaniana misy olana? Tsy olana izany raha SQL mahazatra ny fangatahanao.
  • Fampiasana fanontaniana indray. Tariho ary ampidino any amin'ny tetikasa hafa ireo rakitra SQL ireo satria SQL taloha tsotra izany - zarao fotsiny.

Raha ny hevitro dia tena mangatsiatsiaka ilay hevitra ary tena tsotra ihany koa, noho ny nahazoan'ny tetikasa maro MPANARA-DIA AZY amin'ny fiteny samihafa. Ary hiezaka ny hampihatra filozofia mitovy amin'izany isika amin'ny fanavahana ny kaody SQL amin'ny zavatra hafa rehetra lavitra ny ORM.

Mpitantana IDE & DB

Andeha isika hanomboka amin'ny asa tsotra isan'andro. Matetika isika dia tsy maintsy mikaroka zavatra sasany ao amin'ny tahiry, ohatra, mitady latabatra ao amin'ny schema ary mandinika ny firafiny (izay tsanganana, fanalahidy, index, teritery, sns.) Ary avy amin'ny IDE grafika na mpitantana DB kely, voalohany indrindra, manantena ireo fahaiza-manao ireo izahay. Mba ho haingana ary tsy mila miandry antsasak'adiny ianao mandra-pisintonana varavarankely misy fampahalalana ilaina (indrindra amin'ny fifandraisana miadana amin'ny angon-drakitra lavitra), ary miaraka amin'izay koa, vaovao sy manan-danja ny vaovao voaray, ary tsy cache cache. Ambonin'izany, arakaraka ny saro-pady sy lehibe kokoa ny angon-drakitra ary ny hamaroan'izy ireo no sarotra kokoa ny manao izany.

Saingy matetika aho manipy ny totozy ary manoratra code fotsiny. Andeha hatao hoe mila fantarinao hoe inona ny latabatra (sy ny fananana) voarakitra ao amin'ny tetika "HR". Amin'ny ankamaroan'ny DBMS, ny vokatra tadiavina dia azo tratrarina amin'ny fangatahana tsotra avy amin'ny information_schema:

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

Miankina amin'ny fahaizan'ny DBMS tsirairay ny votoatin'ny tabilao reference toy izany. Ary, ohatra, ho an'ny MySQL, avy amin'ny boky reference ihany ianao dia afaka mahazo paramètres latabatra manokana amin'ity DBMS ity:

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

Oracle dia tsy mahalala information_schema, fa manana Oracle metadataary tsy misy olana lehibe miseho:

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

ClickHouse dia tsy maningana:

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

Misy zavatra mitovitovy amin'izany azo atao ao Cassandra (izay manana columnfamilies fa tsy latabatra sy toerana fanalahidy fa tsy schemas):

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

Ho an'ny ankamaroan'ny angon-drakitra hafa, azonao atao koa ny mametraka fanontaniana mitovy amin'izany (na i Mongo aza dia manana fanangonana rafitra manokana, izay misy fampahalalana momba ny fanangonana rehetra ao amin'ny rafitra).

Mazava ho azy, amin'izany fomba izany dia afaka mahazo vaovao tsy momba ny latabatra ihany, fa momba ny zavatra rehetra amin'ny ankapobeny. Indraindray, ny olona tsara fanahy dia mizara kaody toy izany ho an'ny tahiry samihafa, toy ny, ohatra, ao amin'ny andian-dahatsoratra habra "Functions for documentation PostgreSQL databases" (Ayb, Ben, Gym). Mazava ho azy fa mahafinaritra tokoa ny mitazona an'ity tendrombohitra feno fanontaniana ity ao an-dohako sy manoratra azy ireo tsy tapaka, ka ao amin'ny IDE/editor ankafiziko dia manana sombin-tsarimihetsika efa nomanina ho an'ny fanontaniana ampiasaina matetika aho, ary ny hany sisa tavela dia ny manoratra ny anarana zavatra ao amin'ny mΓ΄dely.

Vokatr'izany, ity fomba fitetezana sy fitadiavana zavatra ity dia mora kokoa, mitahiry fotoana be dia be, ary ahafahanao mahazo ny fampahalalana marina amin'ny endrika ilana azy ankehitriny (toy ny voalaza ao amin'ny lahatsoratra. "Manondrana angona avy amin'ny angona amin'ny endrika rehetra: inona no azon'ny IDE atao amin'ny sehatra IntelliJ").

Hetsika miaraka amin'ny zavatra

Rehefa avy nahita sy nandinika ireo zavatra ilaina isika, fotoana izao hanaovana zavatra mahasoa amin'izy ireo. Mazava ho azy, tsy manala ny rantsan-tananao amin'ny fitendry.

Tsy tsiambaratelo fa ny famafana latabatra fotsiny dia hitovy amin'ny saika ny angon-drakitra rehetra:

drop table hr.persons

Saingy miaraka amin'ny famoronana ny latabatra dia lasa mahaliana kokoa. Saika ny DBMS rehetra (anisan'izany ny NoSQL maro) dia afaka "mamorona latabatra" amin'ny endrika iray na hafa, ary ny ampahany lehibe amin'izany dia tsy mitovy mihitsy aza (anarana, lisitry ny tsanganana, karazana data), fa ny antsipiriany hafa dia mety tsy hitovy tanteraka ary miankina amin'ny fitaovana anatiny sy ny fahaizan'ny DBMS manokana. Ny ohatra tiako indrindra dia ny ao amin'ny tahirin-kevitra Oracle dia tsy misy afa-tsy BNFs "miboridana" ho an'ny syntax "mamorona latabatra". misy pejy 31. Ny DBMS hafa dia manana fahaiza-manao maotina kokoa, saingy ny tsirairay amin'izy ireo dia manana endri-javatra mahaliana sy miavaka maro amin'ny famoronana latabatra (postgres, MySQL, kalalao, Cassandra). Tsy azo inoana fa misy "ombiasy" an-tsary avy amin'ny IDE hafa (indrindra fa ny iray manerantany) dia ho afaka handrakotra tanteraka ireo fahaiza-manao rehetra ireo, ary na dia azo atao aza izany, dia tsy ho fampisehoana ho an'ny reraka. Mandritra izany fotoana izany, fanambarana an-tsoratra marina sy ara-potoana mamorona latabatra dia ahafahanao mampiasa azy rehetra mora foana, manao fitahirizana sy fidirana amin'ny angonao azo antoka, tsara indrindra ary mahazo aina araka izay azo atao.

Ary koa, maro ny DBMS manana karazana zavatra manokana izay tsy hita ao amin'ny DBMS hafa. Ankoatr'izay, afaka manao hetsika tsy amin'ny zavatra database ihany isika, fa amin'ny DBMS ihany koa, ohatra, "mamono" dingana iray, manafaka faritra fitadidiana sasany, mamela ny tracing, mifamadika amin'ny fomba "vakiana fotsiny", sy ny maro hafa.

Andeha isika hanao sary kely

Ny iray amin'ireo asa mahazatra indrindra dia ny manangana kisary miaraka amin'ireo zavatra angon-drakitra ary mijery ireo zavatra sy fifandraisana misy eo amin'izy ireo amin'ny sary mahafinaritra. Saika ny IDE grafika rehetra, ny fitaovana "command line" misaraka, ny fitaovana ara-tsary manokana ary ny modely dia afaka manao izany. Hisintona zavatra ho anao izy ireo "araka izay vitany", ary azonao atao ny mitaona kely an'io dingana io amin'ny fanampian'ny mari-pamantarana vitsivitsy ao amin'ny fisie fanamafisana na boaty fisavana ao amin'ny interface.

Saingy ity olana ity dia azo voavaha tsotra kokoa, mora kokoa ary kanto, ary mazava ho azy miaraka amin'ny fanampian'ny code. Mba hamoronana kisary misy fahasarotana rehetra dia manana fiteny marika manokana maromaro izahay (DOT, GraphML sns), ary ho azy ireo ny fanaparitahana fampiharana (GraphViz, PlantUML, Mermaid) izay afaka mamaky toromarika toy izany ary mijery azy ireo amin'ny endrika isan-karazany. . Eny ary, efa fantatsika ny fomba hahazoana vaovao momba ny zavatra sy ny fifandraisana eo amin'izy ireo.

Ity misy ohatra kely momba ny mety ho endriky izany, amin'ny fampiasana PlantUML sy angon-drakitra demo ho an'ny PostgreSQL (eo ankavia dia misy fangatahana SQL izay hamokatra ny torolΓ lana ilaina amin'ny PlantUML, ary eo ankavanana ny valiny):

"Database as Code" Experience

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'

Ary raha miezaka kely ianao, dia mifototra amin'ny Modely ER ho an'ny PlantUML afaka mahazo zavatra mitovy amin'ny diagrama ER tena izy ianao:

Ny fangatahana SQL dia somary sarotra kokoa

-- Π¨Π°ΠΏΠΊΠ°
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" Experience

Raha mijery akaiky ianao, eo ambanin'ny saron-tava maro dia mampiasa fanontaniana mitovy ihany koa. Marina fa matetika ireo fangatahana ireo dia lalina "voarindra" ao amin'ny kaody an'ny fampiharana mihitsy ary sarotra takarina, tsy lazaina intsony ny fanovana azy ireo.

Metrika sy fanaraha-maso

Andao hiroso amin'ny lohahevitra mahazatra mahazatra - fanaraha-maso ny fahombiazan'ny database. Tsaroako ny tantara marina kely iray notantarain’ny β€œiray amin’ireo namako” tamiko. Ao amin'ny tetikasa iray hafa dia nisy DBA matanjaka iray, ary vitsy amin'ireo mpamorona no nahalala azy manokana, na efa nahita azy manokana (na dia eo aza ny zava-misy fa, araka ny tsaho, dia niasa tany amin'ny trano manaraka izy). Tamin'ny ora "X", rehefa nanomboka "malahelo" indray ny rafitry ny poduction an'ny mpivarotra lehibe iray, dia nandefa sary mangina avy amin'ny Oracle Enterprise Manager izy, izay nanasongadinany tamim-pitandremana ireo toerana mitsikera misy marika mena ho an'ny "fahatakarana" ( ity, raha lazaina amin'ny fomba malefaka, dia tsy nanampy betsaka). Ary mifototra amin'ity "karatra sary" ity dia tsy maintsy nokarakaraiko. Nandritra izany fotoana izany, tsy nisy olona afaka niditra tao amin'ny saro-bidy (amin'ny heviny roa amin'ny teny) Enterprise Manager, satria saro-takarina sy lafo ilay rafitra, tampoka dia β€œtafintohina amin’ny zavatra iray ny mpamorona ka mandrava ny zava-drehetra”. Noho izany, ny mpamorona "empirically" nahita ny toerana sy ny antony ny freins ary namoaka patch. Raha tsy tonga ato ho ato ny taratasy fandrahonana avy amin'ny DBA, dia hifoka rivotra ny rehetra ary hiverina amin'ny asany ankehitriny (mandra-pahatongan'ny Taratasy vaovao).

Saingy ny fizotran'ny fanaraha-maso dia mety ho mahafinaritra sy sariaka kokoa, ary ny tena zava-dehibe dia azo idirana sy mangarahara ho an'ny rehetra. Farafaharatsiny ny ampahany fototra, ho fanampin'ny rafitra fanaraha-maso lehibe (izay azo antoka fa ilaina ary amin'ny tranga maro tsy azo soloina). Ny DBMS rehetra dia maimaim-poana sy maimaim-poana tanteraka mba hizarana vaovao momba ny toetrany sy ny zava-bitany ankehitriny. Ao amin'io Oracle DB io ihany, saika ny fampahalalana rehetra momba ny zava-bita dia azo avy amin'ny fomba fijerin'ny rafitra, manomboka amin'ny dingana sy fotoam-pivoriana mankany amin'ny toetry ny cache buffer (ohatra, DBA Scripts, fizarana "Monitoring"). Postgresql koa dia manana fomba fijery rafitra iray manontolo fanaraha-maso ny angon-drakitra, indrindra ireo izay tena ilaina amin'ny fiainana andavanandron'ny DBA rehetra, toy ny pg_stat_activity, pg_stat_database, pg_stat_bgwriter. Ny MySQL aza dia manana schema misaraka amin'izany. performance_schema. A In Mongo naorina-in profiler manangona angon-drakitra momba ny zava-bita ho fanangonana rafitra system.profile.

Noho izany, mitam-piadiana miaraka amin'ny karazana mpanangona metrika (Telegraf, Metricbeat, Collectd) izay afaka manao fangatahana sql mahazatra, fitahirizana ireo metrika ireo (InfluxDB, Elasticsearch, Timescaledb) ary visualizer (Grafana, Kibana), dia afaka mahazo mora foana ianao. ary rafitra fanaraha-maso mora vidy izay hifanerasera akaiky amin'ny metrika hafa manerana ny rafitra (azo, ohatra, avy amin'ny lohamilina fampiharana, avy amin'ny OS, sns.). Ohatra, izany dia atao amin'ny pgwatch2, izay mampiasa ny fitambaran'ny InfluxDB + Grafana sy ny andiam-panontaniana momba ny fomba fijerin'ny rafitra, izay azo idirana ihany koa. ampio fanontaniana manokana.

Π˜Ρ‚ΠΎΠ³ΠΎ

Ary lisitra eo ho eo amin'ny zavatra azo atao amin'ny angon-drakitray mampiasa kaody SQL mahazatra ihany ity. Azoko antoka fa afaka mahita fampiasana maro hafa ianao, manorata ao amin'ny fanehoan-kevitra. Ary hiresaka momba ny fomba (ary ny tena zava-dehibe indrindra) izahay mba hanamafisana izany rehetra izany ary hampiditra izany ao amin'ny fantsona CI/CD anao amin'ny manaraka.

Source: www.habr.com

Mividiana fampiantranoana azo antoka ho an'ny tranokala misy fiarovana DDoS, mpizara VPS VDS πŸ”₯ Mividiana fampiantranoana tranonkala azo antoka miaraka amin'ny fiarovana DDoS, mpizara VPS VDS | ProHoster