"Patengi Raraunga hei Waehere" Wheako

"Patengi Raraunga hei Waehere" Wheako

SQL, he aha te mea ngawari ake? Ka taea e ia o taatau te tuhi i tetahi tono ngawari - ka pato taatau tīpako, whakarārangihia ngā tīwae e hiahiatia ana, kātahi i, ingoa tepu, etahi tikanga i roto te wahi katahi ano - ko nga raraunga whaihua kei roto i ta maatau pute, a (tata) ahakoa ko wai te DBMS kei raro i te awhi i tera wa (mehemea pea ehara rawa i te DBMS). Ko te mutunga, ko te mahi me te tata ki nga puna raraunga (he hononga me te kore pera) ka taea te whakaaro mai i te tirohanga o te waehere noa (me nga mea katoa e kii ana - te mana putanga, te arotake waehere, te tātaritanga pateko, nga whakamatautau aunoa, me te mea katoa). A ko tenei e pa ana ki nga raraunga ake, nga kaupapa me nga heke, engari mo te katoa o te oranga o te rokiroki. I roto i tenei tuhinga ka korero tatou mo nga mahi o ia ra me nga raruraru o te mahi me nga momo papaaarangi i raro i te arotahi o te "papa raraunga hei waehere".

A kia timata tika mai ORM. Ko nga pakanga tuatahi o te momo "SQL vs ORM" i kitea ano ki roto mua-Petrine Rus'.

Mahere ahanoa-hononga

Ko nga kaitautoko ORM e whakanui ana i te tere me te ngawari o te whakawhanaketanga, te motuhake mai i te DBMS me te waehere ma. Mo te nuinga o tatou, ko te waehere mo te mahi me te papaaarangi (me te nuinga o te waa ko te papaaarangi ake)

he penei te ahua...

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

Kei te whakairihia te tauira me nga korero mohio, a, kei muri i nga whakaaturanga he ORM maia te whakaputa me te mahi i etahi taranata o etahi waehere SQL. Ma te ara, kei te ngana nga kaiwhakawhanake ki te wehe i a raatau mai i o raatau papaa raraunga me nga kiromita o te tangohanga, e tohu ana etahi "SQL kino".

I tera taha o nga parepare, ko nga kaiwhaiwhai o te SQL "hangaia-a-ringa" ka kite i te kaha ki te kohi i nga wai katoa mai i a raatau DBMS kaore he taapiri me nga tangohanga. Ko te mutunga mai, ka puta mai nga kaupapa "raraunga-raunga", kei reira nga tangata kua whakangungua motuhake ki roto i te paataka raraunga (he "tangata" ano ratou, he "tangata" ano, he "basdeners", me etahi atu), me nga kaihanga. me "toia" nga tirohanga kua rite me nga tikanga rongoa, me te kore e uru ki nga korero.

He aha mehemea kei a tatou te pai o nga ao e rua? Me pehea te mahi i roto i tetahi taputapu whakamiharo me te ingoa whakapumau i te ora Aeql. Ka hoatu e ahau etahi rarangi e rua mai i te ariā whanui i roto i taku whakamaoritanga kore utu, a ka taea e koe te mohio atu ki nga korero konei.

He reo hauhautanga a Clojure mo te hanga DSL, engari ko te SQL ake he DSL hauhautanga, kaore e hiahiatia tetahi atu. He rawe nga korero-S, engari karekau he taapiri hou ki konei. Ko te mutunga, ka whiwhi tatou i nga taiapa mo te pai o nga taiapa. Kaore koe e whakaae? Na ka tatari mo te wa ka timata te tangohanga i runga i te paataka korero ka timata koe ki te whawhai me te mahi (raw-sql)

Na me aha ahau? Waiho a SQL hei SQL auau - kotahi te konae mo ia tono:

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

... ka panui i tenei konae, ka huri hei mahi Clojure auau:

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

Ma te piri ki te kaupapa "SQL anake, Clojure ano" ka whiwhi koe:

  • No ohorere syntactic. Ko to papaunga raraunga (penei i etahi atu) kaore i te 100% e tika ana ki te paerewa SQL - engari kaore he take mo Yesql. E kore koe e moumou taima ki te hopu mo nga mahi me te syntax rite SQL. E kore koe e hoki ki te mahi (raw-sql "etahi('funky'::SYNTAX)")).
  • tautoko ētita pai. He tino pai te tautoko SQL o to kaiwhakatika. Ma te tiaki i te SQL hei SQL ka taea e koe te whakamahi noa.
  • Te hototahi a te roopu. Ka taea e o DBA te panui me te tuhi i te SQL e whakamahia ana e koe i roto i to kaupapa Clojure.
  • He ngawari ake te mahi whakatikatika. Me hanga mahere mo te patai raruraru? Ehara tenei i te raruraru ina he SQL auau to patai.
  • Te whakamahi ano i nga patai. Tōia me te tuku i aua konae SQL ki etahi atu kaupapa na te mea he SQL tawhito noa - tohatoha noa.

Ki taku whakaaro, he tino hauhautanga te whakaaro, i te wa ano he tino ngawari, na te mea he maha nga whiwhinga o te kaupapa kaiwhaiwhai i roto i nga momo reo. A ka ngana taatau ki te whakamahi i tetahi kaupapa rite mo te wehe i te waehere SQL mai i nga mea katoa kei tua atu i te ORM.

Kaiwhakahaere IDE & DB

Me timata ma te mahi ngawari o ia ra. I te nuinga o nga wa me rapu tatou i etahi mea kei roto i te paataka raraunga, hei tauira, kimihia he ripanga i roto i te aronuinga me te ako i tona hanganga (he aha nga pou, nga taviri, nga taurangi, nga here, me etahi atu e whakamahia ana). A, mai i tetahi IDE whakairoiro, he kaiwhakahaere-DB iti ranei, ko te tuatahi, e tumanako ana matou ki enei kaha. Kia tere ai, kaore koe e tatari mo te hawhe haora kia tae mai ra ano he matapihi me nga korero e tika ana (ina koa me te hononga puhoi ki te papaaarangi mamao), me te wa ano, he hou, he tika hoki nga korero kua tae mai, me te kore keteroki paraurehe. I tua atu, ka nui ake te uaua me te nui o te papaa raraunga me te nui ake o te maha o ratou, ka uaua ake te mahi i tenei.

Engari i te nuinga o te wa ka makahia e ahau te kiore ka tuhi noa i te waehere. Me kii me rapu koe he aha nga ripanga (me nga taonga) kei roto i te kaupapa "HR". I te nuinga o nga DBMS, ka taea te whakatutuki i te hua e hiahiatia ana ma tenei patai ngawari mai i te information_schema:

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

Mai i te patengi raraunga ki te patengi raraunga, he rereke nga ihirangi o aua ripanga tohutoro i runga i nga kaha o ia DBMS. A, hei tauira, mo MySQL, mai i te pukapuka tohutoro ano ka taea e koe te tiki i nga tawhā ripanga mo tenei DBMS:

select table_name
     , storage_engine -- Используемый "движок" ("MyISAM", "InnoDB" etc)
     , row_format     -- Формат строки ("Fixed", "Dynamic" etc)
     , ...
  from information_schema.tables
 where schema = 'HR'

Kaore a Oracle e mohio ki nga korero_schema, engari kei a ia Oracle metadata, a karekau he raruraru nui e ara ake:

select table_name
     , pct_free       -- Минимум свободного места в блоке данных (%)
     , pct_used       -- Минимум используемого места в блоке данных (%)
     , last_analyzed  -- Дата последнего сбора статистики
     , ...
  from all_tables
 where owner = 'HR'

Ko ClickHouse he mea rereke:

select name
     , engine -- Используемый "движок" ("MergeTree", "Dictionary" etc)
     , ...
  from system.tables
 where database = 'HR'

Ka taea te mahi penei i Cassandra (he columnfamilies hei utu mo nga ripanga me nga mokowākohi hei utu mo nga aronuinga):

select columnfamily_name
     , compaction_strategy_class  -- Стратегия сборки мусора
     , gc_grace_seconds           -- Время жизни мусора
     , ...
  from system.schema_columnfamilies
 where keyspace_name = 'HR'

Mo te nuinga atu o nga papaa raraunga, ka taea ano e koe te whakaputa mai i nga patai penei (ara Mongo kohinga punaha motuhake, kei roto nga korero mo nga kohinga katoa o te punaha).

Ko te tikanga, ma tenei ka taea e koe te tiki korero mo nga tepu anake, engari mo nga mea katoa. Mai i tera wa ki tera wa, ka tohatoha nga tangata atawhai i taua waehere mo nga papaa raraunga rereke, penei, hei tauira, i roto i te raupapa o nga tuhinga habra "Nga Mahi mo te tuhi i nga papaarangi PostgreSQL" (Ayb, Ko Ben, omaoma). Ae ra, ko te pupuri i tenei maunga katoa o nga patai i roto i toku mahunga me te tuhi tonu i a raatau he mea tino pai, no reira i roto i taku IDE/etita tino pai kei a au he huinga mokamoka kua oti te whakarite mo nga patai e whakamahia ana, heoi ko te toenga ko te pato i te ingoa ahanoa ki te tauira.

Ko te mutunga, ko tenei tikanga mo te whakatere me te rapu taonga he tino ngawari, he nui te penapena o te waa, ka taea e koe te tiki i nga korero i roto i te ahua e tika ana inaianei (penei, hei tauira, kua whakaahuahia i roto i te pou. "Kei te kaweake i nga raraunga mai i te patengi raraunga i roto i nga ahuatanga katoa: he aha nga mahi a nga IDE i runga i te papaaho IntelliJ").

Nga mahi me nga taonga

I muri i to maatau kitenga me te ako i nga mea e tika ana, kua tae ki te wa ki te mahi i tetahi mea whai hua ki a raatau. Ko te tikanga, me te kore e tangohia o maihao mai i te papapātuhi.

Ehara i te mea ngaro ko te whakakore noa i te ripanga ka rite te ahua i roto i nga papaa raraunga katoa:

drop table hr.persons

Engari na te hanganga o te tepu ka pai ake. Tata ki nga DBMS (tae atu ki te maha o NoSQL) ka taea te "hanga tepu" i tetahi ahua, i tetahi atu ahua, a ko te waahanga matua ka rereke noa (ingoa, rarangi o nga pou, momo raraunga), engari ko etahi atu korero ka rereke te rereke me te whakawhirinaki ki te taputapu o roto me nga kaha o te DBMS motuhake. Ko taku tauira tino pai kei roto i nga tuhinga Oracle he "tahanga" BNF anake mo te "hanga tepu" wetereo noho 31 wharangi. Ko etahi atu DBMS he iti ake te kaha, engari he maha ano nga ahuatanga whakamere, ahurei hoki mo te hanga ripanga (Tuhinga, mysql, paahau, kahahana). Kaore pea ka taea e tetahi "ruānuku" whakairoiro mai i tetahi atu IDE (ina koa te ao katoa) ki te kapi katoa i enei kaha, a ahakoa ka taea, e kore e waiho hei tirohanga ma te ngakau ngoikore. I te wa ano, he korero tuhi tika me te wa tika hanga tepu ka taea e koe te whakamahi i enei mea katoa, kia pai te rokiroki me te uru atu ki o raraunga kia pono, kia pai, kia pai hoki.

Ano, he maha nga DBMS kei a raatau ake momo momo taonga kaore i te waatea i etahi atu DBMS. I tua atu, ka taea e tatou te mahi i nga mahi kaore i runga i nga taonga papaaarangi, engari i runga ano i te DBMS ano, hei tauira, "whakamatea" he tukanga, ka wewete i etahi waahi mahara, ka taea te rapu, te huri ki te aratau "panui anake", me te maha atu.

Inaianei me tuhi iti

Ko tetahi o nga mahi tino noa ko te hanga hoahoa me nga taonga papaa raraunga me te kite i nga taonga me nga hononga i waenga i a raatau i roto i tetahi pikitia ataahua. Tata ki nga IDE kauwhata, nga taputapu "raina whakahau" motuhake, nga taputapu whakairoiro motuhake me nga tauira ka taea tenei. Ka tuhia e ratou tetahi mea mo koe "i nga mea e taea ana e ratou," ka taea e koe te awe i tenei tukanga he iti noa ma te awhina o etahi tawhā i roto i te konae whirihoranga, pouakataki ranei i te atanga.

Engari ka taea te whakatau i tenei raru he maamaa ake, he maamaa me te huatau, me te tikanga me te awhina o te waehere. Hei hanga hoahoa o nga mea uaua, he maha nga reo tohu motuhake (DOT, GraphML me etahi atu), a ma ratou he marara katoa o nga tono (GraphViz, PlantUML, Mermaid) ka taea te panui i aua tohutohu me te tiro ki roto i nga momo whakatakotoranga. . Ana, kua mohio tatou ki te tiki korero mo nga taonga me nga hononga i waenga i a raatau.

Anei tetahi tauira iti o te ahua o tenei, ma te whakamahi PlantUML me pātengi raraunga demo mō PostgreSQL (kei te taha maui he patai SQL ka puta nga tohutohu e hiahiatia ana mo PlantUML, kei te taha matau ko te hua):

"Patengi Raraunga hei Waehere" Wheako

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'

A, ki te tamata koe i te iti, ka i runga i tauira ER mo PlantUML ka taea e koe te tiki tetahi mea tino rite ki te hoahoa ER tūturu:

He uaua ake te patai SQL

-- Шапка
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'

"Patengi Raraunga hei Waehere" Wheako

Mena ka ata titiro koe, he maha nga taputapu whakaata e whakamahi ana i nga patai rite. Pono, he hohonu rawa enei tono "kua mau" ki te waehere o te tono ake, he uaua ki te mohio, kaua e whakahua i nga whakarereketanga o ratou.

Te ine me te aroturuki

Me neke tatou ki tetahi kaupapa matatini o mua - database performance monitoring. Te haamana‘o nei au i te hoê aamu mau na‘ina‘i tei faati‘ahia ia‘u e « te hoê o to‘u mau hoa ». I tetahi atu kaupapa i noho tetahi DBA kaha, a he torutoru nga kaihanga i mohio ki a ia, i kite ranei ia ia (ahakoa te meka, e ai ki nga korero, i mahi ia i tetahi waahi i te whare e whai ake nei). I te haora "X", i te wa i timata ano te "pouri" o te punaha o te kaihokohoko nui, ka tukuna marie e ia nga whakaahua o nga kauwhata mai i Oracle Enterprise Manager, i tohuhia e ia nga waahi whakahirahira me te tohu whero mo te "maramatanga" ( tenei, ki te ngawari, kaore i tino awhina). A i runga i tenei "kaari whakaahua" me atawhai ahau. I te wa ano, kaore he tangata i uru ki te utu nui (i roto i nga tikanga e rua o te kupu) Kaiwhakahaere Enterprise, no te mea He uaua, he utu nui te punaha, ohorere "ka tutuki nga kaihanga ki tetahi mea ka pakaru nga mea katoa." Na reira, i kitea e nga kaiwhakawhanake "empirically" te waahi me te take o nga pakaru, ka tukuna he papaki. Ki te kore e tae mai ano te reta whakatuma mai i te DBA i nga wa e heke mai nei, katahi ka aue te katoa, ka hoki ano ki a raatau mahi o naianei (tae noa ki te Reta hou).

Engari ko te mahi aroturuki ka taea te ahua ngahau me te hoahoa, me te mea nui, he waatea me te marama mo te katoa. Ko tana waahanga taketake, hei taapiri atu ki nga punaha aroturuki matua (he tino whai hua me te maha o nga keehi kaore e taea te whakakapi). Ko nga DBMS he kore utu me te kore utu ki te tiri korero mo tona ahuatanga me ona mahinga o naianei. I roto i taua "toto" Oracle DB, tata ki nga korero mo te mahi ka taea te tiki mai i nga tirohanga a te punaha, mai i nga tukanga me nga waahi ki te ahua o te keteroki buffer (hei tauira, Nga Tuhituhi DBA, wāhanga "Aroturuki"). Kei a Postgresql hoki te tini o nga tirohanga punaha mo aroturuki pātengi raraunga, ina koa ko nga mea tino nui i roto i te oranga o ia ra o tetahi DBA, penei pg_stat_activity, pg_stat_database, pg_stat_bgwriter. He kaupapa motuhake ano a MySQL mo tenei. hanga_mahi. A In Mongo i hangaia kaikōrero ka whakahiato i nga raraunga mahi ki te kohinga punaha pūnaha.kōtaha.

No reira, ka mau ki etahi momo kaikohi inenga (Telegraf, Metricbeat, Collectd) ka taea te mahi i nga paatai ​​sql ritenga, he rokiroki o enei inenga (InfluxDB, Elasticsearch, Timescaledb) me te kaitirotiro (Grafana, Kibana), ka taea e koe te tino ngawari. me te punaha aro turuki ngawari ka honoa ki etahi atu inenga-whanui (i whiwhi, hei tauira, mai i te tūmau tono, mai i te OS, me etahi atu). Hei tauira, ka mahia tenei i roto i te pgwatch2, e whakamahi ana i te InfluxDB + Grafana huinga me te huinga o nga patai ki nga tirohanga punaha, ka taea hoki te uru atu. tāpirihia ngā pātai ritenga.

Te tapeke

A he rarangi tata noa tenei mo nga mea ka taea ki to maatau paparangi ma te whakamahi i te waehere SQL auau. E mohio ana ahau ka kitea e koe etahi atu whakamahinga, tuhia ki roto i nga korero. A ka korero tatou me pehea (me te mea nui he aha) ki te whakaaunoa i enei mea katoa me te whakauru ki roto i to paipa CI/CD a muri ake nei.

Source: will.com

Tāpiri i te kōrero