SQLá áááºá¡áá¬á ááá¯ááá¯ážááŸááºážááá¯ááºááá²á áá»áœááºá¯ááºááá¯á·áá
áºáŠážá
á®ááẠááá¯ážááŸááºážáá±á¬ áá±á¬ááºážááá¯áá»ááºááᯠáá±ážáá¬ážááá¯ááºááẠ- áá»áœááºá¯ááºááá¯á· á
á¬ááá¯ááºáá«á ááᯠselectááá¯á·áá±á¬áẠááá¯á¡ááºáá±á¬áá±á¬áºáá¶áá»á¬ážááᯠá
á¬áááºážááŒá¯á
á¯áá«á ááŸááá¬ážá¡áááºá á¡ááŒá±á¡áá±á¡áá»áá¯á· áááºááŸá¬ áá«áá«áá² - á¡áá¯á¶ážáááºáá±á¬áá±áá¬ááẠáá»áœááºá¯ááºááá¯á·áá¡áááºáááºáá²ááœááºááŸáááŒá®áž (áá®ážáá«áž) áááºááá·áº DBMS ááẠááá¯á¡áá»áááºááœáẠáááºááá·áºá¡áá¯á¶ážá¡á±á¬ááºááœááºááŸááá±áááºááŒá
áºá
á± (ááá¯á·ááá¯áẠááŒá
áºááá¯ááºáááº
ááŒá®ážáá±á¬á· áá¬áááºááá± á
ááá¯ááºáá¡á±á¬ááº
Object-relational mapping
ORM áá±á¬ááºáá¶áá°áá»á¬ážááẠá¡á ááºá¡áá¬á¡á¬ážááŒáá·áº ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯á á¡ááŒááºááŸá¯ááºážááŸáá·áº ááœááºáá°ááŸá¯á DBMS ááŸáá·áº ááá·áºááŸááºážáá±á¬áá¯ááºááá¯á·á០ááœááºáááºááŸá¯ááᯠáááºááá¯ážáá¬ážááŒáááºá áá»áœááºá¯ááºááá¯á·á¡áá»á¬ážá á¯á¡ááœááºá áá±áá¬áá±á·á áºááŸáá·áºá¡áá¯ááºáá¯ááºáááºá¡ááœááºáá¯áẠ(ááŸáá·áºáááŒá¬áááá±áá¬áá±á·á áºááá¯ááºááá¯ááº)
áá»á¬ážáá±á¬á¡á¬ážááŒáá·áº áá®ááá¯áá»áá¯ážááŒááºááá«áááº...
@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;
}
...
áá±á¬áºáááºááᯠáááá¹áá¬áá«ážáááºáá±á¬ááŸááºáá»ááºáá»á¬ážááŒáá·áº áá»áááºááœá²áá¬ážááŒá®áž ááŒááºááœááºážáá±á¬ááºááœááºáá
áºáá±áá¬ááœáẠáá²ááá·áºáá±á¬ ORM ááẠSQL áá¯ááºá¡áá»áá¯á·ááᯠá¡áá»á¬ážá¡ááŒá¬ážáá¯ááºáá±ážááŒá®áž áá¯ááºáá±á¬ááºáááºá á
áá¬ážáá
ááºá developer áá»á¬ážááẠá¡áá»áá¯á·áá±á¬ abstractions áá»á¬ážááᯠááœáŸááºááŒááá·áº áá®ááá¯áá®áá¬áá»á¬ážááŒáá·áº áááºážááá¯á·á database á០áááºážááá¯á·ááá¯ááºááᯠáá®ážááŒá¬ážááœá²áá¯ááºááẠá¡á
áœááºážáá¯áẠááŒáá¯ážá
á¬ážáá±ááŒáááºá
á¡áá¬ážá¡áá®ážáá»á¬ážáá¡ááŒá¬ážáá áºáááºááœááºá á á áºááŸááºáá±á¬â áááºáá¯ááºâ SQL áááá¯ááºáá¬áá°áá»á¬ážáááºáá±á¬ááºáááºá¡ááœáŸá¬áá»á¬ážááŸáá·áº abstraction áá»á¬ážááá«áá²áááºážááá¯á·á DBMS ááŸáá»á±á¬áºáááºá¡á¬ážáá¯á¶ážááá¯ááŸá áºáá¯ááºááá¯ááºá áœááºážááá¯áááááŒá¯áááááºá ááááºá¡áá±ááŒáá·áº database ááœáẠá¡áá°ážáá±á·áá»áá·áºáá¬ážáá±á¬áá°áá»á¬ážáá«áááºááá·áº âáá±áá¬áááá¯ááŒá¯â ááá±á¬áá»ááºáá»á¬áž áá±á«áºáá¬ááẠ(áááºážááá¯á·ááẠâá¡ááŒá±áá¶ááá¬ááŸááºáá»á¬ážâ áááºážááŒá áºááŒáááºá áááºážááá¯á·ááẠâá¡ááŒá±áá¶ááá¬ááŸááºáá»á¬ážâ áááºážááŒá áºááŒáááºá áááºážááá¯á·ááẠâbasdenersâ á áááºááŒáá·áº) ááŸáá·áº developer áá»á¬ážá á¡áááºááá·áºáá¯ááºáá¬ážááá·áº á¡ááŒááºáá»á¬ážááŸáá·áº ááááºážáááºážáá¬ážáá±á¬ áá¯ááºáá¯á¶ážáá¯ááºáááºážáá»á¬ážááᯠá¡áá±ážá áááºááá±á·áá¬áá² âááœá²â áááºáᬠááá¯á¡ááºáááºá
áá«ááá¯á·ááŸá¬ ááá¹áá¬ááŸá
áºáá¯áá¯á¶ážááŸá¬ á¡áá±á¬ááºážáá¯á¶ážááœá±ááŸááá±ááẠáááºááá¯áá¯ááºááá²á á€á¡áá¬ááẠá¡áááºááᯠááá¯ááºáá¶á·á
á±áá±á¬ á¡áááºááŒáá·áº á¡á¶á·ááŒááœááºáá±á¬ááºážáá±á¬ áááááá¬áá
áºáá¯ááŒáá·áº ááŒá¯áá¯ááºáá¯á¶ááŒá
áºáááºá
Clojure ááẠDSL áá»á¬ážááá¯áááºáá®ážáááºá¡ááœáẠááœá²áá±á¬ááºááŸá¯ááŸááá±á¬áá¬áá¬á áá¬ážáá áºáá¯ááŒá áºáááºá ááá¯á·áá±á¬áº SQL ááá¯ááºááá¯ááºá á¡ááá¯ááºá á¬áž DSL áá áºáá¯ááŒá áºááŒá®áž áá»áœááºá¯ááºááá¯á·ááẠáá±á¬ááºáááºáá áºáá¯áááá¯á¡ááºáá«á S-á¡áá¯á¶ážá¡ááŸá¯ááºážáá»á¬ážááẠáá±á¬ááºážááœááºáá±á¬áºáááºážá áááºážááá¯á·ááẠá€áá±áá¬ááœáẠá¡áá áºá¡áááºážáá»á¬ážááᯠááá·áºááá¬ážáá«á ááááºá¡áá±ááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠááœááºážá ááœááºážááááºáá»á¬ážááᯠáá±á¬ááºá ááœááºážá ááœááºážááááºáá»á¬ážááᯠááá°áááºá ááá±á¬ááá°áá°ážáá¬áž? ááá¯á·áá±á¬áẠáá±áá¬áá±á·á áºáá±á«áºááŸá abstraction áá»á¬áž áá±á«ááºááŒá¬ážáá¬áááºááŸáá·áº ááẠfunction ááᯠá áááºááá¯ááºááá¯ááºááá·áºá¡áá»áááºááᯠá á±á¬áá·áºáá«á (á¡ááŒááºáž-á áá¯áááºážááá¯ááº)
áá«ááᯠáá¬áá¯ááºáááá²á SQL ááᯠáá¯á¶ááŸáẠSQL á¡ááŒá Ạáá¬ážáá²á·ááŒáá«á áá¯á· - áá±á¬ááºážááá¯ááŸá¯áá áºáá¯á¡ááœáẠááá¯ááºáá áºáá¯á
-- name: users-by-country
select *
from users
where country_code = :country_code
... ááá¯á·áá±á¬áẠá€ááá¯ááºááá¯áááºáá«á áááºážááᯠáá¯á¶ááŸáẠClojure áá¯ááºáá±á¬ááºáá»ááºá¡ááŒá ẠááŒá±á¬ááºážáá²áá«á
(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" ...} ...)
"SQL ááᯠáá°á·á¡ááá¯ááá¯á áá°á·áá¬áá¬áá° Clojure" áááá¬áááᯠááá¯ááºáá¬ááŒááºážááŒáá·áºá áááºáááŸááááº-
- Syntactic á¡á¶á·ááŒááœááºáááŸááá«á áááºááá±áá¬áá±á·á Ạ(á¡ááŒá¬ážáááºááá·áºá¡áá¬áá»á¬ážáá²á·ááá¯á·) ááẠSQL á á¶ááŸá¯ááºážááŸáá·áº 100% áááá¯ááºáá®áá« - ááá¯á·áá±á¬áº Yesql á¡ááœáẠá¡áá±ážáááŒá®ážáá«á SQL equivalent syntax ááŒáá·áº áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠááŸá¬ááœá±áá¬ááœáẠá¡áá»áááºááŒá¯ááºážáááºááá¯ááºáá«á áá¯ááºáá±á¬ááºáá»ááºáá áºáá¯ááá¯á· áááºáááºáá±á¬á·á០ááŒááºááœá¬ážá áᬠáááá¯áá«á (raw-sql "some('funky'::SYNTAX)")).
- á¡áá±á¬ááºážáá¯á¶ážá¡ááºáá®áá¬áá¶á·ááá¯ážááŸá¯á ááá·áºá¡ááºáá®áá¬ááẠáá±á¬ááºážááœááºáá±á¬ SQL áá¶á·ááá¯ážááŸá¯ááŸáááŒá®ážááŒá áºáááºá SQL ááᯠSQL á¡ááŒá ẠááááºážáááºážááŒááºážááŒáá·áº áááºážááᯠááá¯ážááá¯ážááŸááºážááŸááºáž á¡áá¯á¶ážááŒá¯ááá¯ááºáááºá
- á¡áááºážááá¯ááºááá¯ááºáááºááŸá¯á áááºá DBA áá»á¬ážááẠáááºá Clojure ááá±á¬áá»ááºááœáẠáááºá¡áá¯á¶ážááŒá¯ááá·áº SQL ááᯠáááºááá¯ááºááŒá®áž áá±ážááá¯ááºáááºá
- á áœááºážáá±á¬ááºááẠáá»áááºááŸáááŒááºáž ááá¯ááá¯ááœááºáá°ááŒááºážá ááŒá¿áá¬ááŸááá±á¬áá±ážááŒááºážááŸá¯áá»á¬ážá¡ááœáẠá¡á á®á¡á ááºáá áºáá¯áááºáá±á¬ááºááẠááá¯á¡ááºáá«ááá¬ážá ááá·áºáá±ážááŒááºážáá»ááºááẠáá¯á¶ááŸáẠSQL ááŒá áºáá±á¬á¡áá« áááºážááẠááŒá¿áá¬ááá¯ááºáá«á
- áá±ážááœááºážáá»á¬ážááᯠááŒááºáááºá¡áá¯á¶ážááŒá¯ááŒááºážá áááºážááẠááá¯ážááá¯áž SQL áá±á¬ááºážááŒá áºáá±á¬ááŒá±á¬áá·áº á¡ááŒá¬ážááá±á¬áá»ááºáá»á¬ážáá²ááá¯á· áá°áá®áá±á¬ SQL ááá¯ááºáá»á¬ážááᯠááœá²áá°ááá»áá« - áááºážááá¯áá»áŸáá±áá«á
áá»áœááºáá±á¬á·áºá¡ááŒááºá¡ááá±á¬á· á¡áá¯ááºáá®áá¬á á¡áááºážááá¯ááºááŒá®áž ááá±á¬áá»ááºáá»á¬ážá
áœá¬ááᯠáááŸááá²á·áá²á·á¡ááœááºááŒá±á¬áá·áº áá
áºáá»áááºáááºážááŸá¬ á¡ááœááºááá¯ážááŸááºážáá«áááºá
IDE ááŸáá·áº DB áááºáá±áá»á¬áá»á¬áž
ááá¯ážááŸááºážáá²á·áá±á·á ááºá¡áá¯ááºáá áºáá¯áá²á· á ááá¯ááºáá¡á±á¬ááºá áááŒá¬ááááá¯áááᯠáá»áœááºá¯ááºááá¯á·ááẠáá±áá¬áá±á·á áºááŸá á¡áá¬ááá¹áá¯á¡áá»áá¯á·ááᯠááŸá¬ááœá±ááá±á·ááŸááááºá á¥ááá¬á¡á¬ážááŒáá·áºá ááá¬ážááœááºáá áºáá¯ááᯠááŸá¬ááŒá®áž áááºážáááœá²á·á ááºážáá¯á¶ááᯠáá±á·áá¬ááŒááºáž (áááºááá·áºáá±á¬áºáá¶áá»á¬ážá áá±á¬á·áá»á¬ážá á¡ááœáŸááºážáá»á¬ážá ááá·áºáááºáá»ááºáá»á¬ážá á áááºááŒáá·áº á¡áá¯á¶ážááŒá¯ááŒáááº)á ááááºáá ẠIDE ááá¯á·ááá¯áẠDB-áááºáá±áá»á¬á¡áááºážáááºáá¶ááŸá ááááá¯á¶ážá¡áá±ááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠá€á¡áááºá¡áá»ááºážáá»á¬ážááᯠá¡ááá¡áá»áá»áŸá±á¬áºááá·áºáá«áááºá ááá¯á·ááŒá±á¬áá·áº ááŒááºáááºááŒá®áž ááá¯á¡ááºáá±á¬á¡áá»ááºá¡áááºáá»á¬ážáá«ááŸáááá·áº áááºážááá¯ážáá áºáá¯á¡á¬áž (á¡áá°ážáááŒáá·áº á¡áá±ážááŸáá±áá¬áá±á·á áºááá¯á· ááŸá±ážááœá±ážáá±á¬áá»áááºáááºááŸá¯ááŒáá·áº) áá±ážááœá²áááºá¡áá áá¬áá®áááºá á±á¬áá·áºá áá¬áááá¯áá² áá áºáá»áááºáááºážááŸá¬ááẠáááŸááá¬áá±á¬ á¡áá»ááºá¡áááºáá»á¬ážááẠáááºáááºááŒá®áž áá®áá»á±á¬áºááŸá¯ááŸáá á¡ááŸáá¯ááºáá¯á¶ážáá»á¬ážááᯠááááºážáááºážáá¬ážááŒááºáž áááŸááá«á ááá¯á·á¡ááŒááºá áá±áá¬áá±á·á áºááá¯ááá¯ááŸá¯ááºááœá±ážáá± ááá¯ááŒá®ážáá±á áááºážááá¯á·á¡áá±á¡ááœááºáá»á¬ážáá±áá±á áá«ááá¯áá¯ááºáá±á¬ááºááẠááá¯ááááºáá²áá±ááŒá áºáááºá
áá«áá±ááá·áº áá»á¬ážáá±á¬á¡á¬ážááŒáá·áº áá»áœááºáá±á¬áº mouse ááᯠááœáŸáá·áºáá áºááŒá®áž áá¯ááºáá±ážááá¯ááºáá¯á¶áá«áá²á "HR" schema ááœáẠáááºááá·áºááá¬ážáá»á¬áž (ááŸáá·áº áááºááá·áº áá¯ááºááá¹áááá»á¬áž) ááᯠááŸá¬ááœá±ááẠááá¯á¡ááºáááºááá¯áá«á áá¯á·á DBMS á¡áá»á¬ážá á¯ááœáẠinformation_schema á០á€ááá¯ážááŸááºážáá±á¬áá±ážááŒááºážáá»ááºááŒáá·áº ááá¯áá»ááºáá±á¬ááááºááᯠáááá¯ááºáááº-
select table_name
, ...
from information_schema.tables
where schema = 'HR'
áá±áá¬áá±á·á áºá០áá±áá¬áá±á·á áºá¡ááá DBMS áá áºáá¯á á®á á áœááºážáááºáá±á«áºáá°áááºá ááá¯áá²á·ááá¯á·áá±á¬ ááá¯ážáá¬ážááá¬ážáá»á¬ážá á¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážááẠááœá²ááŒá¬ážáááºá á¥ááá¬á MySQL á¡ááœááºá áá°áá®áá±á¬áááºááœáŸááºážá á¬á¡á¯ááºá០ဠDBMS á¡ááœáẠáá®ážááŒá¬ážááá¬ážáá±á¬ááºáá»á¬ážááᯠáááºáááá¯ááºáááº-
select table_name
, storage_engine -- ÐÑпПлÑзÑеЌÑй "ЎвОжПк" ("MyISAM", "InnoDB" etc)
, row_format -- ЀПÑÐŒÐ°Ñ ÑÑÑПкО ("Fixed", "Dynamic" etc)
, ...
from information_schema.tables
where schema = 'HR'
Oracle ááẠinformation_schema ááᯠááááá±á¬áºáááºáž áááºážááœááºááŸááááºá
select table_name
, pct_free -- ÐОМОЌÑÐŒ ÑвПбПЎМПгП ЌеÑÑа в блПке ЎаММÑÑ
(%)
, pct_used -- ÐОМОЌÑÐŒ ОÑпПлÑзÑеЌПгП ЌеÑÑа в блПке ЎаММÑÑ
(%)
, last_analyzed -- ÐаÑа пПÑлеЎМегП ÑбПÑа ÑÑаÑОÑÑОкО
, ...
from all_tables
where owner = 'HR'
ClickHouse ááẠáá»áœááºážáá»ááºááá¯ááºáá«
select name
, engine -- ÐÑпПлÑзÑеЌÑй "ЎвОжПк" ("MergeTree", "Dictionary" etc)
, ...
from system.tables
where database = 'HR'
á¡áá¬ážáá°áá áºáá¯áá¯ááᯠCassandra ááœááºáá¯ááºáá±á¬ááºááá¯ááºááẠ(ááá¬ážáá»á¬ážááŸáá·áº áá±á¬á·ááœááºáá»á¬ážá¡á á¬áž áá±á¬áºáá¶áááá¬ážá á¯áá»á¬ážáá«ááŸááááº)
select columnfamily_name
, compaction_strategy_class -- СÑÑаÑÐµÐ³ÐžÑ ÑбПÑкО ÐŒÑÑПÑа
, gc_grace_seconds -- ÐÑÐµÐŒÑ Ð¶ÐžÐ·ÐœÐž ÐŒÑÑПÑа
, ...
from system.schema_columnfamilies
where keyspace_name = 'HR'
á¡ááŒá¬ážáá±á¬ áá±áá¬áá±á·á
áºá¡áá»á¬ážá
á¯á¡ááœááºá á¡áá¬ážáá°áá±ážááœááºážáá»á¬áž (Mongo áááºáá»áŸááº) ááŸááá¬ááá¯ááºáááºá
áá¯ááºáá«áááºá á€áááºážááŒáá·áº áááºááẠááá¬ážáá»á¬ážá¡ááŒá±á¬ááºážáá¬áá áá±áá¯áá»á¡á¬ážááŒáá·áº áááºááá·áºá¡áá¬ááá¹áá¯ááŸáá·áºáááºáááºááá·áº á¡áá»ááºá¡áááºááá¯áááᯠáááºáááá¯ááºáááºááŒá
áºáááºá á¡áá«á¡á¬ážáá»á±á¬áºá
áœá¬á ááŒááºáá¬áá°áá»á¬ážááẠááá°áá®áá±á¬áá±áá¬áá±á·á
áºáá»á¬ážá¡ááœáẠááá¯áá¯ááºááᯠáá»áŸáá±ááŒáááºá á¥ááá¬á habra áá±á¬ááºážáá«ážá
á®ážáá®ážáá»á¬ážááœáẠâPostgreSQL áá±áá¬áá±á·á
áºáá»á¬ážááᯠááŸááºáááºážáááºáááºá¡ááœáẠáá¯ááºáá±á¬ááºáá»ááºáá»á¬ážâ (á¥ááá¬á
ááááºá¡áá±ááŒáá·áºá á¡áá¬ááá¹áá¯áá»á¬ážááᯠááœá¬ážáá¬ááŸá¬ááœá±ááŒááºážááŸáá·áº ááŸá¬ááœá±ááŒááºážáááºážáááºážááẠááá¯ááá¯ááŒá±á¬ááºážááœááºááŒááºááœááºááŒá
áºááŒá®áž á¡áá»áááºáá¯ááºáááºáá¬á
á±áᬠááá¯ááá¯á¡ááºááá·áºáá¯á¶á
á¶ááŒáá·áº á¡áá»ááºá¡áááºá¡ááá¡áá»ááᯠáááºáááá¯ááºá
á±ááẠ(á¥ááá¬á ááá¯á·á
áºááœááºáá±á¬áºááŒáá¬ážááá·áºá¡ááá¯ááºážá
á¡áá¬ááá¹áá¯áá»á¬ážááŸáá·áº áá¯ááºáá±á¬ááºááŸá¯áá»á¬áž
ááá¯á¡ááºáá±á¬ á¡áá¬ááá¹áá¯áá»á¬ážááᯠááŸá¬ááœá±ááœá±á·ááŸáááŒá®áž áá±á·áá¬ááŒá®ážáá±á¬ááºá áááºážááá¯á·ááŸáá·áº á¡áá¯á¶ážáááºáá±á¬ á¡áá¬áá áºáá¯ááᯠááŒá¯áá¯ááºááẠá¡áá»áááºáááºáá«ááŒá®á áá®ážáá¯ááºá០áááºáá»á±á¬ááºážáá»á¬ážááᯠáááŒá¯ááºáá² ááá¬áá¡ááá¯ááºážáááºá
ááá¬ážáá áºáá¯ááᯠáá»ááºááá¯ááºáá¯á¶ááŒáá·áº databases á¡á¬ážáá¯á¶ážáá®ážáá«ážááœáẠáá°áá®áá±áááºááŸá¬ áá»áŸáá¯á·ááŸááºáá»ááºááá¯ááºáá±á
drop table hr.persons
áá«áá±ááá·áº á
á¬ážááœá²áááºáá®ážááŸá¯áá²á·á¡áá° ááá¯á
áááºáááºá
á¬ážááá¯á·áá±á¬ááºážáá¬áá«áááºá áááºááá·áº DBMS áááᯠ(NoSQL á¡áá»á¬ážá¡ááŒá¬ážá¡áá«á¡áááº) ááẠáá¯á¶á
á¶áá
áºáá»áá¯áž ááá¯á·ááá¯áẠá¡ááŒá¬ážáá
áºáá¯ááŒáá·áº âááá¬ážááá¯áááºáá®ážááá¯ááºáááºâ ááŸáá·áº áááºážáá¡áááá¡á
áááºá¡ááá¯ááºážááẠá¡áááºážááẠ(á¡áááºá áá±á¬áºáá¶á
á¬áááºážá áá±áá¬á¡áá»áá¯ážá¡á
á¬ážáá»á¬áž) ááœá²ááŒá¬ážáá±á¬áºáááºáž á¡ááŒá¬ážá¡áá±ážá
áááºá¡áá»ááºá¡áááºáá»á¬ážááŸá¬ áááááá¬áá¬ááœá²ááŒá¬ážááá¯ááºááŒá®áž áááºážáá±á«áºááœááºáá°áááºáááºá áá®ážááŒá¬áž DBMS á á¡ááœááºážááá¯ááºáž áááááá¬ááŸáá·áº á
áœááºážáááºáá»á¬ážá áá»áœááºáá±á¬áºá¡ááŒáá¯ááºáá¯á¶ážá¥ááá¬ááŸá¬ Oracle documentation ááœáẠ"create table" syntax á¡ááœáẠ"naked" BNFs áá»á¬ážáá¬ááŸááááºá
ááá¯á·á¡ááŒááºá DBMS á¡áá»á¬ážá¡ááŒá¬ážááœáẠá¡ááŒá¬áž DBMS áá»á¬ážááœáẠááááŸáááá¯ááºáá±á¬ áá®ážááŒá¬ážá¡áá¬ááá¹áá¯á¡áá»áá¯ážá¡á á¬ážáá»á¬ážááŸááááºá ááá¯á·á¡ááŒááºá áá»áœááºá¯ááºááá¯á·ááẠáá±áá¬áá±á·á áºá¡áá¬ááá¹áá¯áá»á¬ážáá±á«áºááœááºáá¬áá DBMS ááá¯ááºááá¯ááºááœááºáááºáž áá¯ááºáá±á¬ááºááŸá¯áá»á¬ážááᯠáá¯ááºáá±á¬ááºááá¯ááºáááºá á¥ááá¬á¡á¬ážááŒáá·áºá áá¯ááºáááºážá ááºáá áºáá¯ááᯠ"áááºáá áºáááº"á áááºááá¯áá®á§áááá¬á¡áá»áá¯á·ááᯠáááºááŸá¬ážáá±ážááŒááºážá ááŒá±áá¬áá¶ááŒááºážááᯠááœáá·áºááŒááºážá "áááºáááºáá¬" áá¯ááºááá¯á· ááŒá±á¬ááºážááŒááºážááŸáá·áº á¡ááŒá¬ážá¡áá¬áá»á¬ážá áœá¬ááᯠáá¯ááºáá±á¬ááºááá¯ááºáá«áááºá
á¡áá¯áááºážáááºážááœá²ááŒáá·áºáá¡á±á¬ááº
á¡áá¯á¶ážá¡áá»á¬ážáá¯á¶ážá¡áá¯ááºáá»á¬ážáá²ááŸáá áºáá¯ááŸá¬ áá±áá¬áá±á·á áºá¡áá¬ááá¹áá¯áá»á¬ážáá«ááŸááá±á¬ ááŒá±áá¯á¶áá áºáá¯áááºáá±á¬ááºáááºááŸáá·áº áááºážááá¯á·ááŒá¬ážááŸá á¡áá¬ááá¹áá¯áá»á¬ážááŸáá·áº áá»áááºáááºááŸá¯áá»á¬ážááᯠááŸááá±á¬áá¯ááºáá¯á¶ááŒáá·áºááŒáá·áºááŸá¯áááºááŒá áºáááºá ááááºáá ẠIDEá áá®ážááŒá¬áž "command line" utilitiesá á¡áá°ážááŒá¯ ááááºáá áºáááááá¬áá»á¬ážááŸáá·áº áá±á¬áºáááºááºáá»á¬áž áá®ážáá«ážááẠáááºážááᯠáá¯ááºáá±á¬ááºááá¯ááºáááºá áááºážááá¯á·ááẠááá·áºá¡ááœáẠ"áááºááá¯ááºááá±á¬ááº" áá áºáá¯áá¯ááᯠááœá²áá±ážáááºááŒá áºááŒá®ážá ááœá²á·á ááºážááŸá¯ááá¯áẠááá¯á·ááá¯áẠá¡ááºáá¬áá±á·á áºááŸá á¡ááŸááºááŒá áºááœááºáá»á¬ážááœáẠáá«áá¬áá®áá¬á¡áááºážáááºáá¡áá°á¡áá®ááŒáá·áº á€áá¯ááºáááºážá ááºááᯠá¡áááºážáááºááœáŸááºážááá¯ážááá¯ááºáááºá
áá«áá±ááá·áº áá®ááŒá¿áá¬ááᯠáá¯ááºáá²á·á¡áá°á¡áá®áá²á· á¡áá»á¬ážááŒá®áž ááá¯ážááŸááºážá áœá¬ ááŒá±ááŸááºážááá¯ááºáá«áááºá áááºááá·áºááŸá¯ááºááœá±ážááŸá¯á áá¯á¶áá»ááºáá»á¬ážááᯠáááºáá®ážáááºá¡ááœááºá áá»áœááºá¯ááºááá¯á·ááœáẠá¡áá°ážááŒá¯ markup áá¬áá¬á áá¬ážáá»á¬ážá áœá¬ (DOTá GraphML á áááº) ááŸáááŒá®áž áááºážááá¯á·á¡ááœáẠááá¯ááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááᯠáááºááŸá¯ááŒá®áž áá±á¬áºáááºá¡áá»áá¯ážáá»áá¯ážááŒáá·áº ááŒááºáá±á¬ááºááá¯ááºáá±á¬ á¡ááá®áá±ážááŸááºážáá áºáá¯áá¯á¶áž (GraphVizá PlantUMLá Mermaid) ááŸááááºá . áá±á¬ááºážááŒá®á áááºážááá¯á·ááŒá¬ážááŸá á¡áá¬ááá¹áá¯áá»á¬ážááŸáá·áº áá»áááºáááºááŸá¯áá»á¬ážá¡ááŒá±á¬ááºáž ááááºážá¡áá»ááºá¡áááºáá»á¬áž áááºááá¯á·ááá°ááááºááᯠáá»áœááºá¯ááºááá¯á· áááá¬ážááŒá®ážááŒá áºáááºá
á€áááºááŸá¬ PlantUML ááŸáá·áº á¡áá¯á¶ážááŒá¯á áááºážááẠáááºááá¯á·áááºáá¯á¶ááŒá
áºááá¯ááºáááºáá°áá±á¬ ááá°áá¬áá±ážáá
áºáá¯ááŒá
áºáááºá
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'
áááºáááºážáááºážááŒáá¯ážá
á¬ážáá»áŸááº, ááá¯á·áá±á¬ááºá¡áá±á«áºá¡ááŒá±áá¶áááºá
SQL query ááẠá¡áááºážááẠááá¯ááŸá¯ááºááœá±ážáááºá
-- Капка
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'
á¡áá®ážáááºááŒáá·áºáááºááá¯áá»áŸáẠáá±á¬ááºá¡á±á¬ááºááœáẠá
áááºáá°ážáá¯á¶áá±á¬áºááŒááºážáááááá¬áá»á¬ážá
áœá¬áááºáááºáž á¡áá¬ážáá°áá±ážááŒááºážáá»ááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áá«áááºá ááŸááºáá«áááºá á€áá±á¬ááºážááá¯ááŸá¯áá»á¬ážááẠáá»á¬ážáá±á¬á¡á¬ážááŒáá·áº áá±ážáááºáááºá
áááºááá áºáá»á¬ážááŸáá·áº á á±á¬áá·áºááŒáá·áºááŒááºážá
á¡á ááºá¡áá¬á¡á¬ážááŒáá·áº ááŸá¯ááºááœá±ážáá±á¬ á¡ááŒá±á¬ááºážá¡áá¬áá áºáá¯ááá¯á· áááºááœá¬ážááŒáá«á áá¯á· - áá±áá¬áá±á·á Ạá áœááºážáá±á¬ááºááẠá á±á¬áá·áºááŒáá·áºááŒááºážá âáá°áááºáá»ááºážáá áºáá±á¬ááºâ á áá»áœááºáá±á¬á·áºááᯠááŒá±á¬ááŒáá²á· ááŒá áºáááºááŸááºáá±ážáá áºáá¯ááᯠáááááááá«áááºá á¡ááŒá¬ážááá±á¬áá»ááºáá áºáá¯ááœáẠá¡á¬ážáá±á¬ááºážáá±á¬ááºážááẠDBA áá áºáá¯ááŸáá developer á¡áááºážáááºá áá°á·ááᯠááá¯ááºááá¯ááºááá¯ááºáá» ááááŒááŒá®ážá ááá¯á·ááá¯áẠáá°ááá¯ááºááá¯áẠááŒááºáá°ážááẠ(áá±á¬ááá¬áá¡áá áá°ááẠáá±á¬ááºááẠá¡áá±á¬ááºá¡á¡á¯á¶ááœáẠá¡áá¯ááºáá¯ááºáá±áá±á¬áºáááºáž)á âXâ áá¬áá®ááœááºá áááºáá®áá±á¬ááºážáá»áá°ááŒá®ážáá»á¬ážá á¡áá±á¬ááºážá¡áááºá áá áºááẠáá áºááẠâááá¯ážááœá¬ážâ áá¬áá±á¬á¡áá«ááœáẠOracle Enterprise Manager áá¶á០ááááºáá áºáá¯á¶áá»á¬ážááᯠááááºáááááºáá±ážááá¯á·ááŒá®áž âáá¬ážáááºááá¯ááºááŸá¯â á¡ááœáẠá¡áá®áá±á¬ááºá¡ááŸááºá¡áá¬ážááŒáá·áº á¡áá±ážááŒá®ážáá±á¬áá±áá¬áá»á¬ážááᯠááá¯áá áá¯áẠáá®ážáá±á¬ááºážááá¯ážááŒáá²á·ááẠ( áá«ááᯠáá±á«á·áá±á«á·áá«ážáá«áž áá¬ážááá¯á·á á¡áá»á¬ážááŒá®áž ááá°áá®áá²á·áá°áž)á ááŒá®ážáá±á¬á· áá® "áá¬ááºáá¯á¶áááº" ááᯠá¡ááŒá±áá¶ááŒá®áž áá»áœááºá áá¯ááá²á·ááááºá áá áºáá»áááºáááºážááŸá¬áááºá á¡áááºááŒá±á¬áá·áºááá¯áá±á¬áº Enterprise Manager ááẠá¡ááá¯ážáááºáá±á¬ (á áá¬ážáá¯á¶ážá á¡á¬áá¯á¶ááŸá áºáááºáá¯á¶ážááœááº) áááá¬ááᯠáááºáá°áá»áŸ áá¯á¶ážá áœá²ááœáá·áºáááá²á·áá±á á áá áºááẠááŸá¯ááºááœá±ážááŒá®áž á á»á±ážááŒá®ážáááºá áá¯ááºáááẠ"áá±á¬á·ááºáá²á¡ááºáá»ááºáá®áá¬áá»á¬ážááẠáá áºáá¯áá¯ááᯠááááá á¡áá¬á¡á¬ážáá¯á¶ážááᯠáá»áá¯ážáá»ááºáááº" ááá¯á·ááŒá±á¬áá·áºá developer áá»á¬ážááẠáááááºáá»á¬ážááááºáá±áá¬ááŸáá·áº á¡ááŒá±á¬ááºážáááºážááᯠ"áá»ááºááŒááºááá¯ááºááœá±á·" ááœá±á·ááŸáááŒá®áž patch áá áºáá¯ááᯠáá¯ááºááŒááºáá²á·áááºá ááá±ážáá±á¬á·áá±á¬á¡áá¬áááºááœáẠDBA á០ááŒáááºážááŒá±á¬ááºá á¬áá áºá á±á¬áẠáááºáá¶áá±á¬ááºááŸáááá¬áá«á áá°ááá¯ááºáž áááºááŒááºážáá»á áááºážááá¯á·á áááºááŸááá¬áááºáá»á¬áž (áá±ážá á¬á¡áá áºá¡áá) ááá¯á· ááŒááºááœá¬ážááŒáááºááŒá áºáááºá
ááá¯á·áá±á¬áº á
á±á¬áá·áºááŒáá·áºáá±ážáá¯ááºáááºážá
ááºááẠááá¯ááá¯áá»á±á¬áºá
áá¬áá±á¬ááºážááŒá®áž áá±á¬áºááœá±á
áœá¬ááŒáá·áºááŸá¯ááá¯ááºáᬠá¡áá±ážá¡ááŒá®ážáá¯á¶ážááŸá¬ áá°ááá¯ááºážá¡ááœáẠáááºáá±á¬ááºá¡áá¯á¶ážááŒá¯ááá¯ááºááŒá®áž ááœáá·áºáááºážááŒááºáá¬ááŸá¯ááŒá
áºáááºá áááºáá
á±á¬áá·áºááŒáá·áºáá±ážá
áá
áºáá»á¬áž (á¡ááŸááºááááºá¡áá¯á¶ážáááºááŒá®áž áá»á¬ážá
áœá¬áá±á¬ááá
á¹á
áá»á¬ážááœáẠá¡á
á¬ážááá¯ážááááá±á¬) á¡ááá¯áá
áºáá¯á¡áá±ááŒáá·áº áááºážáá¡ááŒá±áá¶á¡á
áááºá¡ááá¯ááºáž á¡áááºážáá¯á¶ážááŒá
áºáááºá áááºááá·áº DBMS áááᯠáááºážá áááºááŸáá¡ááŒá±á¡áá±ááŸáá·áº á
áœááºážáá±á¬ááºáááºááá¯ááºáᬠá¡áá»ááºá¡áááºáá»á¬ážááᯠáá»áŸáá±ááẠááœááºáááºá
áœá¬ á¡ááá²á·ááŒá
áºáááºá áá°áá®áá±á¬ âááœá±ážá
áœááºážáá±á¬â Oracle DB ááœááºá áá¯ááºáááºážá
ááºáá»á¬ážááŸáá·áº áááºááŸááºáá»á¬ážá០ááŒá¬ážáá¶áááºááŸáºá¡ááŒá±á¡áá±á¡áá á
áá
áºááŒáá·áºááŸá¯ááŸá¯áá»á¬ážá០á
áœááºážáá±á¬ááºáááºááŸáá·áºáááºáááºááá·áº á¡áá»ááºá¡áááºá¡á¬ážáá¯á¶ážáá®ážáá«ážááᯠáááŸáááá¯ááºáá«áááºá (á¥ááá¬á
ááá¯á·ááŒá±á¬áá·áº á
áááºááŒáá¯áẠsql queries áá»á¬ážááá¯áá¯ááºáá±á¬ááºááá¯ááºáá±á¬ áááºááá
áºá
á¯áá±á¬ááºážáá° (Telegrafá Metricbeatá Collectd) á á€áááºááá
áºáá»á¬áž ááá¯ááŸá±á¬ááºááŸá¯ (InfluxDBá Elasticsearchá Timescaledb) ááŸáá·áº visualizer (Grafanaá Kibana) ááá¯á·ááᯠáááºáááá¯ááºááẠá ááŸáá·áº á¡ááŒá¬ážá
áá
áºáá
áºáá¯áá¯á¶áž áááºááá
áºáá»á¬áž (á¥ááá¬á á¡ááá®áá±ážááŸááºážáá¬áá¬ááŸá OS ááŸáááŸááá±á¬ á
áááºááŒáá·áº) ááŸáá·áº á¡áá®ážáááºáá±á«ááºážá
ááºážááá·áº ááŒá±á¬ááºážááœááºááŒááºááœáẠá
á±á¬áá·áºááŒáá·áºáá±ážá
áá
áºá á¥ááá¬á¡á¬ážááŒáá·áºá áááºážááᯠInfluxDB + Grafana áá±á«ááºážá
ááºááŸá¯ááŸáá·áº á
áá
áºááŒáá·áºááŸá¯ááŸá¯áá»á¬ážá¡ááœáẠáá±ážááŒááºážáá»ááºá¡á
á¯á¶ááᯠá¡áá¯á¶ážááŒá¯ááá·áº pgwatch2 ááœáẠáá¯ááºáá±á¬ááºáááºá
á á¯á á¯áá±á«ááºáž
áááºážááẠáá¯á¶ááŸáẠSQL áá¯ááºááᯠá¡áá¯á¶ážááŒá¯á áá»áœááºá¯ááºááá¯á·ááá±áá¬áá±á·á áºááœáẠáá¯ááºáá±á¬ááºááá¯ááºááá·áº á¡áá®ážá ááºáá¯á¶ážá á¬áááºážáá áºáá¯áá»áŸáá¬ááŒá áºáááºá áá±á¬ááºáááºá¡áá¯á¶ážááŒá¯ááŸá¯áá»á¬ážá áœá¬ááᯠáááºááœá±á·ááá¯ááºáááºáᯠáá¯á¶ááŒááºáá«áááºá comment ááœááºáá±ážáá«á ááá¯á·á¡ááŒáẠá€á¡áá¬á¡á¬ážáá¯á¶ážááᯠá¡ááá¯á¡áá»á±á¬ááºááŒááºáá¯ááºáááºáž (ááŸáá·áº á¡áá±ážááŒá®ážáá¯á¶ážááŸá¬ á¡áááºááŒá±á¬áá·áº) á¡ááŒá±á¬ááºážááŸáá·áº áááºážááᯠáááºá CI/CD ááá¯ááºááá¯ááºážááœáẠáá±á¬ááºáá áºááŒááẠááá·áºááœááºážááẠááœá±ážááœá±ážáá«áááºá
source: www.habr.com