SQL, dab tsi yuav yooj yim dua? Peb txhua tus tuaj yeem sau qhov kev thov yooj yim - peb ntaus xaiv, sau cov kab uas xav tau, ces los ntawm, rooj lub npe, tej yam kev mob nyob rau hauv qhov twg thiab qhov ntawd yog txhua yam - cov ntaub ntawv muaj txiaj ntsig yog nyob rau hauv peb lub hnab tshos, thiab (yuav luag) tsis hais seb DBMS nyob rau hauv lub hood thaum lub sijhawm ntawd (los yog tej zaum
Thiab cia peb pib txoj cai los ntawm
Object-relational mapping
ORM cov neeg txhawb nqa ib txwm muaj txiaj ntsig ceev thiab yooj yim ntawm kev txhim kho, kev ywj pheej los ntawm DBMS thiab cov cai huv. Rau ntau ntawm peb, cov cai rau kev ua haujlwm nrog cov ntaub ntawv (thiab feem ntau cov ntaub ntawv nws tus kheej)
feem ntau zoo li no...
@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;
}
...
Tus qauv yog dai nrog cov lus piav qhia ntse, thiab qhov chaw tom qab ntawm qhov xwm txheej ib tus neeg muaj peev xwm ORM tsim thiab ua tiav tons ntawm qee qhov SQL code. Los ntawm txoj kev, cov neeg tsim khoom tau sim lawv qhov zoo tshaj plaws los cais lawv tus kheej los ntawm lawv cov ntaub ntawv nrog mais ntawm abstractions, uas qhia qee qhov
Nyob rau sab nraud ntawm cov kev thaiv, cov neeg ua haujlwm ntawm cov ntshiab "s tes ua" SQL nco ntsoov lub peev xwm los nyem tag nrho cov kua txiv hmab txiv ntoo tawm ntawm lawv DBMS yam tsis muaj txheej txheej ntxiv thiab abstractions. Raws li qhov tshwm sim, cov haujlwm "cov ntaub ntawv-centric" tshwm sim, qhov twg cov neeg kawm tshwj xeeb tau koom nrog hauv cov ntaub ntawv (lawv kuj yog "cov kws tshaj lij", lawv kuj yog "cov kws tshaj lij", lawv kuj yog "basdeners", thiab lwm yam), thiab cov tsim tawm. tsuas yog yuav tsum tau "rub" cov npaj ua tiav saib thiab khaws cov txheej txheem, tsis tas yuav nkag mus rau cov ntsiab lus.
Yuav ua li cas yog tias peb muaj qhov zoo tshaj plaws ntawm ob lub ntiaj teb? Yuav ua li cas qhov no yog ua nyob rau hauv ib tug zoo kawg nkaus lub cuab tam nrog lub neej-paub lub npe
Clojure yog hom lus txias rau kev tsim DSLs, tab sis SQL nws tus kheej yog DSL txias, thiab peb tsis xav tau lwm tus. S-hais lus zoo heev, tab sis lawv tsis ntxiv dab tsi tshiab ntawm no. Yog li ntawd, peb tau txais cov brackets rau lub hom phiaj ntawm cov brackets. Tsis pom zoo? Tom qab ntawd tos rau lub sijhawm thaum lub abstraction dhau ntawm cov ntaub ntawv pib xau thiab koj pib sib ntaus nrog cov haujlwm (raws-sql)
Yog li kuv yuav ua li cas? Cia peb tawm SQL li niaj zaus SQL - ib daim ntawv thov:
-- name: users-by-country
select *
from users
where country_code = :country_code
... thiab tom qab ntawd nyeem cov ntaub ntawv no, tig mus rau hauv Clojure muaj nuj nqi:
(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" ...} ...)
Los ntawm kev ua raws li "SQL los ntawm nws tus kheej, Clojure los ntawm nws tus kheej", koj tau txais:
- Tsis muaj syntactic surprises. Koj lub database (zoo li lwm yam) tsis yog 100% raws li SQL tus qauv - tab sis qhov no tsis muaj teeb meem rau Yesql. Koj yuav tsis nkim sij hawm mus yos hav zoov rau kev ua haujlwm nrog SQL sib npaug syntax. Koj yuav tsis tau rov qab mus ua haujlwm (raw-sql "some('funky'::SYNTAX)")).
- Qhov zoo tshaj plaws editor txhawb. Koj tus editor twb muaj kev txhawb nqa SQL zoo heev. Los ntawm kev txuag SQL li SQL koj tuaj yeem siv nws yooj yim.
- Pab neeg compatibility. Koj DBAs tuaj yeem nyeem thiab sau SQL koj siv hauv koj qhov project Clojure.
- Kev ua haujlwm tau yooj yim dua. Xav tau tsim ib txoj kev npaj rau cov lus nug uas muaj teeb meem? Qhov no tsis yog teeb meem thaum koj cov lus nug tsis tu ncua SQL.
- Rov siv cov lus nug. Luag thiab tso cov tib SQL cov ntaub ntawv mus rau lwm qhov haujlwm vim nws tsuas yog SQL qub qub - tsuas yog qhia nws.
Hauv kuv lub tswv yim, lub tswv yim yog txias heev thiab tib lub sijhawm yooj yim heev, ua tsaug rau qhov project tau txais ntau yam
IDE & DB managers
Cia peb pib nrog txoj haujlwm yooj yim txhua hnub. Feem ntau peb yuav tsum tshawb nrhiav qee yam khoom hauv cov ntaub ntawv, piv txwv li, nrhiav ib lub rooj hauv schema thiab kawm nws cov qauv (cov kab ntawv dab tsi, cov yuam sij, qhov ntsuas, qhov txwv, thiab lwm yam yog siv). Thiab los ntawm ib qho graphical IDE lossis DB-tus thawj coj me me, ua ntej ntawm tag nrho cov, peb cia siab tias cov peev txheej no. Yog li ntawd nws ceev ceev thiab koj tsis tas yuav tos ib nrab ib teev kom txog thaum lub qhov rais nrog cov ntaub ntawv tsim nyog tau kos (tshwj xeeb tshaj yog nrog kev sib txuas qeeb rau cov chaw taws teeb database), thiab tib lub sijhawm, cov ntaub ntawv tau txais yog tshiab thiab cuam tshuam, thiab tsis cached junk. Ntxiv mus, qhov nyuaj thiab loj dua cov ntaub ntawv thiab ntau dua ntawm lawv, qhov nyuaj dua yog ua qhov no.
Tab sis feem ntau kuv muab tus nas pov tseg thiab tsuas yog sau code. Cia peb hais tias koj yuav tsum paub seb cov ntxhuav twg (thiab cov khoom twg) muaj nyob rau hauv "HR" schema. Hauv feem ntau DBMSs, qhov xav tau tshwm sim tuaj yeem ua tiav nrog cov lus nug yooj yim no los ntawm information_schema:
select table_name
, ...
from information_schema.tables
where schema = 'HR'
Los ntawm cov ntaub ntawv mus rau cov ntaub ntawv, cov ntsiab lus ntawm cov lus siv no txawv nyob ntawm qhov muaj peev xwm ntawm txhua DBMS. Thiab, piv txwv li, rau MySQL, los ntawm tib phau ntawv siv koj tuaj yeem tau txais cov lus qhia tshwj xeeb rau DBMS no:
select table_name
, storage_engine -- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ "Π΄Π²ΠΈΠΆΠΎΠΊ" ("MyISAM", "InnoDB" etc)
, row_format -- Π€ΠΎΡΠΌΠ°Ρ ΡΡΡΠΎΠΊΠΈ ("Fixed", "Dynamic" etc)
, ...
from information_schema.tables
where schema = 'HR'
Oracle tsis paub information_schema, tab sis nws muaj
select table_name
, pct_free -- ΠΠΈΠ½ΠΈΠΌΡΠΌ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΡΠ° Π² Π±Π»ΠΎΠΊΠ΅ Π΄Π°Π½Π½ΡΡ
(%)
, pct_used -- ΠΠΈΠ½ΠΈΠΌΡΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΌΠ΅ΡΡΠ° Π² Π±Π»ΠΎΠΊΠ΅ Π΄Π°Π½Π½ΡΡ
(%)
, last_analyzed -- ΠΠ°ΡΠ° ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ ΡΠ±ΠΎΡΠ° ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ
, ...
from all_tables
where owner = 'HR'
ClickHouse tsis muaj kev zam:
select name
, engine -- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ "Π΄Π²ΠΈΠΆΠΎΠΊ" ("MergeTree", "Dictionary" etc)
, ...
from system.tables
where database = 'HR'
Ib yam dab tsi zoo sib xws tuaj yeem ua tiav hauv Cassandra (uas muaj cov tsev neeg hauv tsev tsis yog cov rooj thiab cov chaw tseem ceeb tsis yog schemas):
select columnfamily_name
, compaction_strategy_class -- Π‘ΡΡΠ°ΡΠ΅Π³ΠΈΡ ΡΠ±ΠΎΡΠΊΠΈ ΠΌΡΡΠΎΡΠ°
, gc_grace_seconds -- ΠΡΠ΅ΠΌΡ ΠΆΠΈΠ·Π½ΠΈ ΠΌΡΡΠΎΡΠ°
, ...
from system.schema_columnfamilies
where keyspace_name = 'HR'
Rau feem ntau lwm cov ntaub ntawv, koj tuaj yeem tuaj nrog cov lus nug zoo sib xws (txawm Mongo muaj
Ntawm chav kawm, nyob rau hauv txoj kev no koj tuaj yeem tau txais cov ntaub ntawv tsis yog hais txog cov ntxhuav, tab sis hais txog txhua yam khoom. Txij lub sij hawm, cov neeg zoo sib koom cov cai no rau cov ntaub ntawv sib txawv, xws li, piv txwv li, hauv cov kab lus ntawm habra "Functions for documenting PostgreSQL databases" (
Yog li ntawd, txoj kev tshawb nrhiav thiab tshawb nrhiav cov khoom no hloov pauv tau yooj yim, txuag sijhawm ntau, thiab tso cai rau koj kom tau txais cov ntaub ntawv raws nraim hauv daim ntawv uas tam sim no tsim nyog (xws li, piv txwv li, tau piav qhia hauv tsab ntawv tshaj tawm.
Kev ua haujlwm nrog cov khoom
Tom qab peb tau pom thiab kawm txog cov khoom tsim nyog, nws yog lub sijhawm los ua qee yam muaj txiaj ntsig nrog lawv. Lawm, kuj tsis tas siv koj cov ntiv tes tawm ntawm cov keyboard.
Nws tsis pub leejtwg paub tias tsuas yog rho tawm ib lub rooj yuav zoo ib yam hauv yuav luag txhua cov ntaub ntawv:
drop table hr.persons
Tab sis nrog cov creation ntawm lub rooj nws ua ntau nthuav. Yuav luag txhua DBMS (nrog rau ntau NoSQL) tuaj yeem "tsim lub rooj" hauv ib daim ntawv lossis lwm qhov, thiab qhov tseem ceeb ntawm nws yuav txawv me ntsis (lub npe, daim ntawv teev npe, hom ntaub ntawv), tab sis lwm cov ntsiab lus tuaj yeem sib txawv thiab nyob ntawm cov khoom siv sab hauv thiab muaj peev xwm ntawm DBMS tshwj xeeb. Kuv nyiam qhov piv txwv yog tias hauv Oracle cov ntaub ntawv tsuas muaj "liab qab" BNFs rau "tsim rooj" syntax
Tsis tas li ntawd, ntau DBMSs muaj lawv tus kheej cov khoom tshwj xeeb uas tsis muaj nyob hauv lwm DBMSs. Ntxiv mus, peb tuaj yeem ua haujlwm tsis yog ntawm cov khoom siv hauv database nkaus xwb, tab sis kuj ntawm DBMS nws tus kheej, piv txwv li, "tua" txheej txheem, tso qee qhov chaw nco, pab kom taug qab, hloov mus rau "nyeem nkaus xwb" hom, thiab ntau ntxiv.
Tam sim no cia peb kos me ntsis
Ib qho ntawm cov haujlwm tshaj plaws yog tsim cov duab kos nrog cov khoom siv database thiab pom cov khoom thiab kev sib txuas ntawm lawv hauv daim duab zoo nkauj. Yuav luag txhua daim duab IDE, cais "kab lus txib" cov khoom siv hluav taws xob, cov cuab yeej siv duab tshwj xeeb thiab cov qauv ua qauv tuaj yeem ua qhov no. Lawv yuav kos ib yam dab tsi rau koj "zoo li lawv tuaj yeem ua tau," thiab koj tuaj yeem cuam tshuam cov txheej txheem no me ntsis tsuas yog nrog kev pab ntawm ob peb qhov kev teeb tsa hauv cov ntaub ntawv teeb tsa lossis checkboxes hauv lub interface.
Tab sis qhov teeb meem no tuaj yeem daws tau yooj yim dua, hloov tau yooj yim thiab muaj kuab heev, thiab tau kawg nrog kev pab ntawm cov cai. Txhawm rau tsim cov duab kos ntawm txhua qhov nyuaj, peb muaj ntau hom lus tshwj xeeb (DOT, GraphML thiab lwm yam), thiab rau lawv tag nrho cov kev siv (GraphViz, PlantUML, Mermaid) uas tuaj yeem nyeem cov lus qhia thiab pom lawv hauv ntau hom ntawv. . Zoo, peb twb paub yuav ua li cas kom tau txais cov ntaub ntawv hais txog cov khoom thiab kev sib txuas ntawm lawv.
Nov yog ib qho piv txwv me me ntawm qhov no yuav zoo li cas, siv PlantUML thiab
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'
Thiab yog tias koj sim me ntsis, ces raws li
Cov lus nug SQL yog qhov nyuaj me ntsis
-- Π¨Π°ΠΏΠΊΠ°
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'
Yog tias koj saib ze, hauv qab hood ntau cov cuab yeej pom pom kuj siv cov lus nug zoo sib xws. Muaj tseeb tiag, cov kev thov no feem ntau yog tob heev
Metrics thiab saib xyuas
Cia peb txav mus rau lub ntsiab lus ib txwm ua nyuaj - kev saib xyuas cov ntaub ntawv kev ua haujlwm. Kuv nco qab ib zaj dab neeg tseeb me me qhia rau kuv los ntawm "ib tug ntawm kuv cov phooj ywg." Nyob rau lwm qhov project muaj nyob ib tug tej yam haib DBA, thiab ob peb ntawm cov developers paub nws tus kheej, los yog puas tau pom nws nyob rau hauv tib neeg (txawm hais tias, raws li cov lus xaiv, nws ua hauj lwm nyob rau hauv ib qho chaw nyob rau hauv lub tom ntej no lub tsev). Thaum lub sijhawm "X", thaum lub kaw lus ntawm lub khw muag khoom loj pib "xav tsis zoo" ib zaug ntxiv, nws ntsiag to xa cov duab thaij duab ntawm Oracle Enterprise Manager, uas nws ua tib zoo qhia qhov chaw tseem ceeb nrog lub cim liab rau "kev nkag siab" ( qhov no, muab nws me me, tsis pab ntau). Thiab raws li "daim npav daim npav" no kuv yuav tsum tau kho. Nyob rau tib lub sijhawm, tsis muaj leej twg tau nkag mus rau qhov muaj nuj nqis (hauv ob qho kev nkag siab ntawm lo lus) Tus Thawj Saib Xyuas Kev Lag Luam, vim Lub kaw lus yog qhov nyuaj thiab kim, tam sim ntawd "cov neeg tsim khoom ntog rau ib yam dab tsi thiab tawg txhua yam." Yog li ntawd, cov neeg tsim khoom "empirically" pom qhov chaw thiab ua rau lub brakes thiab tso tawm ib thaj. Yog tias tsab ntawv ceeb toom los ntawm DBA tsis tuaj txog dua yav tom ntej, ces txhua tus yuav ua pa zoo siab thiab rov qab mus rau lawv txoj haujlwm tam sim no (txog tsab ntawv tshiab).
Tab sis cov txheej txheem kev soj ntsuam tuaj yeem saib kev lom zem thiab ua phooj ywg ntau dua, thiab qhov tseem ceeb tshaj plaws, siv tau thiab pob tshab rau txhua tus. Yam tsawg kawg ntawm nws qhov tseem ceeb, ua ib qho ntxiv rau cov kev saib xyuas tseem ceeb (uas yeej muaj txiaj ntsig zoo thiab ntau qhov tsis tuaj yeem hloov tau). Txhua DBMS yog dawb thiab dawb xwb los qhia cov ntaub ntawv hais txog nws lub xeev tam sim no thiab kev ua haujlwm. Hauv tib "ntshav" Oracle DB, yuav luag txhua cov ntaub ntawv hais txog kev ua tau zoo tuaj yeem tau txais los ntawm kev saib xyuas, xws li cov txheej txheem thiab ntu mus rau lub xeev ntawm qhov tsis muaj cache (piv txwv li,
Yog li, riam phom nrog qee yam kev ntsuas ntsuas (Telegraf, Metricbeat, Sau) uas tuaj yeem ua cov lus nug sql kev cai, kev khaws cia ntawm cov ntsuas no (InfluxDB, Elasticsearch, Timescaledb) thiab cov duab pom (Grafana, Kibana), koj tuaj yeem tau txais ib qho yooj yim heev. thiab ib qho kev soj ntsuam hloov tau yooj yim uas yuav raug sib raug zoo nrog lwm cov kev ntsuas thoob plaws hauv lub cev (tau txais, piv txwv li, los ntawm daim ntawv thov server, los ntawm OS, thiab lwm yam). Raws li, piv txwv li, qhov no yog ua tiav hauv pgwatch2, uas siv InfluxDB + Grafana kev sib xyaw ua ke thiab cov lus nug rau cov kev pom, uas tuaj yeem nkag mus.
Tag nrho
Thiab qhov no tsuas yog cov npe kwv yees ntawm qhov ua tau nrog peb cov ntaub ntawv siv SQL code li niaj zaus. Kuv paub tseeb tias koj tuaj yeem nrhiav tau ntau yam ntxiv, sau rau hauv cov lus. Thiab peb yuav tham txog yuav ua li cas (thiab qhov tseem ceeb tshaj yog vim li cas) kom ua tiav txhua qhov no thiab suav nrog hauv koj lub CI / CD kav dej rau lwm zaus.
Tau qhov twg los: www.hab.com