
SQL, ΠΊΠ°ΠΊΠ²ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎ-Π»Π΅ΡΠ½ΠΎ? ΠΡΠ΅ΠΊΠΈ ΠΎΡ Π½Π°Ρ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ ΠΏΡΠΎΡΡΠΈΡΡΠΊ Π·Π°ΡΠ²ΠΊΠ° β ΠΏΡΠΎΡΡΠΎ Π²ΡΠ²Π΅ΠΆΠ΄Π°ΠΌΠ΅ select, ΠΈΠ·Π±ΡΠΎΡΠ²Π°ΠΌΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΈ, ΡΠ»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ from, ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°, ΠΌΠ°Π»ΠΊΠΎ ΡΡΠ»ΠΎΠ²ΠΈΡ Π² where ΠΈ Π²ΡΠΈΡΠΊΠΎ β ΠΏΠΎΠ»Π΅Π·Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ ΡΠ° Π² Π½Π°ΡΠΈΡ Π΄ΠΆΠΎΠ±, ΠΊΠ°ΡΠΎ (ΠΏΠΎΡΡΠΈ) Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΎΠ²Π° ΠΊΠΎΡ Π‘Π£ΠΠ ΡΠ°Π±ΠΎΡΠΈ Π² ΠΌΠΎΠΌΠ΅Π½ΡΠ° (Π° ΠΌΠΎΠΆΠ΅ ΠΈ ). Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ ΡΠ°Π±ΠΎΡΠ° ΠΏΠΎΡΡΠΈ Ρ Π²ΡΠ΅ΠΊΠΈ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ Π½Π° Π΄Π°Π½Π½ΠΈ (ΡΠ΅Π»Π°ΡΠΈΠΎΠ½Π΅Π½ ΠΈ Π½Π΅ ΠΌΠ½ΠΎΠ³ΠΎ) ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π° ΠΎΡ Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° Π½Π° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ ΠΊΠΎΠ΄ (Ρ Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠ°Π²ΠΊΠΈ β ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π²Π΅ΡΡΠΈΠΈΡΠ΅, ΠΏΡΠ΅Π³Π»Π΅Π΄ Π½Π° ΠΊΠΎΠ΄Π°, ΡΡΠ°ΡΠΈΡΠ΅Π½ Π°Π½Π°Π»ΠΈΠ·, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΡΠ΅ΡΡΠΎΠ²Π΅ ΠΈ Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π°). Π ΡΠΎΠ²Π° ΡΠ΅ ΠΎΡΠ½Π°ΡΡ Π½Π΅ ΡΠ°ΠΌΠΎ Π΄ΠΎ ΡΠ°ΠΌΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ, ΡΡ Π΅ΠΌΠΈ ΠΈ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ, Π° Π²ΡΡΡΠ½ΠΎΡΡ Π΄ΠΎ ΡΡΠ»ΠΎΡΡΠ½Π°ΡΠ° Π΄Π΅ΠΉΠ½ΠΎΡΡ Π½Π° Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ. Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΠΌ Π·Π° Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΈ Π·Π°Π΄Π°ΡΠΈ ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ° Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΠ ΠΏΠΎΠ΄ ΡΠ³Π»Π΅Π΄Π° Π½Π° "Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΊΠ°ΡΠΎ ΠΊΠΎΠ΄".
Π Π·Π°ΠΏΠΎΡΠ²Π°ΠΌΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΎ Ρ . ΠΡΡΠ²ΠΈΡΠ΅ ΡΠ±Π»ΡΡΡΡΠΈ ΡΠΈΠΏ "SQL ΡΡΠ΅ΡΡ ORM" Π±ΡΡ Π° Π·Π°Π±Π΅Π»ΡΠ·Π°Π½ΠΈ ΠΎΡΠ΅ Π² .
ΠΠ±Π΅ΠΊΡΠ½ΠΎ-ΡΠ΅Π»Π°ΡΠΈΠΎΠ½Π΅Π½ ΠΌΠ°ΠΏΠΈΠ½Π³
ΠΠΎΠ΄ΠΊΡΠ΅ΠΏΡΡΠΈΡΠ΅ 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 ΠΊΠΎΠ΄. ΠΠ°ΡΠΎ Π·Π°ΡΠ΄ΠΊΠ°, ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ ΠΏΠΎΠ»Π°Π³Π°Ρ ΡΡΠΈΠ»ΠΈΡ Π΄Π° ΡΠ΅ ΡΠ°Π·Π³ΡΠ°Π½ΠΈΡΠ°Ρ ΠΎΡ ΡΠ²ΠΎΡΡΠ° ΠΠ Ρ ΠΊΠΈΠ»ΠΎΠΌΠ΅ΡΡΠΈ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΈ, ΠΊΠΎΠ΅ΡΠΎ ΠΏΠΎΠΊΠ°Π·Π²Π° Π·Π° ΠΈΠ·Π²Π΅ΡΡΠ½Π° .
ΠΡ Π΄ΡΡΠ³Π°ΡΠ° ΡΡΡΠ°Π½Π° Π½Π° Π±Π°ΡΠΈΠΊΠ°Π΄Π°ΡΠ° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ½ΠΈΡΠΈΡΠ΅ Π½Π° ΡΠΈΡΡΠΈΡ "handmade"-SQL ΠΎΡΠ±Π΅Π»ΡΠ·Π²Π°Ρ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π΄Π° ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌΠ° ΠΎΡ ΡΠ²ΠΎΡΡΠ° Π‘Π£ΠΠ Π±Π΅Π· Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΡΠ»ΠΎΠ΅Π²Π΅ ΠΈ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΈ. Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΠΏΠΎΡΠ²ΡΠ²Π°Ρ "data-centric" ΠΏΡΠΎΠ΅ΠΊΡΠΈ, ΠΊΡΠ΄Π΅ΡΠΎ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ ΡΠ΅ Π³ΡΠΈΠΆΠΈ Π·Π° ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΎ ΠΎΠ±ΡΡΠ΅Π½ Π΅ΠΊΠΈΠΏ (ΡΠ΅ ΡΡΡΠΎ ΡΠ° "Π΄Π°Π½Π½ΠΈΡΡΠΈ", ΡΠ΅ ΡΡΡΠΎ ΡΠ° "Π±Π°Π·ΠΎΠ²ΡΠΈ", ΡΠ΅ ΡΡΡΠΎ ΡΠ° "Π±Π°Π·Π΄Π΅Π½ΡΡΠΈΠΊΠΈ" ΠΈ Ρ.Π½.), Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ ΡΠ°ΠΌΠΎ ΡΡΡΠ±Π²Π° Π΄Π° "Π²Π·Π΅ΠΌΠ°Ρ" Π³ΠΎΡΠΎΠ²ΠΈ ΠΈΠ·Π³Π»Π΅Π΄ΠΈ ΠΈ ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠΈ, Π±Π΅Π· Π΄Π° Π½Π°Π²Π»ΠΈΠ·Π°Ρ Π² ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ.
Π ΠΊΠ°ΠΊΠ²ΠΎ Π°ΠΊΠΎ Π²Π·Π΅ΠΌΠ΅ΠΌ Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΎΡΠΎ ΠΎΡ Π΄Π²Π°ΡΠ° ΡΠ²ΡΡΠ°? ΠΠ°ΠΊΡΠΎ Π΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΎ Π² ΡΡΠ΄Π΅ΡΠ½ΠΈΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Ρ ΠΆΠΈΠ·Π½Π΅ΡΡΠ²ΡΡΠ΄ΠΈΡΠ΅Π»Π½ΠΎ ΠΈΠΌΠ΅ . Π©Π΅ ΡΠΈΡΠΈΡΠ°ΠΌ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ΅Π΄Π° ΠΎΡ ΠΎΠ±ΡΠ°ΡΠ° ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ Π² ΠΌΠΎΡ ΡΠ²ΠΎΠ±ΠΎΠ΄Π΅Π½ ΠΏΡΠ΅Π²ΠΎΠ΄, Π° ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ Ρ Π½Π΅Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΡΠ΅ .
Clojure Π΅ ΡΡΡΠ°Ρ ΠΎΡΠ΅Π½ Π΅Π·ΠΈΠΊ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° DSL-ΠΈ, Π½ΠΎ SQL ΡΠ°ΠΌ ΠΏΠΎ ΡΠ΅Π±Π΅ ΡΠΈ Π²Π΅ΡΠ΅ Π΅ ΡΡΡΠ°Ρ ΠΎΡΠ΅Π½ DSL ΠΈ Π½Π΅ Π½ΠΈ Π΅ Π½ΡΠΆΠ΅Π½ ΠΎΡΠ΅ Π΅Π΄ΠΈΠ½. S-ΠΈΠ·ΡΠ°Π·ΠΈΡΠ΅ ΡΠ° ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΠΈ, Π½ΠΎ ΡΡΠΊ ΡΠ΅ Π½Π΅ Π΄ΠΎΠ±Π°Π²ΡΡ Π½ΠΈΡΠΎ Π½ΠΎΠ²ΠΎ. Π ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΡΠΊΠΎΠ±ΠΈ ΠΏΡΠΎΡΡΠΎ Π·Π°ΡΠ°Π΄ΠΈ ΡΠΊΠΎΠ±ΠΈΡΠ΅. ΠΠ΅ ΡΡΠ΅ ΡΡΠ³Π»Π°ΡΠ½ΠΈ? Π’ΠΎΠ³Π°Π²Π° ΠΈΠ·ΡΠ°ΠΊΠ°ΠΉΡΠ΅ ΠΌΠΎΠΌΠ΅Π½Ρ, ΠΊΠΎΠ³Π°ΡΠΎ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΡΡΠ° Π½Π°Π΄ ΠΠ Π·Π°ΠΏΠΎΡΠ½Π΅ Π΄Π° ΠΏΡΠ΅Π»ΠΈΠ²Π° ΠΈ ΡΠ΅ Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ Π±ΠΎΡΠ±Π° Ρ ΡΡΠ½ΠΊΡΠΈΡΡΠ°. (raw-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})
;;; Π‘ΡΠ·Π΄Π°Π΄Π΅Π½Π° Π΅ ΡΡΠ½ΠΊΡΠΈΡ Ρ ΠΈΠΌΠ΅ `users-by-country`.
;;; ΠΠ΅ΠΊΠ° Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅:
(users-by-country {:country_code "GB"})
;=> ({:name "Kris" :country_code "GB" ...} ...)Π‘Π»Π΅Π΄Π²Π°ΠΉΠΊΠΈ ΠΏΡΠΈΠ½ΡΠΈΠΏΠ° "SQL ΠΎΡΠ΄Π΅Π»Π½ΠΎ, Clojure ΠΎΡΠ΄Π΅Π»Π½ΠΎ", ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΡΠ΅:
- ΠΠΈΠΊΠ°ΠΊΠΈ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ½ΠΈ ΠΈΠ·Π½Π΅Π½Π°Π΄ΠΈ. ΠΠ°ΡΠ°ΡΠ° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ (ΠΊΠ°ΠΊΡΠΎ ΠΈ Π²ΡΡΠΊΠ° Π΄ΡΡΠ³Π°) Π½Π΅ ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π° Π½Π° ΡΡΠ°Π½Π΄Π°ΡΡΠΈΡΠ΅ Π½Π° SQL Π½Π° 100% β Π½ΠΎ Π·Π° Yesql ΡΠΎΠ²Π° Π½Π΅ Π΅ Π²Π°ΠΆΠ½ΠΎ. ΠΠΈΠΊΠΎΠ³Π° Π½ΡΠΌΠ° Π΄Π° Π³ΡΠ±ΠΈΡΠ΅ Π²ΡΠ΅ΠΌΠ΅ Π² ΡΡΡΡΠ΅Π½Π΅ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ ΡΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ, Π΅ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ΅Π½ Π½Π° SQL. ΠΠΈΠΊΠΎΠ³Π° Π½ΡΠΌΠ° Π΄Π° Π²ΠΈ ΡΠ΅ Π½Π°Π»ΠΎΠΆΠΈ Π΄Π° ΡΠ΅ Π²ΡΡΡΠ°ΡΠ΅ ΠΊΡΠΌ ΡΡΠ½ΠΊΡΠΈΡ (raw-sql "some (βfunkyβ :: SYNTAX)")).
- ΠΠ°ΠΉ-Π΄ΠΎΠ±ΡΠ° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ°. ΠΠ°ΡΠΈΡΡ ΡΠ΅Π΄Π°ΠΊΡΠΎΡ Π²Π΅ΡΠ΅ ΠΈΠΌΠ° ΠΎΡΠ»ΠΈΡΠ½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° SQL. ΠΠ°ΠΏΠ°Π·Π²Π°ΠΉΠΊΠΈ SQL ΠΊΠ°ΡΠΎ SQL, ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΡΡΠΎ Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅.
- Π‘ΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ Ρ Π΅ΠΊΠΈΠΏΠ°. ΠΠ°ΡΠΈΡΠ΅ DBA ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ΡΠ°Ρ ΠΈ ΠΏΠΈΡΠ°Ρ SQL, ΠΊΠΎΠΉΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π² ΡΠ²ΠΎΡ Clojure ΠΏΡΠΎΠ΅ΠΊΡ.
- ΠΠΎ-Π»Π΅ΡΠ½Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ°. Π’ΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·Π³ΡΠ°Π΄ΠΈΡΠ΅ ΠΏΠ»Π°Π½ Π·Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅? Π’ΠΎΠ²Π° Π½Π΅ Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΠΊΠΎΠ³Π°ΡΠΎ Π²Π°ΡΠ΅ΡΠΎ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ SQL.
- ΠΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡ. ΠΡΠ΅ΠΌΠ΅ΡΡΠ΅ΡΠ΅ ΡΠ΅Π·ΠΈ ΡΡΡΠΈΡΠ΅ SQL ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π² Π΄ΡΡΠ³ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ, Π·Π°ΡΠΎΡΠΎ ΡΠΎΠ²Π° Π΅ ΠΏΡΠΎΡΡΠΎ Π΄ΠΎΠ±ΡΠΈΡ ΡΡΠ°Ρ SQL β ΠΏΡΠΎΡΡΠΎ Π³ΠΎ ΡΠΏΠΎΠ΄Π΅Π»Π΅ΡΠ΅.
Π‘ΠΏΠΎΡΠ΅Π΄ ΠΌΠ΅Π½ ΠΈΠ΄Π΅ΡΡΠ° Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΡΠ°Ρ ΠΎΡΠ½Π° ΠΈ ΡΡΡΠ΅Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΠ°, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ΅ΡΠΎ ΠΏΡΠΎΠ΅ΠΊΡΡΡ ΡΠΏΠ΅ΡΠ΅Π»ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π΅Π·ΠΈΡΠΈ. Π Π½ΠΈΠ΅ ΠΏΠΎ-Π½Π°ΡΠ°ΡΡΠΊ ΡΠ΅ ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠΈΠΌ ΠΏΠΎΠ΄ΠΎΠ±Π½Π° ΡΠΈΠ»ΠΎΡΠΎΡΠΈΡ Π·Π° ΡΠ°Π·Π΄Π΅Π»ΡΠ½Π΅ Π½Π° SQL ΠΊΠΎΠ΄Π° ΠΎΡ Π²ΡΠΈΡΠΊΠΎ ΠΎΡΡΠ°Π½Π°Π»ΠΎ Π΄Π°Π»Π΅Ρ ΠΈΠ·Π²ΡΠ½ ORM.
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" ΠΈ Ρ.Π½.)
, row_format -- Π€ΠΎΡΠΌΠ°Ρ Π½Π° ΡΠ΅Π΄Π° ("Fixed", "Dynamic" ΠΈ Ρ.Π½.)
, ...
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" ΠΈ Ρ.Π½.)
, ...
from system.tables
where database = 'HR'ΠΠ΅ΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΈ Π² Cassandra (ΠΊΡΠ΄Π΅ΡΠΎ ΠΈΠΌΠ° columnfamilies Π²ΠΌΠ΅ΡΡΠΎ ΡΠ°Π±Π»ΠΈΡΠΈ ΠΈ keyspace Π²ΠΌΠ΅ΡΡΠΎ ΡΡ Π΅ΠΌΠΈ):
select columnfamily_name
, compaction_strategy_class -- Π‘ΡΡΠ°ΡΠ΅Π³ΠΈΡ Π½Π° ΡΡΠ±ΠΈΡΠ°Π½Π΅ Π½Π° Π±ΠΎΠΊΠ»ΡΡΠΈ
, gc_grace_seconds -- ΠΡΠ΅ΠΌΠ΅ Π½Π° ΠΆΠΈΠ²ΠΎΡ Π½Π° Π±ΠΎΠΊΠ»ΡΠΊΠ°
, ...
from system.schema_columnfamilies
where keyspace_name = 'HR'ΠΠ° ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΠΎΡΡΠ°Π½Π°Π»ΠΈ ΠΠ ΡΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΌΠΈΡΠ»ΡΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ Π·Π°ΡΠ²ΠΊΠΈ (Π΄ΠΎΡΠΈ Π² Mongo ΠΈΠΌΠ° , ΠΊΠΎΡΡΠΎ ΡΡΠ΄ΡΡΠΆΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° Π²ΡΠΈΡΠΊΠΈ ΠΊΠΎΠ»Π΅ΠΊΡΠΈΠΈ Π² ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°).
Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π½Π΅ ΡΠ°ΠΌΠΎ Π·Π° ΡΠ°Π±Π»ΠΈΡΠΈΡΠ΅, Π° ΠΈ Π·Π° Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ ΠΎΠ±Π΅ΠΊΡΠΈ. ΠΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ½ΠΎ Π΄ΠΎΠ±ΡΠΈ Ρ ΠΎΡΠ° ΡΠΏΠΎΠ΄Π΅Π»ΡΡ ΡΠ°ΠΊΡΠ² ΠΊΠΎΠ΄ Π·Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΠ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΡΠ΅ΡΠΈΡ Ρ Π°Π±ΡΠ°-ΡΡΠ°ΡΠΈΠΈ "Π€ΡΠ½ΠΊΡΠΈΠΈ Π·Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠ°Π½Π΅ Π½Π° Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ PostgreSQL" (, , ). Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, Π΄Π° Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ Π²ΡΠΈΡΠΊΠΈΡΠ΅ ΡΠ΅Π·ΠΈ Π·Π°ΡΠ²ΠΊΠΈ ΠΈ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ Π΄Π° Π³ΠΈ Π²ΡΠ²Π΅ΠΆΠ΄Π°Ρ β ΡΠΎΠ²Π° Π΅ "ΡΠ°ΠΊΠΎΠ²Π° ΡΠΈ" ΡΠ΄ΠΎΠ²ΠΎΠ»ΡΡΠ²ΠΈΠ΅, Π·Π°ΡΠΎΠ²Π° Π² Π»ΡΠ±ΠΈΠΌΠ°ΡΠ° ΡΠΈ IDE/ΡΠ΅Π΄Π°ΠΊΡΠΎΡ ΠΈΠΌΠ°ΠΌ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½ Π½Π°Π±ΠΎΡ ΠΎΡ ΡΠ½ΠΈΠΏΠ΅ΡΠΈ Π·Π° ΡΠ΅ΡΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ Π·Π°ΡΠ²ΠΊΠΈ, ΠΈ ΠΎΡΡΠ°Π²Π° ΡΠ°ΠΌΠΎ Π΄Π° Π²ΠΏΠΈΡΠ° ΠΈΠΌΠ΅Π½Π°ΡΠ° Π½Π° ΠΎΠ±Π΅ΠΊΡΠΈΡΠ΅ Π² ΡΠ°Π±Π»ΠΎΠ½Π°.
Π ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ°, ΡΠ°ΠΊΡΠ² Π½Π°ΡΠΈΠ½ Π½Π° Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡ ΠΈ ΡΡΡΡΠ΅Π½Π΅ Π½Π° ΠΎΠ±Π΅ΠΊΡΠΈ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π³ΡΠ²ΠΊΠ°Π², ΡΠΏΠ΅ΡΡΡΠ²Π° ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈ ΡΠΎΡΠ½ΠΎ ΡΠ°Π·ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈ Π² ΡΠΎΠ·ΠΈ Π²ΠΈΠ΄, Π² ΠΊΠΎΠΉΡΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° Π² ΠΌΠΎΠΌΠ΅Π½ΡΠ° (ΠΊΠ°ΠΊΡΠΎ Π΅ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π² ΠΏΠΎΡΡΠ° ).
ΠΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ ΠΎΠ±Π΅ΠΊΡΠΈ
Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ Π½Π°ΠΌΠ΅ΡΠΈΡ ΠΌΠ΅ ΠΈ ΠΈΠ·ΡΡΠΈΡ ΠΌΠ΅ Π½ΡΠΆΠ½ΠΈΡΠ΅ ΠΎΠ±Π΅ΠΊΡΠΈ, Π΅ Π²ΡΠ΅ΠΌΠ΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ Π½Π΅ΡΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Ρ ΡΡΡ . ΠΡΡΠ΅ΡΡΠ²Π΅Π½ΠΎ, ΡΡΡΠΎ ΡΠ°ΠΊΠ°, Π±Π΅Π· Π΄Π° ΠΎΡΠ»Π΅ΠΏΡΠΌΠ΅ ΠΏΡΡΡΡΠΈΡΠ΅ ΠΎΡ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠ°ΡΠ°.
ΠΠ΅ Π΅ ΡΠ°ΠΉΠ½Π°, ΡΠ΅ ΠΏΡΠΎΡΡΠΎΡΠΎ ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎ Π΅Π΄ΠΈΠ½ ΠΈ ΡΡΡ Π½Π°ΡΠΈΠ½ ΠΏΠΎΡΡΠΈ Π²ΡΠ² Π²ΡΠΈΡΠΊΠΈ ΠΠ:
drop table hr.personsΠ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ° Π²Π΅ΡΠ΅ Π΅ ΠΏΠΎ-ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ. ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΡΠΊΠ° Π‘Π£ΠΠ (Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ NoSQL) ΠΏΠΎ Π΅Π΄ΠΈΠ½ ΠΈΠ»ΠΈ Π΄ΡΡΠ³ Π½Π°ΡΠΈΠ½ ΡΠΌΠ΅Π΅ "create table", Π° ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΠΌΡ ΡΠ°ΡΡ Π΄ΠΎΡΠΈ ΡΠ΅ ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°Π²Π° ΠΌΠ°Π»ΠΊΠΎ (ΠΈΠΌΠ΅, ΡΠΏΠΈΡΡΠΊ Ρ ΠΊΠΎΠ»ΠΎΠ½ΠΈ, ΡΠΈΠΏΠΎΠ²Π΅ Π΄Π°Π½Π½ΠΈ), Π½ΠΎ ΠΎΡΡΠ°Π½Π°Π»ΠΈΡΠ΅ Π΄Π΅ΡΠ°ΠΉΠ»ΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°Π²Π°Ρ Π΄ΡΠ°ΡΡΠΈΡΠ½ΠΎ ΠΈ Π·Π°Π²ΠΈΡΡΡ ΠΎΡ Π²ΡΡΡΠ΅ΡΠ½Π°ΡΠ° ΡΡΡΡΠΊΡΡΡΠ° ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π°ΡΠ° Π‘Π£ΠΠ. ΠΠΎΡΡ Π»ΡΠ±ΠΈΠΌ ΠΏΡΠΈΠΌΠ΅Ρ β Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ° Π½Π° Oracle ΡΠ°ΠΌΠΎ "Π³ΠΎΠ»ΠΈ" ΠΠΠ€βΠΈ Π·Π° ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° "create table" . ΠΡΡΠ³ΠΈ Π‘Π£ΠΠ ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π°Ρ Ρ ΠΏΠΎ-ΡΠΊΡΠΎΠΌΠ½ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, Π½ΠΎ Π²ΡΡΠΊΠ° ΠΎΡ ΡΡΡ ΡΡΡΠΎ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈ ΠΈ ΡΠ½ΠΈΠΊΠ°Π»Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡΠΈ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠΈ (, , , ). ΠΠ°Π»ΠΊΠΎ Π²Π΅ΡΠΎΡΡΠ½ΠΎ Π΅ Π½ΡΠΊΠΎΠΉ Π³ΡΠ°ΡΠΈΡΠ΅Π½ "wizard" ΠΎΡ ΠΏΠΎΡΠ΅Π΄Π½Π°ΡΠ° IDE (ΠΎΡΠΎΠ±Π΅Π½ΠΎ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»Π½Π°ΡΠ°) Π΄Π° ΠΌΠΎΠΆΠ΅ Π½Π°ΠΏΡΠ»Π½ΠΎ Π΄Π° ΠΏΠΎΠΊΡΠΈΠ΅ Π²ΡΠΈΡΠΊΠΈΡΠ΅ ΡΠ΅Π·ΠΈ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ, Π° Π°ΠΊΠΎ ΠΈ ΡΡΠΏΠ΅Π΅, ΡΠΎ ΡΠΎΠ²Π° ΡΠ΅ Π΅ Π·ΡΠ΅Π»ΠΈΡΠ΅ Π½Π΅ Π·Π° ΡΠ»Π°Π±ΠΎΠ½Π΅ΡΠ²Π½ΠΈ. Π ΡΡΡΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅, ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ ΠΈ Π½Π°Π²ΡΠ΅ΠΌΠ΅ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ create table ΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π±Π΅Π· ΡΡΡΠ΄Π° Π΄Π° ΡΠ΅ Π²ΡΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΎΡ Π²ΡΠΈΡΠΊΠΈ ΡΡΡ , Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ΡΠΎ ΠΈ Π΄ΠΎΡΡΡΠΏΠ° Π΄ΠΎ Π²Π°ΡΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ Π½Π°Π΄Π΅ΠΆΠ΄Π½ΠΈ, ΠΎΠΏΡΠΈΠΌΠ°Π»Π½ΠΈ ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½ΠΎ ΡΠ΄ΠΎΠ±Π½ΠΈ.
Π‘ΡΡΠ΅ΡΡΠ²ΡΠ²Π°Ρ ΠΈ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ ΡΠΈΠΏΠΎΠ²Π΅ ΠΎΠ±Π΅ΠΊΡΠΈ Π² ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π‘Π£ΠΠ, ΠΊΠΎΠΈΡΠΎ Π»ΠΈΠΏΡΠ²Π°Ρ Π² Π΄ΡΡΠ³ΠΈ. ΠΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΠΌΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π΅ ΡΠ°ΠΌΠΎ Ρ ΠΎΠ±Π΅ΠΊΡΠΈΡΠ΅ Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ, Π½ΠΎ ΠΈ ΡΡΡ ΡΠ°ΠΌΠ°ΡΠ° Π‘Π£ΠΠ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π° "ΡΠ±ΠΈΠ΅ΠΌ" ΠΏΡΠΎΡΠ΅Ρ, Π΄Π° ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΠΎΠ±Π»Π°ΡΡ ΠΎΡ ΠΏΠ°ΠΌΠ΅ΡΡΠ°, Π΄Π° Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΠΌΠ΅ ΡΡΠ°ΡΠΈΡΠΎΠ²ΠΊΠ°, Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ Π² ΡΠ΅ΠΆΠΈΠΌ "read only" ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΈ.
Π ΡΠ΅Π³Π° ΠΌΠ°Π»ΠΊΠΎ Π΄Π° Π½Π°ΡΠΈΡΡΠ²Π°ΠΌΠ΅
ΠΠ΄Π½Π° ΠΎΡ Π½Π°ΠΉ-ΡΠ΅ΡΡΠΎ ΡΡΠ΅ΡΠ°Π½ΠΈΡΠ΅ Π·Π°Π΄Π°ΡΠΈ Π΅ Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΡΠΎΠΈ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠ° Ρ ΠΎΠ±Π΅ΠΊΡΠΈΡΠ΅ Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ, Π·Π° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΎΠ±Π΅ΠΊΡΠΈΡΠ΅ ΠΈ Π²ΡΡΠ·ΠΊΠΈΡΠ΅ ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρ ΠΈΠΌ Π² ΠΊΡΠ°ΡΠΈΠ² ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅. Π’ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΏΠΎΡΡΠΈ Π²ΡΡΠΊΠ° Π³ΡΠ°ΡΠΈΡΠ½Π° IDE, ΠΎΡΠ΄Π΅Π»Π½ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ ΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ Π³ΡΠ°ΡΠΈΡΠ½ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ°ΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠΎΠΈΡΠΎ ΡΠ΅ Π½Π°ΡΠΈΡΡΠ²Π°Ρ Π½Π΅ΡΠΎ "ΠΊΠ°ΠΊΡΠΎ ΠΌΠΎΠ³Π°Ρ", Π° ΠΌΠ°Π»ΠΊΠΎ Π΄Π° ΠΏΠΎΠ²Π»ΠΈΡΠ΅ΡΠ΅ Π½Π° ΡΠΎΠ·ΠΈ ΠΏΡΠΎΡΠ΅Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°ΠΌΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΠ° Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡ ΡΠ°ΠΉΠ» ΠΈΠ»ΠΈ ΠΎΡΠΌΠ΅ΡΠΊΠΈ Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°.
ΠΠΎ ΡΠΎΠ·ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ΅ΡΠ΅Π½ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-ΠΏΡΠΎΡΡΠΎ, ΠΏΠΎ-Π³ΡΠ²ΠΊΠ°Π²ΠΎ ΠΈ Π΅Π»Π΅Π³Π°Π½ΡΠ½ΠΎ, ΡΠ°Π·Π±ΠΈΡΠ° ΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΊΠΎΠ΄. ΠΠ° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΈ Ρ Π²ΡΡΠΊΠ°ΠΊΠ²Π° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ ΠΈΠΌΠ°ΠΌΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ Π΅Π·ΠΈΠΊΠ° Π·Π° ΠΌΠ°ΡΠΊΠΈΡΠ°Π½Π΅ (DOT, GraphML ΠΈ Ρ.Π½.), Π° ΠΊΡΠΌ ΡΡΡ - ΡΡΠ» ΠΊΡΠΏ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (GraphViz, PlantUML, Mermaid), ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ΡΠ°Ρ ΡΠ°ΠΊΠΈΠ²Π° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΈ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Ρ Π² Π½Π°ΠΉ-ΡΠ°Π·Π½ΠΎΠΎΠ±ΡΠ°Π·Π½ΠΈ ΡΠΎΡΠΌΠ°ΡΠΈ. Π ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ° Π·Π° ΠΎΠ±Π΅ΠΊΡΠΈΡΠ΅ ΠΈ Π²ΡΡΠ·ΠΊΠΈΡΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΡ Π²Π΅ΡΠ΅ Π·Π½Π°Π΅ΠΌ ΠΊΠ°ΠΊ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΠΌ.
ΠΠ΅ΠΊΠ° ΠΏΡΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΌΠ°Π»ΡΠΊ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ Π±ΠΈ ΠΌΠΎΠ³Π»ΠΎ Π΄Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ PlantUML ΠΈ (Π²Π»ΡΠ²ΠΎ SQL Π·Π°ΡΠ²ΠΊΠ°, ΠΊΠΎΡΡΠΎ ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ° Π½ΡΠΆΠ½Π°ΡΠ° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ Π·Π° 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'ΠΠΊΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ ΠΌΠ°Π»ΠΊΠΎ ΡΡΠΈΠ»ΠΈΡ, Π±Π°Π·ΠΈΡΠ°ΠΉΠΊΠΈ ΡΠ΅ Π½Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΠΌ Π½Π΅ΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΈΡΠ° Π½Π° ΠΈΡΡΠΈΠ½ΡΠΊΠ° ER Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠ°:
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 ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° %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 ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ %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 ΠΏΠΎΡΡΠΈ Π²ΡΡΠΊΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½Π° ΠΎΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ, Π·Π°ΠΏΠΎΡΠ²Π°ΠΉΠΊΠΈ ΠΎΡ ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅ ΠΈ ΡΠ΅ΡΠΈΠΈΡΠ΅ ΠΈ Π·Π°Π²ΡΡΡΠ²Π°ΠΉΠΊΠΈ ΡΡΡ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ΡΠΎ Π½Π° Π±ΡΡΠ΅ΡΠ½ΠΈΡ ΠΊΠ΅Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, , ΡΠ°Π·Π΄Π΅Π» "ΠΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³"). Π PostgreSQL ΡΡΡΠΎ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ Π·Π° , Π² ΡΠ°ΡΡΠ½ΠΎΡΡ ΡΠ°ΠΊΠΈΠ²Π° Π½Π΅Π·Π°ΠΌΠ΅Π½ΠΈΠΌΠΈ Π² Π΅ΠΆΠ΅Π΄Π½Π΅Π²ΠΈΠ΅ΡΠΎ Π½Π° Π²ΡΠ΅ΠΊΠΈ DBA, ΠΊΠ°ΡΠΎ , , . ΠΠ° MySQL Π΅ ΡΡΠ·Π΄Π°Π΄Π΅Π½Π° Π΄ΠΎΡΠΈ ΠΎΡΠ΄Π΅Π»Π½Π° ΡΡ Π΅ΠΌΠ° . Π Π² Mongo Π²Π³ΡΠ°Π΄Π΅Π½ Π°Π³ΡΠ΅Π³ΠΈΡΠ° Π΄Π°Π½Π½ΠΈ Π·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π² ΡΠΈΡΡΠ΅ΠΌΠ½Π°ΡΠ° ΠΊΠΎΠ»Π΅ΠΊΡΠΈΡ .
Π’Π°ΠΊΠ°, Π²ΡΠΎΡΡΠΆΠ΅Π½ΠΈ Ρ Π½ΡΠΊΠ°ΠΊΡΠ² ΠΌΠ΅ΡΡΠΈΠΊ ΡΠ±ΠΎΡΠ½ΠΈΠΊ (Telegraf, Metricbeat, Collectd), ΠΊΠΎΠΉΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ SQL Π·Π°ΡΠ²ΠΊΠΈ, Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π½Π° ΡΠ΅Π·ΠΈ ΠΌΠ΅ΡΡΠΈΠΊΠΈ (InfluxDB, Elasticsearch, Timescaledb) ΠΈ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΎΡ (Grafana, Kibana), ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΠΌ Π΄ΠΎΡΡΠ° Π»Π΅ΡΠ½Π° ΠΈ Π³ΡΠ²ΠΊΠ°Π²Π° ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³, ΠΊΠΎΡΡΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ ΡΡΡΠ½ΠΎ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ°Π½Π° Ρ Π΄ΡΡΠ³ΠΈ ΠΎΠ±ΡΠΎΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΌΠ΅ΡΡΠΈΠΊΠΈ (ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½ΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΎΡ ΠΠ‘ ΠΈ Ρ.Π½.). ΠΠ°ΠΊΡΠΎ Π΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΎ Π² pgwatch2, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ ΠΎΡ InfluxDB + Grafana ΠΈ Π½Π°Π±ΠΎΡ ΠΎΡ Π·Π°ΡΠ²ΠΊΠΈ ΠΊΡΠΌ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠ½ΠΈΡ, ΠΊΡΠΌ ΠΊΠΎΠΈΡΠΎ ΡΡΡΠΎ ΠΌΠΎΠ³Π°Ρ .
ΠΠ±ΡΠΎ
Π ΡΠΎΠ²Π° Π΅ ΡΠ°ΠΌΠΎ ΠΏΡΠΈΠ±Π»ΠΈΠ·ΠΈΡΠ΅Π»Π΅Π½ ΡΠΏΠΈΡΡΠΊ Π½Π° ΡΠΎΠ²Π°, ΠΊΠΎΠ΅ΡΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ Ρ Π½Π°ΡΠ°ΡΠ° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΡΡΠ΅Π· ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ SQL ΠΊΠΎΠ΄. Π‘ΠΈΠ³ΡΡΠ΅Π½ ΡΡΠΌ, ΡΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΠΌ ΠΎΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΏΠΈΡΠ΅ΡΠ΅ Π² ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅. Π Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ (ΠΈ Π½Π°ΠΉ-Π²Π΅ΡΠ΅ Π·Π°ΡΠΎ) Π΄Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π° ΠΈ Π΄Π° Π³ΠΎ Π²ΠΊΠ»ΡΡΠΈΠΌ Π² ΡΠ²ΠΎΡ CI/CD pipeline ΡΠ΅ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡ ΠΏΡΡ.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
