SQL, apa sing luwih gampang? Saben kita bisa nulis panjalukan sing prasaja - kita ngetik pilih, dhaptar kolom sing dibutuhake, banjur saka, jeneng tabel, sawetara kahanan ing ngendi lan iku kabeh - data migunani ana ing kanthong kita, lan (meh) preduli saka DBMS ing hood ing wektu iku (utawa mungkin
Lan ayo miwiti langsung saka
Pemetaan obyek-relasional
Panyengkuyung ORM kanthi tradisional ngurmati kacepetan lan gampang pangembangan, kamardikan saka DBMS lan kode sing resik. Kanggo akeh kita, kode kanggo nggarap database (lan asring database dhewe)
biasane katon kaya iki ...
@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;
}
...
Model kasebut digantung kanthi anotasi sing cerdas, lan ing endi wae ing mburi adegan, ORM sing gagah nggawe lan nglakokake pirang-pirang kode SQL. Miturut cara, pangembang nyoba sing paling apik kanggo ngisolasi awake dhewe saka database kanthi kilometer abstraksi, sing nuduhake sawetara
Ing sisih liya saka barricades, penganut murni "gawean tangan" SQL nyathet kemampuan kanggo remet kabeh jus metu saka DBMS sing tanpa lapisan tambahan lan abstraksi. Akibaté, proyèk "data-sentris" katon, ing ngendi wong sing dilatih khusus melu database (uga "basicists", uga "basicists", uga "basdeners", lan liya-liyane), lan pangembang. mung kudu "narik" tampilan sing wis siyap lan prosedur sing disimpen, tanpa mlebu rincian.
Apa yen kita duwe sing paling apik ing donya? Carane iki rampung ing alat apik banget karo jeneng-affirming urip
Clojure punika basa kelangan kanggo nggawe DSLs, nanging SQL dhewe DSL kelangan, lan kita ora perlu liyane. S-ekspresi gedhe, nanging ora nambah apa-apa anyar ing kene. AkibatΓ©, kita njaluk kurung kanggo kepentingan kurung. Ora setuju? Banjur ngenteni wayahe nalika abstraksi liwat database wiwit bocor lan sampeyan miwiti gelut karo fungsi (raw-sql)
Dadi apa sing kudu daklakoni? Ayo ninggalake SQL minangka SQL biasa - siji file saben panyuwunan:
-- name: users-by-country
select *
from users
where country_code = :country_code
... banjur waca file iki, ngowahi dadi fungsi Clojure biasa:
(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" ...} ...)
Kanthi netepi prinsip "SQL dhewe, Clojure dhewe", sampeyan entuk:
- Ora ana kejutan sintaksis. Database sampeyan (kaya liyane) ora 100% tundhuk karo standar SQL - nanging iki ora masalah kanggo Yesql. Sampeyan ora bakal mbuwang wektu mburu fungsi kanthi sintaks sing padha karo SQL. Sampeyan ora bakal kudu bali menyang fungsi (raw-sql "sawetara ('funky'::SYNTAX)")).
- Dhukungan editor paling apik. Editor sampeyan wis duwe dhukungan SQL sing apik banget. Kanthi nyimpen SQL minangka SQL sampeyan mung bisa nggunakake.
- Kompatibilitas tim. DBA sampeyan bisa maca lan nulis SQL sing digunakake ing proyek Clojure.
- Tuning kinerja luwih gampang. Apa sampeyan kudu nggawe rencana kanggo pitakon masalah? Iki ora dadi masalah nalika pitakon sampeyan yaiku SQL biasa.
- Nganggo maneh pitakon. Seret lan selehake file SQL sing padha menyang proyek liyane amarga mung SQL lawas - mung nuduhake.
Ing mratelakake panemume, idea banget kelangan lan ing wektu sing padha banget prasaja, thanks kanggo kang project wis gained akeh
Manajer IDE & DB
Ayo dadi miwiti karo tugas saben dinten prasaja. Asring kita kudu nggoleki sawetara obyek ing basis data, contone, golek tabel ing skema lan sinau strukture (kolom, tombol, indeks, kendala, lan liya-liyane). Lan saka sembarang IDE grafis utawa DB-manager sethitik, pisanan kabeh, kita nyana persis kabisan iki. Supaya cepet lan sampeyan ora kudu ngenteni setengah jam nganti jendhela kanthi informasi sing dibutuhake ditarik (utamane kanthi sambungan alon menyang database remot), lan ing wektu sing padha, informasi sing ditampa seger lan relevan, lan ora cached sampah. Kajaba iku, database sing luwih rumit lan luwih gedhe lan luwih akeh jumlahe, luwih angel ditindakake.
Nanging biasane aku mbuwang mouse lan mung nulis kode. Contone, sampeyan kudu ngerteni tabel endi (lan properti) sing ana ing skema "HR". Ing umume DBMS, asil sing dikarepake bisa digayuh kanthi pitakon prasaja saka information_schema:
select table_name
, ...
from information_schema.tables
where schema = 'HR'
Saka basis data menyang basis data, isi tabel referensi kasebut beda-beda gumantung saka kapabilitas saben DBMS. Lan, contone, kanggo MySQL, saka buku referensi sing padha sampeyan bisa entuk parameter tabel khusus kanggo DBMS iki:
select table_name
, storage_engine -- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ "Π΄Π²ΠΈΠΆΠΎΠΊ" ("MyISAM", "InnoDB" etc)
, row_format -- Π€ΠΎΡΠΌΠ°Ρ ΡΡΡΠΎΠΊΠΈ ("Fixed", "Dynamic" etc)
, ...
from information_schema.tables
where schema = 'HR'
Oracle ora ngerti information_schema, nanging duwe
select table_name
, pct_free -- ΠΠΈΠ½ΠΈΠΌΡΠΌ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΡΠ° Π² Π±Π»ΠΎΠΊΠ΅ Π΄Π°Π½Π½ΡΡ
(%)
, pct_used -- ΠΠΈΠ½ΠΈΠΌΡΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΌΠ΅ΡΡΠ° Π² Π±Π»ΠΎΠΊΠ΅ Π΄Π°Π½Π½ΡΡ
(%)
, last_analyzed -- ΠΠ°ΡΠ° ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ ΡΠ±ΠΎΡΠ° ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ
, ...
from all_tables
where owner = 'HR'
ClickHouse ora kajaba:
select name
, engine -- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ "Π΄Π²ΠΈΠΆΠΎΠΊ" ("MergeTree", "Dictionary" etc)
, ...
from system.tables
where database = 'HR'
Bab sing padha bisa ditindakake ing Cassandra (sing duwe kolom kulawarga tinimbang tabel lan spasi tombol tinimbang skema):
select columnfamily_name
, compaction_strategy_class -- Π‘ΡΡΠ°ΡΠ΅Π³ΠΈΡ ΡΠ±ΠΎΡΠΊΠΈ ΠΌΡΡΠΎΡΠ°
, gc_grace_seconds -- ΠΡΠ΅ΠΌΡ ΠΆΠΈΠ·Π½ΠΈ ΠΌΡΡΠΎΡΠ°
, ...
from system.schema_columnfamilies
where keyspace_name = 'HR'
Kanggo umume database liyane, sampeyan uga bisa nggawe pitakon sing padha (malah Mongo duwe
Mesthi, kanthi cara iki sampeyan bisa entuk informasi ora mung babagan tabel, nanging babagan obyek apa wae ing umum. Saka wektu kanggo wektu, wong apik nuduhake kode kuwi kanggo database beda, kayata, contone, ing seri artikel habra "Fungsi kanggo ndokumentasikake database PostgreSQL" (
AkibatΓ©, cara navigasi lan nggoleki obyek iki luwih fleksibel, ngirit wektu akeh, lan ngidini sampeyan entuk persis informasi ing wangun sing saiki dibutuhake (kayata, contone, diterangake ing kiriman kasebut.
Operasi karo obyek
Sawise kita nemokake lan sinau obyek sing dibutuhake, wektune kanggo nindakake perkara sing migunani. Alami, uga tanpa njupuk driji saka keyboard.
Ora ana rahasia manawa mung mbusak tabel bakal katon padha ing meh kabeh database:
drop table hr.persons
Nanging kanthi nggawe meja dadi luwih menarik. Meh kabeh DBMS (kalebu akeh NoSQL) bisa "nggawe tabel" ing salah siji wangun utawa liyane, lan bagean utama iku malah rada beda (jeneng, dhaftar kolom, jinis data), nanging rincian liyane bisa beda-beda dramatically lan gumantung ing piranti internal lan kapabilitas DBMS tartamtu. Conto favoritku yaiku ing dokumentasi Oracle mung ana BNF "wuda" kanggo sintaks "gawe tabel".
Uga, akeh DBMS duwe jinis obyek tartamtu dhewe sing ora kasedhiya ing DBMS liyane. Menapa malih, kita bisa nindakake operasi ora mung ing obyek database, nanging uga ing DBMS dhewe, contone, "mateni" proses, mbebasake sawetara area memori, ngaktifake nelusuri, ngalih menyang mode "mung maca", lan akeh liyane.
Saiki ayo nggambar sethithik
Salah sawijining tugas sing paling umum yaiku nggawe diagram karo obyek database lan ndeleng obyek lan sambungan ing antarane gambar sing apik. Meh kabeh IDE grafis, utilitas "baris perintah" sing kapisah, alat grafis khusus lan modeler bisa nindakake iki. Dheweke bakal nggambar soko kanggo sampeyan "sing paling apik," lan sampeyan bisa mengaruhi proses iki mung kanthi bantuan sawetara paramèter ing file konfigurasi utawa kothak ing antarmuka.
Nanging masalah iki bisa ditanggulangi luwih prasaja, luwih fleksibel lan elegan, lan mesthi kanthi bantuan kode. Kanggo nggawe diagram saka kerumitan apa wae, kita duwe sawetara basa markup khusus (DOT, GraphML etc), lan kanggo wong-wong mau kabeh panyebaran aplikasi (GraphViz, PlantUML, Mermaid) sing bisa maca instruksi kasebut lan nggambarake ing macem-macem format. . Ya, kita wis ngerti carane entuk informasi babagan obyek lan sambungan ing antarane.
Iki minangka conto cilik babagan apa sing bisa katon, nggunakake PlantUML lan
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'
Lan yen sampeyan nyoba sethitik, banjur adhedhasar
Pitakonan SQL rada rumit
-- Π¨Π°ΠΏΠΊΠ°
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'
Yen sampeyan ndeleng kanthi teliti, ing ngisor tudung akeh alat visualisasi uga nggunakake pitakon sing padha. Bener, panjaluk kasebut biasane jero
Metrik lan ngawasi
Ayo pindhah menyang topik tradisional sing rumit - database performance monitoring . Aku kelingan crita nyata cilik sing dicritakake dening "salah sawijining kancaku." Ing proyek liyane, ana DBA sing kuat, lan sawetara pangembang ngerti dheweke kanthi pribadi, utawa wis nate ndeleng dheweke (senadyan kasunyatane, miturut gosip, dheweke kerja ing endi wae ing bangunan sabanjure). Ing jam "X", nalika sistem poduction saka pengecer gedhe wiwit "rasa ala" maneh, dheweke meneng ngirim gambar gambar saka Oracle Enterprise Manager, kang kasebut kanthi teliti, nyorot panggonan kritis karo tandha abang kanggo "comprehensibility" ( iki, kanggo sijine iku mildly, ora bantuan akeh). Lan adhedhasar "kertu foto" iki aku kudu nambani. Ing wektu sing padha, ora ana sing nduweni akses menyang larang regane (ing loro pangertèn saka tembung) Enterprise Manager, amarga sistem iki rumit lan larang, dumadakan "pangembang kesandhung lan ngrusak kabeh." Mulane, pangembang "empiris" nemokake lokasi lan sabab saka rem lan ngeculake tembelan. Yen layang ancaman saka DBA ora teka maneh ing mangsa ngarep, kabeh wong bakal ambegan lega lan bali menyang tugas saiki (nganti Surat anyar).
Nanging proses ngawasi bisa katon luwih nyenengake lan ramah, lan sing paling penting, bisa diakses lan transparan kanggo kabeh wong. Paling ora bagean dhasar, minangka tambahan kanggo sistem ngawasi utama (sing mesthi migunani lan ing akeh kasus irreplaceable). Sembarang DBMS gratis lan gratis kanggo nuduhake informasi babagan kahanan lan kinerja saiki. Ing Oracle DB sing padha "getih", meh kabeh informasi babagan kinerja bisa dipikolehi saka tampilan sistem, wiwit saka proses lan sesi nganti kahanan cache buffer (contone,
Mangkono, bersenjata karo sawetara jinis kolektor metrik (Telegraf, Metricbeat, Collectd) sing bisa nindakake pitakon sql khusus, panyimpenan metrik kasebut (InfluxDB, Elasticsearch, Timescaledb) lan visualisasi (Grafana, Kibana), sampeyan bisa entuk cukup gampang. lan sistem ngawasi fleksibel sing bakal digabungake rapet karo metrik sistem liyane (dipikolehi, contone, saka server aplikasi, saka OS, etc.). Contone, iki ditindakake ing pgwatch2, sing nggunakake kombinasi InfluxDB + Grafana lan sakumpulan pitakon menyang tampilan sistem, sing uga bisa diakses.
Total
Lan iki mung dhaptar kira-kira apa sing bisa ditindakake karo database nggunakake kode SQL biasa. Aku manawa sampeyan bisa nemokake akeh liyane nggunakake, nulis ing komentar. Lan kita bakal ngomong babagan carane (lan sing paling penting kenapa) ngotomatisasi kabeh iki lan kalebu ing pipa CI / CD sabanjure.
Source: www.habr.com