
SQL, ΠΊΠ°ΠΊΠ²ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎ-ΠΏΡΠΎΡΡΠΎ? ΠΡΠ΅ΠΊΠΈ ΠΎΡ Π½Π°Ρ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ ΠΏΡΠΎΡΡΠΈΡΡΠΊ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ β Π²ΡΠ²Π΅ΠΆΠ΄Π°ΠΌΠ΅ select, ΠΈΠ·Π±ΡΠΎΡΠ²Π°ΠΌΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΈ, ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° from, ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°, ΠΌΠ°Π»ΠΊΠΎ ΡΡΠ»ΠΎΠ²ΠΈΡ Π² where ΠΈ Π²ΡΠΈΡΠΊΠΎ β ΠΏΠΎΠ»Π΅Π·Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ ΡΠ° Π² Π½Π°ΡΠΈΡ Π΄ΠΆΠΎΠ±, ΠΏΡΠΈ ΡΠΎΠ²Π° (ΠΏΠΎΡΡΠΈ) Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΎΠ²Π° ΠΊΠΎΡ Π‘Π£ΠΠ Π΅ Π·Π°Π΄ ΠΊΡΠ»ΠΈΡΠΈΡΠ΅ (ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅ Π±ΠΈ ). Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ²Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Ρ ΠΏΠΎΡΡΠΈ Π²ΡΡΠΊΠ°ΠΊΡΠ² ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ Π½Π° Π΄Π°Π½Π½ΠΈ (ΡΠ΅Π»Π°ΡΠΈΠΎΠ½Π΅Π½ ΠΈ Π½Π΅ ΡΠ°ΠΌΠΎ) ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π°Π½Π° Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π½Π° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ ΠΊΠΎΠ΄ (Ρ Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΠΈΠ·ΡΠΈΡΠ°ΡΠΈ ΠΎΡ ΡΠΎΠ²Π° β ΠΊΠΎΠ½ΡΡΠΎΠ» Π½Π° Π²Π΅ΡΡΠΈΠΈΡΠ΅, ΠΏΡΠ΅Π³Π»Π΅Π΄ Π½Π° ΠΊΠΎΠ΄Π°, ΡΡΠ°ΡΠΈΡΠ΅Π½ Π°Π½Π°Π»ΠΈΠ·, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΡΠ΅ΡΡΠΎΠ²Π΅ ΠΈ Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π°). Π ΡΠΎΠ²Π° ΠΊΠ°ΡΠ°Π΅ Π½Π΅ ΡΠ°ΠΌΠΎ ΡΠ°ΠΌΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ, ΡΡ Π΅ΠΌΠΈ ΠΈ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ, Π° ΠΈΠ·ΠΎΠ±ΡΠΎ ΡΡΠ»ΠΎΡΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ°Π½Π΅ Π½Π° Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ. Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΠΌ Π·Π° Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΈΡΠ΅ Π·Π°Π΄Π°ΡΠΈ ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ° Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ ΠΏΠΎΠ΄ ΡΠ³Π»Π΅Π΄Π° Π½Π° "database as code".
Π ΡΠ΅ Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ Π½Π°ΠΏΡΠ°Π²ΠΎ Ρ . ΠΡΡΠ²ΠΈΡΠ΅ ΡΠ±Π»ΡΡΡΡΠΈ "SQL vs 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 ΠΊΠΎΠ΄. ΠΠ΅ΠΆΠ΄Ρ Π΄ΡΡΠ³ΠΎΡΠΎ, ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ ΡΠ΅ ΠΎΠΏΠΈΡΠ²Π°Ρ Ρ Π²ΡΠΈΡΠΊΠΈ ΡΠΈΠ»ΠΈ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΎΠ»ΠΈΡΠ°Ρ ΠΎΡ ΡΠ²ΠΎΡΡΠ° ΠΠ Ρ ΠΊΠΈΠ»ΠΎΠΌΠ΅ΡΡΠΈ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΈ, ΠΊΠΎΠ΅ΡΠΎ Π³ΠΎΠ²ΠΎΡΠΈ Π·Π° ΠΈΠ·Π²Π΅ΡΡΠ½Π° .
ΠΡ Π΄ΡΡΠ³Π°ΡΠ° ΡΡΡΠ°Π½Π° Π½Π° Π±Π°ΡΠΈΠΊΠ°Π΄Π°ΡΠ°, ΠΏΡΠΈΠ²ΡΡΠΆΠ΅Π½ΠΈΡΠΈΡΠ΅ Π½Π° ΡΠΈΡΡΠΎΡΠΎ "ΡΡΡΠ½ΠΎ" SQL ΠΎΡΠ±Π΅Π»ΡΠ·Π²Π°Ρ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π΄Π° ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ Π²ΡΠΈΡΠΊΠΎ ΠΎΡ ΡΠ²ΠΎΡΡΠ° Π‘Π£ΠΠ Π±Π΅Π· Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΠΏΡΠΎΡΠ»ΠΎΠΉΠΊΠΈ ΠΈ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΈ. Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΠΏΠΎΡΠ²ΡΠ²Π°Ρ "data-centric" ΠΏΡΠΎΠ΅ΠΊΡΠΈ, ΠΊΡΠ΄Π΅ΡΠΎ Π±Π°Π·Π°ΡΠ° Π΅ Π² ΡΡΡΠ΅ΡΠ΅ Π½Π° ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈ Ρ ΠΎΡΠ° (ΡΡΡΠΈΡΠ΅ ΡΠ΅Π·ΠΈ "Π±Π°Π·ΠΈΡΠΈ", "Π±Π°Π·ΠΎΠ²ΠΈΠΊΠΈ", "Π±Π°Π·Π΄Π΅Π½ΡΡΠΈΠΊΠΈ" ΠΈ Ρ.Π½.), Π° Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ ΠΎΡΡΠ°Π²Π° ΡΠ°ΠΌΠΎ Π΄Π° "ΠΈΠ·Π΄ΡΡΠΏΠ°Ρ" Π³ΠΎΡΠΎΠ²ΠΈΡΠ΅ ΠΈΠ·Π³Π»Π΅Π΄ΠΈ ΠΈ ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠΈ, Π±Π΅Π· Π΄Π° ΡΠ΅ Π·Π°Π΄ΡΠ»Π±ΠΎΡΠ°Π²Π°Ρ Π² Π΄Π΅ΡΠ°ΠΉΠ»ΠΈΡΠ΅.
Π ΠΊΠ°ΠΊΠ²ΠΎ, Π°ΠΊΠΎ Π²Π·Π΅ΠΌΠ΅ΠΌ Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΎΡΠΎ ΠΎΡ Π΄Π²Π°ΡΠ° ΡΠ²ΡΡΠ°? ΠΠ°ΠΊΡΠΎ Π΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΎ Π² Π·Π°Π±Π΅Π»Π΅ΠΆΠΈΡΠ΅Π»Π½ΠΈΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Ρ ΡΡΠ²ΡΡΠ΄ΠΈΡΠ΅Π»Π½ΠΎ ΠΈΠΌΠ΅ . Π©Π΅ Π΄Π°ΠΌ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ΅Π΄Π° ΠΎΡ ΠΎΠ±ΡΠ°ΡΠ° ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ Π² ΠΌΠΎΡΡ ΡΠ²ΠΎΠ±ΠΎΠ΄Π΅Π½ ΠΏΡΠ΅Π²ΠΎΠ΄, Π° ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ Ρ Π½Π΅Ρ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΡΠ΅ .
Clojure Π΅ ΡΡΡΠ°Ρ ΠΎΡΠ΅Π½ Π΅Π·ΠΈΠΊ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° DSL, Π½ΠΎ SQL ΡΠ°ΠΌ ΠΏΠΎ ΡΠ΅Π±Π΅ ΡΠΈ Π΅ ΡΡΡΠ°Ρ ΠΎΡΠ΅Π½ DSL, ΠΈ Π½Π΅ Π½ΠΈ ΡΡΡΠ±Π²Π° ΠΎΡΠ΅ Π΅Π΄ΠΈΠ½. S-ΠΈΠ·ΡΠ°Π·ΠΈΡΠ΅ ΡΠ° ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΠΈ, Π½ΠΎ ΡΡΠΊ Π½Π΅ Π΄ΠΎΠ±Π°Π²ΡΡ Π½ΠΈΡΠΎ Π½ΠΎΠ²ΠΎ. Π ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΡΠΊΠΎΠ±ΠΈ ΠΏΡΠΎΡΡΠΎ Π·Π°ΡΠ°Π΄ΠΈ ΡΠΊΠΎΠ±ΠΈΡΠ΅. ΠΠ΅ ΡΡΠ΅ ΡΡΠ³Π»Π°ΡΠ½ΠΈ? Π’ΠΎΠ³Π°Π²Π° ΠΈΠ·ΡΠ°ΠΊΠ°ΠΉΡΠ΅ ΠΌΠΎΠΌΠ΅Π½ΡΠ°, Π² ΠΊΠΎΠΉΡΠΎ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΡΡΠ° Π½Π°Π΄ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ ΡΠ΅ ΠΏΡΠΎΠΏΡΡΠ½Π΅, ΠΈ Π²ΠΈΠ΅ ΡΠ΅ Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ Π±ΠΎΡΠ±Π° Ρ ΡΡΠ½ΠΊΡΠΈΡΡΠ° (raw-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})
;;; Π€ΡΠ½ΠΊΡΠΈΡ Ρ ΠΈΠΌΠ΅ΡΠΎ `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-manager, Π½Π°ΠΉ-Π½Π°ΠΏΡΠ΅Π΄, ΠΎΡΠ°ΠΊΠ²Π°ΠΌΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ΅Π·ΠΈ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ. ΠΠ° Π΄Π° Π΅ Π±ΡΡΠ·ΠΎ ΠΈ Π΄Π° Π½Π΅ ΡΠ΅ Π½Π°Π»Π°Π³Π° Π΄Π° ΡΠ°ΠΊΠ°ΠΌΠ΅ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½ ΡΠ°Ρ, Π΄ΠΎΠΊΠ°ΡΠΎ ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ ΠΏΡΠΎΠ·ΠΎΡΠ΅Ρ Ρ Π½ΡΠΆΠ½Π°ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ (ΠΎΡΠΎΠ±Π΅Π½ΠΎ ΠΏΡΠΈ Π±Π°Π²Π½ΠΎ ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Ρ ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½Π° ΠΠ), ΠΈ ΡΡΡΠ΅Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½Π°ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π΄Π° Π΅ Π°ΠΊΡΡΠ°Π»Π½Π° ΠΈ ΡΠ²Π΅ΠΆΠ°, Π° Π½Π΅ ΠΊΠ΅ΡΠΈΡΠ°Π½Π° ΠΎΡΡΠ°ΡΡΠ»Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ. ΠΡΡΡΠ½ΠΎΡΡ, ΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΠΏΠΎ-ΡΠ»ΠΎΠΆΠ½Π° ΠΈ Π³ΠΎΠ»ΡΠΌΠ° Π΅ ΠΠ ΠΈ ΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅ ΡΠ° ΡΠ΅, ΡΠΎΠ»ΠΊΠΎΠ²Π° ΠΏΠΎ-ΡΡΡΠ΄Π½ΠΎ Π΅ ΡΠΎΠ²Π°.
ΠΠΎ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΎΡΡ Π²ΡΡΠ»ΡΠΌ ΠΌΠΈΡΠΊΠ°ΡΠ° ΠΈ ΠΏΡΠΎΡΡΠΎ ΠΏΠΈΡΠ° ΠΊΠΎΠ΄. ΠΠ° ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ ΠΊΠΎΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ (ΠΈ Ρ ΠΊΠ°ΠΊΠ²ΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π°) ΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ°Ρ Π² ΡΡ Π΅ΠΌΠ°ΡΠ° "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, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΠΎΡΠ΄Π΅Π»Π½ΠΈ "command line" ΡΡΠΈΠ»ΠΈΡΠΈ, ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ Π³ΡΠ°ΡΠΈΡΠ½ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ°ΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ, ΠΌΠΎΠ³Π°Ρ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΡΡ. Π’Π΅ ΡΠ΅ Π²ΠΈ Π½Π°ΡΠΈΡΡΠ²Π°Ρ βΠΊΠ°ΠΊΡΠΎ ΠΌΠΎΠ³Π°Ρβ, Π° ΠΌΠ°Π»ΠΊΠΎ Π²Π»ΠΈΡΠ½ΠΈΠ΅ Π²ΡΡΡ Ρ ΠΏΡΠΎΡΠ΅ΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΎΠΊΠ°ΠΆΠ΅, ΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠΏΡΠ°ΠΆΠ½ΠΈ ΡΠ°ΠΌΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΠ° Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡ ΡΠ°ΠΉΠ» ΠΈΠ»ΠΈ ΠΎΡΠΌΠ΅ΡΠΊΠΈ Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°.
ΠΠΎ ΡΠ°Π·ΠΈ Π·Π°Π΄Π°ΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ΅ΡΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-ΠΏΡΠΎΡΡΠΎ, Π³ΡΠ²ΠΊΠ°Π²ΠΎ ΠΈ Π΅Π»Π΅Π³Π°Π½ΡΠ½ΠΎ, ΡΠ°Π·Π±ΠΈΡΠ° ΡΠ΅, Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΊΠΎΠ΄. ΠΠ° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΈ Ρ Π²ΡΡΠΊΠ°ΠΊΠ²Π° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π°ΠΌΠ΅ Ρ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ Π΅Π·ΠΈΠΊΠ° Π·Π° ΡΠ°Π·ΠΌΠ΅ΡΠΊΠ° (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 Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠ° Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ Π½Π΅ΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΡΠ²Π° ΠΈΡΡΠΈΠ½ΡΠΊΠ° 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
