SQL, ΠΊΠ°ΠΊΠ²ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎ-ΠΏΡΠΎΡΡΠΎ? ΠΡΠ΅ΠΊΠΈ ΠΎΡ Π½Π°Ρ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ ΠΏΡΠΎΡΡΠ° Π·Π°ΡΠ²ΠΊΠ° - ΠΏΠΈΡΠ΅ΠΌ ΠΈΠ·Π±Π΅ΡΠ΅ΡΠ΅, ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΠΈΠ·Π±ΡΠΎΠΉΡΠ΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΈ ΠΎΡ, ΠΈΠΌΠ΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°, Π½ΡΠΊΠΎΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡ Π² ΠΊΡΠ΄Π΅ΡΠΎ ΠΈ ΡΠΎΠ²Π° Π΅ Π²ΡΠΈΡΠΊΠΎ - ΠΏΠΎΠ»Π΅Π·Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ ΡΠ° Π² Π½Π°ΡΠΈΡ Π΄ΠΆΠΎΠ± ΠΈ (ΠΏΠΎΡΡΠΈ) Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΊΠΎΡ Π‘Π£ΠΠ Π΅ ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠ°ΠΊΠ° ΠΏΠΎ ΡΠΎΠ²Π° Π²ΡΠ΅ΠΌΠ΅ (ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅ Π±ΠΈ
Π Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ Π½Π°ΠΏΡΠ°Π²ΠΎ ΠΎΡ
ΠΠ±Π΅ΠΊΡΠ½ΠΎ-ΡΠ΅Π»Π°ΡΠΈΠΎΠ½Π½ΠΎ ΠΊΠ°ΡΡΠΎΠ³ΡΠ°ΡΠΈΡΠ°Π½Π΅
ΠΠΎΠ΄Π΄ΡΡΠΆΠ½ΠΈΡΠΈΡΠ΅ Π½Π° ORM ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΎ ΡΠ΅Π½ΡΡ ΡΠΊΠΎΡΠΎΡΡΡΠ° ΠΈ Π»Π΅ΠΊΠΎΡΠ°ΡΠ° Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΠ° ΠΎΡ Π‘Π£ΠΠ ΠΈ ΡΠΈΡΡΠΈΡ ΠΊΠΎΠ΄. ΠΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ Π½Π°Ρ ΠΊΠΎΠ΄ΡΡ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ (ΠΈ ΡΠ΅ΡΡΠΎ ΡΠ°ΠΌΠ°ΡΠ° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ)
ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°ΠΊΠ°...
@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 ΠΊΠΎΠ΄. ΠΠ΅ΠΆΠ΄Ρ Π΄ΡΡΠ³ΠΎΡΠΎ, ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ ΡΠ΅ ΠΎΠΏΠΈΡΠ²Π°Ρ Π²ΡΡΡΠ΅ΡΠΊΠΈ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΎΠ»ΠΈΡΠ°Ρ ΠΎΡ ΡΠ²ΠΎΡΡΠ° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ Ρ ΠΊΠΈΠ»ΠΎΠΌΠ΅ΡΡΠΈ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΈ, ΠΊΠΎΠ΅ΡΠΎ ΠΏΠΎΠΊΠ°Π·Π²Π° Π½ΡΠΊΠΎΠΈ
ΠΡ Π΄ΡΡΠ³Π°ΡΠ° ΡΡΡΠ°Π½Π° Π½Π° Π±Π°ΡΠΈΠΊΠ°Π΄ΠΈΡΠ΅, ΠΏΡΠΈΠ²ΡΡΠΆΠ΅Π½ΠΈΡΠΈΡΠ΅ Π½Π° ΡΠΈΡΡΠΈΡ βΡΡΡΠ½ΠΎ ΠΈΠ·ΡΠ°Π±ΠΎΡΠ΅Π½β SQL ΠΎΡΠ±Π΅Π»ΡΠ·Π²Π°Ρ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡΠ° Π΄Π° ΠΈΠ·ΡΡΠΈΡΠΊΠ°Ρ ΡΠ΅Π»ΠΈΡ ΡΠΎΠΊ ΠΎΡ ΡΠ²ΠΎΡΡΠ° Π‘Π£ΠΠ Π±Π΅Π· Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΡΠ»ΠΎΠ΅Π²Π΅ ΠΈ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΈ. Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ²Π° ΡΠ΅ ΠΏΠΎΡΠ²ΡΠ²Π°Ρ βdata-centricβ ΠΏΡΠΎΠ΅ΠΊΡΠΈ, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈ Ρ ΠΎΡΠ° ΡΡΠ°ΡΡΠ²Π°Ρ Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ (ΡΠ΅ ΡΡΡΠΎ ΡΠ° βbasicistsβ, ΡΠ΅ ΡΡΡΠΎ ΡΠ° βbasicistsβ, ΡΠ΅ ΡΡΡΠΎ ΡΠ° βbasdenersβ ΠΈ Ρ.Π½.), Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ ΡΡΡΠ±Π²Π° ΡΠ°ΠΌΠΎ Π΄Π° βΠΈΠ·Π΄ΡΡΠΏΠ°ΡΠ΅β Π³ΠΎΡΠΎΠ²ΠΈΡΠ΅ ΠΈΠ·Π³Π»Π΅Π΄ΠΈ ΠΈ ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠΈ, Π±Π΅Π· Π΄Π° Π½Π°Π²Π»ΠΈΠ·Π°ΡΠ΅ Π² ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ.
ΠΠΌΠΈ Π°ΠΊΠΎ ΠΈΠΌΠ°Ρ
ΠΌΠ΅ Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΎΡΠΎ ΠΎΡ Π΄Π²Π°ΡΠ° ΡΠ²ΡΡΠ°? ΠΠ°ΠΊ ΡΡΠ°Π²Π° ΡΠΎΠ²Π° Π² Π΅Π΄ΠΈΠ½ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ΅Π½ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Ρ ΠΆΠΈΠ·Π½Π΅ΡΡΠ²ΡΡΠΆΠ΄Π°Π²Π°ΡΠΎ ΠΈΠΌΠ΅
Clojure Π΅ ΡΡΡΠ°Ρ ΠΎΡΠ΅Π½ Π΅Π·ΠΈΠΊ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° DSL, Π½ΠΎ ΡΠ°ΠΌΠΈΡΡ SQL Π΅ ΡΡΡΠ°Ρ ΠΎΡΠ΅Π½ DSL ΠΈ Π½ΡΠΌΠ°ΠΌΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ Π΄ΡΡΠ³. S-ΠΈΠ·ΡΠ°Π·ΠΈΡΠ΅ ΡΠ° ΡΡΡΠ°Ρ ΠΎΡΠ½ΠΈ, Π½ΠΎ Π½Π΅ Π΄ΠΎΠ±Π°Π²ΡΡ Π½ΠΈΡΠΎ Π½ΠΎΠ²ΠΎ ΡΡΠΊ. Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ²Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΡΠΊΠΎΠ±ΠΈ Π·Π°ΡΠ°Π΄ΠΈ ΡΠΊΠΎΠ±ΠΈΡΠ΅. ΠΠ΅ ΡΠ΅ ΡΡΠ³Π»Π°ΡΡΠ²Π°ΠΌ? Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΈΠ·ΡΠ°ΠΊΠ°ΠΉΡΠ΅ ΠΌΠΎΠΌΠ΅Π½ΡΠ°, Π² ΠΊΠΎΠΉΡΠΎ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΡΡΠ° Π½Π°Π΄ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ Π·Π°ΠΏΠΎΡΠ½Π΅ Π΄Π° ΠΈΠ·ΡΠΈΡΠ° ΠΈ Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ Π΄Π° ΡΠ΅ Π±ΠΎΡΠΈΡΠ΅ Ρ ΡΡΠ½ΠΊΡΠΈΡΡΠ° (ΡΡΡΠΎΠ²-sql)
Π ΡΠ°ΠΊΠ°, ΠΊΠ°ΠΊΠ²ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²Ρ? ΠΠ΅ΠΊΠ° ΠΎΡΡΠ°Π²ΠΈΠΌ 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 ΡΠ°ΠΌ ΠΏΠΎ ΡΠ΅Π±Π΅ ΡΠΈβ, ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΡΠ΅:
- ΠΡΠΌΠ° ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ½ΠΈ ΠΈΠ·Π½Π΅Π½Π°Π΄ΠΈ. ΠΠ°ΡΠ°ΡΠ° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ (ΠΊΠ°ΠΊΡΠΎ Π²ΡΡΠΊΠ° Π΄ΡΡΠ³Π°) Π½Π΅ Π΅ 100% ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠ° ΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ° SQL - Π½ΠΎ ΡΠΎΠ²Π° Π½ΡΠΌΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π·Π° Yesql. ΠΠΈΠΊΠΎΠ³Π° Π½ΡΠΌΠ° Π΄Π° Π³ΡΠ±ΠΈΡΠ΅ Π²ΡΠ΅ΠΌΠ΅ Π² ΡΡΡΡΠ΅Π½Π΅ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ Ρ SQL Π΅ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ΅Π½ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ. ΠΠΈΠΊΠΎΠ³Π° Π½ΡΠΌΠ° Π΄Π° ΡΠ΅ Π½Π°Π»Π°Π³Π° Π΄Π° ΡΠ΅ Π²ΡΡΡΠ°ΡΠ΅ ΠΊΡΠΌ ΡΡΠ½ΠΊΡΠΈΡ (raw-sql "some('funky'::SYNTAX)")).
- ΠΠ°ΠΉ-Π΄ΠΎΠ±ΡΠ° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° ΡΠ΅Π΄Π°ΠΊΡΠΎΡ. ΠΠ°ΡΠΈΡΡ ΡΠ΅Π΄Π°ΠΊΡΠΎΡ Π²Π΅ΡΠ΅ ΠΈΠΌΠ° ΠΎΡΠ»ΠΈΡΠ½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° SQL. ΠΠ°ΡΠΎ Π·Π°ΠΏΠ°Π·ΠΈΡΠ΅ SQL ΠΊΠ°ΡΠΎ SQL, ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΡΡΠΎ Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅.
- ΠΠΊΠΈΠΏΠ½Π° ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ. ΠΠ°ΡΠΈΡΠ΅ DBA ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ΡΠ°Ρ ΠΈ Π·Π°ΠΏΠΈΡΠ²Π°Ρ SQL, ΠΊΠΎΠΉΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π²ΡΠ² Π²Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ Clojure.
- ΠΠΎ-Π»Π΅ΡΠ½Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ°. Π’ΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·Π³ΡΠ°Π΄ΠΈΡΠ΅ ΠΏΠ»Π°Π½ Π·Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½Π° Π·Π°ΡΠ²ΠΊΠ°? Π’ΠΎΠ²Π° Π½Π΅ Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΠΊΠΎΠ³Π°ΡΠΎ Π²Π°ΡΠ°ΡΠ° Π·Π°ΡΠ²ΠΊΠ° Π΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ SQL.
- ΠΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Π·Π°ΡΠ²ΠΊΠΈ. ΠΠ»ΡΠ·Π½Π΅ΡΠ΅ ΠΈ ΠΏΡΡΠ½Π΅ΡΠ΅ ΡΡΡΠΈΡΠ΅ ΡΠ΅Π·ΠΈ SQL ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π² Π΄ΡΡΠ³ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ, Π·Π°ΡΠΎΡΠΎ ΡΠΎΠ²Π° Π΅ ΠΏΡΠΎΡΡΠΎ ΡΡΠ°Ρ SQL - ΠΏΡΠΎΡΡΠΎ Π³ΠΎ ΡΠΏΠΎΠ΄Π΅Π»Π΅ΡΠ΅.
ΠΠΎ ΠΌΠΎΠ΅ ΠΌΠ½Π΅Π½ΠΈΠ΅ ΠΈΠ΄Π΅ΡΡΠ° Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π³ΠΎΡΠΈΠ½Π° ΠΈ Π² ΡΡΡΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΠ°, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΡΡΠΎ ΠΏΡΠΎΠ΅ΠΊΡΡΡ ΡΠΏΠ΅ΡΠ΅Π»ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ
IDE & DB ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡΠΈ
ΠΠ΅ΠΊΠ° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ Ρ Π΅Π΄Π½Π° ΠΏΡΠΎΡΡΠ° Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½Π° Π·Π°Π΄Π°ΡΠ°. Π§Π΅ΡΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΡΡΠΈΠΌ Π½ΡΠΊΠΎΠΈ ΠΎΠ±Π΅ΠΊΡΠΈ Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΠΌ ΡΠ°Π±Π»ΠΈΡΠ° Π² ΡΡ Π΅ΠΌΠ°ΡΠ° ΠΈ Π΄Π° ΠΏΡΠΎΡΡΠΈΠΌ Π½Π΅ΠΉΠ½Π°ΡΠ° ΡΡΡΡΠΊΡΡΡΠ° (ΠΊΠ°ΠΊΠ²ΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΈ, ΠΊΠ»ΡΡΠΎΠ²Π΅, ΠΈΠ½Π΄Π΅ΠΊΡΠΈ, ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΈ Ρ.Π½. ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ). Π ΠΎΡ Π²ΡΡΠΊΠ° Π³ΡΠ°ΡΠΈΡΠ½Π° IDE ΠΈΠ»ΠΈ ΠΌΠ°Π»ΡΠΊ DB-ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡ, Π½Π° ΠΏΡΡΠ²ΠΎ ΠΌΡΡΡΠΎ, ΠΎΡΠ°ΠΊΠ²Π°ΠΌΠ΅ ΡΠΎΡΠ½ΠΎ ΡΠ΅Π·ΠΈ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ. Π’Π°ΠΊΠ° ΡΠ΅ Π΄Π° Π΅ Π±ΡΡΠ·ΠΎ ΠΈ Π΄Π° Π½Π΅ ΡΠ΅ Π½Π°Π»Π°Π³Π° Π΄Π° ΡΠ°ΠΊΠ°ΡΠ΅ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½ ΡΠ°Ρ, Π΄ΠΎΠΊΠ°ΡΠΎ ΡΠ΅ ΠΈΠ·ΡΠ΅Π³Π»ΠΈ ΠΏΡΠΎΠ·ΠΎΡΠ΅Ρ Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ°ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ (ΠΎΡΠΎΠ±Π΅Π½ΠΎ ΠΏΡΠΈ Π±Π°Π²Π½Π° Π²ΡΡΠ·ΠΊΠ° Ρ ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ), Π° Π² ΡΡΡΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΏΠΎΠ»ΡΡΠ΅Π½Π°ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π΅ ΡΠ²Π΅ΠΆΠ° ΠΈ Π°ΠΊΡΡΠ°Π»Π½Π°, ΠΈ Π½Π΅ ΠΊΠ΅ΡΠΈΡΠ°Π½ΠΈ Π±ΠΎΠΊΠ»ΡΡΠΈ. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, ΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΠΏΠΎ-ΡΠ»ΠΎΠΆΠ½Π° ΠΈ ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌΠ° Π΅ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ ΠΈ ΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌ Π΅ ΡΠ΅Ρ Π½ΠΈΡΡ Π±ΡΠΎΠΉ, ΡΠΎΠ»ΠΊΠΎΠ²Π° ΠΏΠΎ-ΡΡΡΠ΄Π½ΠΎ Π΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΡΠΎΠ²Π°.
ΠΠΎ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΈΠ·Ρ Π²ΡΡΠ»ΡΠΌ ΠΌΠΈΡΠΊΠ°ΡΠ° ΠΈ ΠΏΡΠΎΡΡΠΎ ΠΏΠΈΡΠ° ΠΊΠΎΠ΄. ΠΠ° ΡΠ΅ΡΠ΅ΠΌ, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ ΠΊΠΎΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ (ΠΈ Ρ ΠΊΠ°ΠΊΠ²ΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π°) ΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ°Ρ Π² ΡΡ Π΅ΠΌΠ°ΡΠ° "HR". Π ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ Π‘Π£ΠΠ ΠΆΠ΅Π»Π°Π½ΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎΡΡΠΈΠ³Π½Π°Ρ Ρ ΡΠ°Π·ΠΈ ΠΏΡΠΎΡΡΠ° Π·Π°ΡΠ²ΠΊΠ° ΠΎΡ information_schema:
select table_name
, ...
from information_schema.tables
where schema = 'HR'
ΠΡ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ Π΄ΠΎ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ°ΠΊΠΈΠ²Π° ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠ½ΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ Π²Π°ΡΠΈΡΠ° Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° Π²ΡΡΠΊΠ° Π‘Π£ΠΠ. Π, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π° MySQL, ΠΎΡ ΡΡΡΠΈΡ ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΈΠΊ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°, ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ Π·Π° ΡΠ°Π·ΠΈ Π‘Π£ΠΠ:
select table_name
, storage_engine -- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ "Π΄Π²ΠΈΠΆΠΎΠΊ" ("MyISAM", "InnoDB" etc)
, row_format -- Π€ΠΎΡΠΌΠ°Ρ ΡΡΡΠΎΠΊΠΈ ("Fixed", "Dynamic" etc)
, ...
from information_schema.tables
where schema = 'HR'
Oracle Π½Π΅ Π·Π½Π°Π΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ_ΡΡ
Π΅ΠΌΠ°, Π½ΠΎ ΠΈΠΌΠ°
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β (
Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ²Π° ΡΠΎΠ·ΠΈ ΠΌΠ΅ΡΠΎΠ΄ Π·Π° Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡ ΠΈ ΡΡΡΡΠ΅Π½Π΅ Π½Π° ΠΎΠ±Π΅ΠΊΡΠΈ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π³ΡΠ²ΠΊΠ°Π², ΡΠΏΠ΅ΡΡΡΠ²Π° ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΈ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΡΠΎΡΠ½ΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ° Π²ΡΠ² ΡΠΎΡΠΌΠ°ΡΠ°, Π² ΠΊΠΎΡΡΠΎ ΡΠ΅Π³Π° Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠ° (ΠΊΠ°ΠΊΡΠΎ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π΅ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π² ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡΡΠ°
ΠΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ ΠΎΠ±Π΅ΠΊΡΠΈ
Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ Π½Π°ΠΌΠ΅ΡΠΈΡ ΠΌΠ΅ ΠΈ ΠΏΡΠΎΡΡΠΈΡ ΠΌΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΠΎΠ±Π΅ΠΊΡΠΈ, Π΅ Π²ΡΠ΅ΠΌΠ΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ Π½Π΅ΡΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Ρ ΡΡΡ . ΠΡΡΠ΅ΡΡΠ²Π΅Π½ΠΎ, ΡΡΡΠΎ Π±Π΅Π· Π΄Π° ΠΎΡΠ΄Π΅Π»ΡΡΠ΅ ΠΏΡΡΡΡΠΈΡΠ΅ ΡΠΈ ΠΎΡ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠ°ΡΠ°.
ΠΠ΅ Π΅ ΡΠ°ΠΉΠ½Π°, ΡΠ΅ ΠΏΡΠΎΡΡΠΎΡΠΎ ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ° ΡΠ΅ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎ ΡΡΡΠΈΡ Π½Π°ΡΠΈΠ½ Π² ΠΏΠΎΡΡΠΈ Π²ΡΠΈΡΠΊΠΈ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ:
drop table hr.persons
ΠΠΎ ΡΡΡ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΌΠ°ΡΠ°ΡΠ° ΡΡΠ°Π²Π° ΠΏΠΎ-ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ. ΠΠΎΡΡΠΈ Π²ΡΡΠΊΠ° Π‘Π£ΠΠ (Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ NoSQL) ΠΌΠΎΠΆΠ΅ Π΄Π° βΡΡΠ·Π΄Π°Π΄Π΅ ΡΠ°Π±Π»ΠΈΡΠ°β ΠΏΠΎΠ΄ Π΅Π΄Π½Π° ΠΈΠ»ΠΈ Π΄ΡΡΠ³Π° ΡΠΎΡΠΌΠ° ΠΈ ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΡΠ°ΡΡ ΠΎΡ Π½Π΅Ρ Π΄ΠΎΡΠΈ ΡΠ΅ ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°Π²Π° Π»Π΅ΠΊΠΎ (ΠΈΠΌΠ΅, ΡΠΏΠΈΡΡΠΊ Ρ ΠΊΠΎΠ»ΠΎΠ½ΠΈ, ΡΠΈΠΏΠΎΠ²Π΅ Π΄Π°Π½Π½ΠΈ), Π½ΠΎ Π΄ΡΡΠ³ΠΈ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°Π²Π°Ρ Π΄ΡΠ°ΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΈ Π·Π°Π²ΠΈΡΡΡ ΠΎΡ Π²ΡΡΡΠ΅ΡΠ½ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π° Π‘Π£ΠΠ. ΠΡΠ±ΠΈΠΌΠΈΡΡ ΠΌΠΈ ΠΏΡΠΈΠΌΠ΅Ρ Π΅, ΡΠ΅ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ° Π½Π° Oracle ΠΈΠΌΠ° ΡΠ°ΠΌΠΎ βΠ³ΠΎΠ»ΠΈβ BNF Π·Π° ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° βΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°β
ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° ΠΌΠ½ΠΎΠ³ΠΎ Π‘Π£ΠΠ ΠΈΠΌΠ°Ρ ΡΠ²ΠΎΠΈ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ ΡΠΈΠΏΠΎΠ²Π΅ ΠΎΠ±Π΅ΠΊΡΠΈ, ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΡΠ° Π½Π°Π»ΠΈΡΠ½ΠΈ Π² Π΄ΡΡΠ³ΠΈ Π‘Π£ΠΠ. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΠΌΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π΅ ΡΠ°ΠΌΠΎ Π²ΡΡΡ Ρ ΠΎΠ±Π΅ΠΊΡΠΈ Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, Π½ΠΎ ΠΈ Π²ΡΡΡ Ρ ΡΠ°ΠΌΠ°ΡΠ° Π‘Π£ΠΠ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π° βΡΠ±ΠΈΠ΅ΠΌβ ΠΏΡΠΎΡΠ΅Ρ, Π΄Π° ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΠΌ ΡΠ°ΡΡ ΠΎΡ ΠΏΠ°ΠΌΠ΅ΡΡΠ°, Π΄Π° Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅, Π΄Π° ΠΏΡΠ΅Π²ΠΊΠ»ΡΡΠΈΠΌ Π² ΡΠ΅ΠΆΠΈΠΌ βΡΠ°ΠΌΠΎ Π·Π° ΡΠ΅ΡΠ΅Π½Π΅β ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΈ.
Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° Π½Π°ΡΠΈΡΡΠ²Π°ΠΌΠ΅ ΠΌΠ°Π»ΠΊΠΎ
ΠΠ΄Π½Π° ΠΎΡ Π½Π°ΠΉ-ΡΠ΅ΡΡΠΎ ΡΡΠ΅ΡΠ°Π½ΠΈΡΠ΅ Π·Π°Π΄Π°ΡΠΈ Π΅ Π΄Π° ΡΠ΅ ΠΈΠ·Π³ΡΠ°Π΄ΠΈ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠ° Ρ ΠΎΠ±Π΅ΠΊΡΠΈ Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΈ Π΄Π° ΡΠ΅ Π²ΠΈΠ΄ΡΡ ΠΎΠ±Π΅ΠΊΡΠΈΡΠ΅ ΠΈ Π²ΡΡΠ·ΠΊΠΈΡΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΡ Π² ΠΊΡΠ°ΡΠΈΠ²Π° ΠΊΠ°ΡΡΠΈΠ½Π°. ΠΠΎΡΡΠΈ Π²ΡΡΠΊΠ° Π³ΡΠ°ΡΠΈΡΠ½Π° IDE, ΠΎΡΠ΄Π΅Π»Π½ΠΈ ΠΏΠΎΠΌΠΎΡΠ½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ ΠΎΡ βΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΈΡ ΡΠ΅Π΄β, ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ Π³ΡΠ°ΡΠΈΡΠ½ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΡΠΈ Π·Π° ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ°Π½Π΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΡΡ ΡΠΎΠ²Π°. Π’Π΅ ΡΠ΅ Π½Π°ΡΠΈΡΡΠ²Π°Ρ Π½Π΅ΡΠΎ Π·Π° Π²Π°Ρ βΠ΄ΠΎΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΠΌΠΎΠ³Π°Ρβ ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠΎΠ²Π»ΠΈΡΠ΅ΡΠ΅ ΠΌΠ°Π»ΠΊΠΎ Π½Π° ΡΠΎΠ·ΠΈ ΠΏΡΠΎΡΠ΅Ρ ΡΠ°ΠΌΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΠ° Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡ ΡΠ°ΠΉΠ» ΠΈΠ»ΠΈ ΠΊΠ²Π°Π΄ΡΠ°ΡΡΠ΅ΡΠ° Π·Π° ΠΎΡΠΌΠ΅ΡΠΊΠ° Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°.
ΠΠΎ ΡΠΎΠ·ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ΅ΡΠ΅Π½ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-ΠΏΡΠΎΡΡΠΎ, ΠΏΠΎ-Π³ΡΠ²ΠΊΠ°Π²ΠΎ ΠΈ Π΅Π»Π΅Π³Π°Π½ΡΠ½ΠΎ ΠΈ ΡΠ°Π·Π±ΠΈΡΠ° ΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΊΠΎΠ΄. ΠΠ° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΈ Ρ Π²ΡΡΠΊΠ°ΠΊΠ²Π° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ, ΠΈΠΌΠ°ΠΌΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ Π΅Π·ΠΈΠΊΠ° Π·Π° ΠΌΠ°ΡΠΊΠΈΡΠ°Π½Π΅ (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 Π·Π°ΡΠ²ΠΊΠ°ΡΠ° Π΅ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΡΠ»ΠΎΠΆΠ½Π°
-- Π¨Π°ΠΏΠΊΠ°
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 ΠΈ ΠΌΠ°Π»ΠΊΠΎ ΠΎΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π³ΠΎ ΠΏΠΎΠ·Π½Π°Π²Π°Ρ Π° Π»ΠΈΡΠ½ΠΎ ΠΈΠ»ΠΈ Π½ΡΠΊΠΎΠ³Π° ΡΠ° Π³ΠΎ Π²ΠΈΠΆΠ΄Π°Π»ΠΈ Π»ΠΈΡΠ½ΠΎ (Π²ΡΠΏΡΠ΅ΠΊΠΈ ΡΠ°ΠΊΡΠ°, ΡΠ΅ ΡΠΏΠΎΡΠ΅Π΄ ΡΠ»ΡΡ ΠΎΠ²Π΅ΡΠ΅ ΡΠΎΠΉ Π΅ ΡΠ°Π±ΠΎΡΠΈΠ» Π½ΡΠΊΡΠ΄Π΅ Π² ΡΡΡΠ΅Π΄Π½Π°ΡΠ° ΡΠ³ΡΠ°Π΄Π°). Π ΡΠ°Ρ βXβ, ΠΊΠΎΠ³Π°ΡΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° Π½Π° Π³ΠΎΠ»ΡΠΌ ΡΡΡΠ³ΠΎΠ²Π΅Ρ Π½Π° Π΄ΡΠ΅Π±Π½ΠΎ ΠΎΡΠ½ΠΎΠ²ΠΎ Π·Π°ΠΏΠΎΡΠ½Π° Π΄Π° ΡΠ΅ βΡΡΠ²ΡΡΠ²Π° Π·Π»Π΅β, ΡΠΎΠΉ ΡΠΈΡ ΠΎ ΠΈΠ·ΠΏΡΠ°ΡΠΈ Π΅ΠΊΡΠ°Π½Π½ΠΈ ΡΠ½ΠΈΠΌΠΊΠΈ Π½Π° Π³ΡΠ°ΡΠΈΠΊΠΈ ΠΎΡ Oracle Enterprise Manager, Π½Π° ΠΊΠΎΠΈΡΠΎ Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»Π½ΠΎ ΠΏΠΎΠ΄ΡΠ΅ΡΡΠ° ΠΊΡΠΈΡΠΈΡΠ½ΠΈΡΠ΅ ΠΌΠ΅ΡΡΠ° Ρ ΡΠ΅ΡΠ²Π΅Π½ ΠΌΠ°ΡΠΊΠ΅Ρ Π·Π° βΡΠ°Π·Π±ΠΈΡΠ°Π΅ΠΌΠΎΡΡβ ( ΡΠΎΠ²Π°, ΠΌΠ΅ΠΊΠΎ ΠΊΠ°Π·Π°Π½ΠΎ, Π½Π΅ ΠΏΠΎΠΌΠΎΠ³Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ). Π Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΡΠ°Π·ΠΈ βΡΠΎΡΠΎ ΠΊΠ°ΡΡΠ°β, ΠΊΠΎΡΡΠΎ ΡΡΡΠ±Π²Π°ΡΠ΅ Π΄Π° Π»Π΅ΠΊΡΠ²Π°ΠΌ. Π ΡΡΡΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½ΠΈΠΊΠΎΠΉ Π½ΡΠΌΠ°ΡΠ΅ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΡΠ΅Π½Π½ΠΈΡ (ΠΈ Π² Π΄Π²Π°ΡΠ° ΡΠΌΠΈΡΡΠ»Π° Π½Π° Π΄ΡΠΌΠ°ΡΠ°) Enterprise Manager, Ρ.ΠΊ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π΅ ΡΠ»ΠΎΠΆΠ½Π° ΠΈ ΡΠΊΡΠΏΠ°, ΠΈΠ·Π²Π΅Π΄Π½ΡΠΆ βΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ ΡΠ΅ ΡΠΏΡΠ²Π°Ρ Π² Π½Π΅ΡΠΎ ΠΈ ΡΠ°Π·Π±ΠΈΠ²Π°Ρ Π²ΡΠΈΡΠΊΠΎβ. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ βΠ΅ΠΌΠΏΠΈΡΠΈΡΠ½ΠΎβ ΠΎΡΠΊΡΠΈΡ Π° ΠΌΠ΅ΡΡΠΎΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΈ ΠΏΡΠΈΡΠΈΠ½Π°ΡΠ° Π·Π° ΡΠΏΠΈΡΠ°ΡΠΊΠΈΡΠ΅ ΠΈ ΠΏΡΡΠ½Π°Ρ Π° ΠΊΡΡΠΏΠΊΠ°. ΠΠΊΠΎ Π·Π°ΠΏΠ»Π°ΡΠΈΡΠ΅Π»Π½ΠΎΡΠΎ ΠΏΠΈΡΠΌΠΎ ΠΎΡ DBA Π½Π΅ ΠΏΡΠΈΡΡΠΈΠ³Π½Π΅ ΠΎΡΠ½ΠΎΠ²ΠΎ Π² Π±Π»ΠΈΠ·ΠΊΠΎ Π±ΡΠ΄Π΅ΡΠ΅, ΡΠΎΠ³Π°Π²Π° Π²ΡΠΈΡΠΊΠΈ ΡΡΡ Π° Π΄Π° Π²ΡΠ·Π΄ΡΡ Π½Π°Ρ Ρ ΠΎΠ±Π»Π΅ΠΊΡΠ΅Π½ΠΈΠ΅ ΠΈ Π΄Π° ΡΠ΅ Π²ΡΡΠ½Π°Ρ ΠΊΡΠΌ ΡΠ΅ΠΊΡΡΠΈΡΠ΅ ΡΠΈ Π·Π°Π΄Π°ΡΠΈ (Π΄ΠΎ Π½ΠΎΠ²ΠΎΡΠΎ ΠΏΠΈΡΠΌΠΎ).
ΠΠΎ ΠΏΡΠΎΡΠ΅ΡΡΡ Π½Π° Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎ-Π·Π°Π±Π°Π²Π΅Π½ ΠΈ ΠΏΡΠΈΡΡΠ΅Π»ΡΠΊΠΈ, ΠΈ Π½Π°ΠΉ-Π²Π°ΠΆΠ½ΠΎΡΠΎ, Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΈ ΠΏΡΠΎΠ·ΡΠ°ΡΠ΅Π½ Π·Π° Π²ΡΠΈΡΠΊΠΈ. ΠΠΎΠ½Π΅ ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΠΌΡ ΡΠ°ΡΡ, ΠΊΠ°ΡΠΎ Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΡΠΌ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠΈ Π·Π° ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ (ΠΊΠΎΠΈΡΠΎ ΡΡΡ ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ ΡΠ° ΠΏΠΎΠ»Π΅Π·Π½ΠΈ ΠΈ Π² ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ»ΡΡΠ°ΠΈ Π½Π΅Π·Π°ΠΌΠ΅Π½ΠΈΠΌΠΈ). ΠΡΡΠΊΠ° Π‘Π£ΠΠ ΠΌΠΎΠΆΠ΅ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎ ΠΈ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ Π±Π΅Π·ΠΏΠ»Π°ΡΠ½ΠΎ Π΄Π° ΡΠΏΠΎΠ΄Π΅Π»Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΡΠ΅ΠΊΡΡΠΎΡΠΎ ΡΠΈ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ. Π ΡΡΡΠ°ΡΠ° βΠΊΡΡΠ²Π°Π²Π°β Oracle DB ΠΏΠΎΡΡΠΈ Π²ΡΡΠΊΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½Π° ΠΎΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΈΠ·Π³Π»Π΅Π΄ΠΈ, Π²Π°ΡΠΈΡΠ°ΡΠΈ ΠΎΡ ΠΏΡΠΎΡΠ΅ΡΠΈ ΠΈ ΡΠ΅ΡΠΈΠΈ Π΄ΠΎ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ΡΠΎ Π½Π° Π±ΡΡΠ΅ΡΠ½ΠΈΡ ΠΊΠ΅Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,
ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½, Π²ΡΠΎΡΡΠΆΠ΅Π½ΠΈ Ρ Π½ΡΠΊΠ°ΠΊΡΠ² Π²ΠΈΠ΄ ΠΊΠΎΠ»Π΅ΠΊΡΠΎΡ Π½Π° ΠΌΠ΅ΡΡΠΈΠΊΠΈ (Telegraf, Metricbeat, Collectd), ΠΊΠΎΠΉΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ sql Π·Π°ΡΠ²ΠΊΠΈ, Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π½Π° ΡΠ΅Π·ΠΈ ΠΌΠ΅ΡΡΠΈΠΊΠΈ (InfluxDB, Elasticsearch, Timescaledb) ΠΈ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΎΡ (Grafana, Kibana), ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π΄ΠΎΡΡΠ° Π»Π΅ΡΠ½ΠΎ ΠΈ Π³ΡΠ²ΠΊΠ°Π²Π° ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΠ΅, ΠΊΠΎΡΡΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ ΡΡΡΠ½ΠΎ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ°Π½Π° Ρ Π΄ΡΡΠ³ΠΈ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π·Π° ΡΡΠ»Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° (ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΎΡ ΡΡΡΠ²ΡΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΎΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° ΠΈ Ρ.Π½.). ΠΠ°ΠΊΡΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΎΠ²Π° ΡΠ΅ ΠΏΡΠ°Π²ΠΈ Π² pgwatch2, ΠΊΠΎΠΉΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡΡΠ° InfluxDB + Grafana ΠΈ Π½Π°Π±ΠΎΡ ΠΎΡ Π·Π°ΡΠ²ΠΊΠΈ ΠΊΡΠΌ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΈΠ·Π³Π»Π΅Π΄ΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΡΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π΄ΠΎΡΡΡΠΏΠ½ΠΈ
ΠΠ±ΡΠΎ
Π ΡΠΎΠ²Π° Π΅ ΡΠ°ΠΌΠΎ ΠΏΡΠΈΠ±Π»ΠΈΠ·ΠΈΡΠ΅Π»Π΅Π½ ΡΠΏΠΈΡΡΠΊ Π½Π° ΡΠΎΠ²Π°, ΠΊΠΎΠ΅ΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ Ρ Π½Π°ΡΠ°ΡΠ° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ SQL ΠΊΠΎΠ΄. Π‘ΠΈΠ³ΡΡΠ΅Π½ ΡΡΠΌ, ΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΏΠΈΡΠ΅ΡΠ΅ Π² ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅. Π ΡΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΠΌ Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ (ΠΈ Π½Π°ΠΉ-Π²Π°ΠΆΠ½ΠΎΡΠΎ Π·Π°ΡΠΎ) Π΄Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π° ΠΈ Π΄Π° Π³ΠΎ Π²ΠΊΠ»ΡΡΠΈΡΠ΅ Π²ΡΠ² Π²Π°ΡΠΈΡ CI/CD ΠΏΡΠΎΡΠ΅Ρ ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡ ΠΏΡΡ.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com