
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 ). 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 . Ny ady voalohany amin'ny karazana "SQL vs ORM" dia tsikaritra indray .
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. .
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 . 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 .
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 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 ary 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 , 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" (, , ). 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. ).
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". . 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 (, , , ). 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 (eo ankavia dia misy fangatahana SQL izay hamokatra ny torolΓ lana ilaina amin'ny PlantUML, ary eo ankavanana ny valiny):

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 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'

Raha mijery akaiky ianao, eo ambanin'ny saron-tava maro dia mampiasa fanontaniana mitovy ihany koa. Marina fa matetika ireo fangatahana ireo dia lalina , 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, , fizarana "Monitoring"). Postgresql koa dia manana fomba fijery rafitra iray manontolo , indrindra ireo izay tena ilaina amin'ny fiainana andavanandron'ny DBA rehetra, toy ny , , . Ny MySQL aza dia manana schema misaraka amin'izany. . A In Mongo naorina-in manangona angon-drakitra momba ny zava-bita ho fanangonana rafitra .
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. .
ΠΡΠΎΠ³ΠΎ
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
