SQL, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠΎΡΠ΅? ΠΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· Π½Π°Ρ ΠΌΠΎΠΆΠ΅Ρ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΠΏΡΠΎΡΡΠ΅Π½ΡΠΊΠΈΠΉ Π·Π°ΠΏΡΠΎΡ β Π½Π°Π±ΠΈΡΠ°Π΅ΠΌ select, ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»ΡΠ΅ΠΌ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ, Π·Π°ΡΠ΅ΠΌ from, ΠΈΠΌΡ ΡΠ°Π±Π»ΠΈΡΡ, Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΠ»ΠΎΠ²ΠΈΠΉ Π² where ΠΈ Π²ΡΠ΅ β ΠΏΠΎΠ»Π΅Π·Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Ρ Π½Π°Ρ Π² ΠΊΠ°ΡΠΌΠ°Π½Π΅, ΠΏΡΠΈΡΠ΅ΠΌ (ΠΏΠΎΡΡΠΈ) Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊΠ°Ρ Π‘Π£ΠΠ Π² ΡΡΠΎ Π²ΡΠ΅ΠΌΡ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡΠΎΠΌ (Π° ΠΌΠΎΠΆΠ΅Ρ ΠΈ
Π Π½Π°ΡΠ½Π΅ΠΌ ΠΏΡΡΠΌΠΎ Ρ
ΠΠ±ΡΠ΅ΠΊΡΠ½ΠΎ-ΡΠ΅Π»ΡΡΠΈΠΎΠ½Π½ΡΠΉ ΠΌΠ°ΠΏΠΈΠ½Π³
Π‘ΡΠΎΡΠΎΠ½Π½ΠΈΠΊΠΈ 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 ΠΎΠ±ΡΡΠ½ΡΠΌ 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 ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ", Π²Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΠ΅:
- ΠΠΈΠΊΠ°ΠΊΠΈΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΡΡΠΏΡΠΈΠ·ΠΎΠ². ΠΠ°ΡΠ° Π±Π°Π·Π° Π΄Π°Π½Π½ΡΡ (ΠΊΠ°ΠΊ ΠΈ Π»ΡΠ±Π°Ρ Π΄ΡΡΠ³Π°Ρ) Π½Π΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ SQL ΡΡΠ°Π½Π΄Π°ΡΡΡ Π½Π° 100% β Π½ΠΎ Π΄Π»Ρ Yesql ΡΡΠΎ Π½Π΅ Π²Π°ΠΆΠ½ΠΎ. ΠΡ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡΠ΄Π΅ΡΠ΅ ΡΡΠ°ΡΠΈΡΡ Π²ΡΠ΅ΠΌΡ Π½Π° ΠΎΡ ΠΎΡΡ Π·Π° ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠΎΠΌ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΡΠΌ SQL. ΠΠ°ΠΌ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΡΠΈΠ΄Π΅ΡΡΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΡΡ ΠΊ ΡΡΠ½ΠΊΡΠΈΠΈ (raw-sql "some (‘funky’ :: SYNTAX)")).
- ΠΡΡΡΠ°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ°. ΠΠ°Ρ ΡΠ΅Π΄Π°ΠΊΡΠΎΡ ΡΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ ΠΎΡΠ»ΠΈΡΠ½ΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ SQL. Π‘ΠΎΡ ΡΠ°Π½ΡΡ SQL ΠΊΠ°ΠΊ SQL, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ.
- ΠΠΎΠΌΠ°Π½Π΄Π½Π°Ρ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡ. ΠΠ°ΡΠΈ DBA ΠΌΠΎΠ³ΡΡ ΡΠΈΡΠ°ΡΡ ΠΈ ΠΏΠΈΡΠ°ΡΡ SQL, ΠΊΠΎΡΠΎΡΡΠΉ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ Π² ΡΠ²ΠΎΠ΅ΠΌ Clojure ΠΏΡΠΎΠ΅ΠΊΡΠ΅.
- ΠΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΠ°Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ. ΠΡΠΆΠ½ΠΎ ΠΏΠΎΡΡΡΠΎΠΈΡΡ ΠΏΠ»Π°Π½ Π΄Π»Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ°? ΠΡΠΎ Π½Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΊΠΎΠ³Π΄Π° Π²Π°Ρ Π·Π°ΠΏΡΠΎΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΡΡΠ½ΡΠΌ SQL.
- ΠΠΎΠ²ΡΠΎΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΠΎΠ². ΠΠ΅ΡΠ΅ΡΠ°ΡΠΈΡΠ΅ ΡΡΠΈ ΠΆΠ΅ SQL-ΡΠ°ΠΉΠ»Ρ Π² Π΄ΡΡΠ³ΠΎΠΉ ΠΏΡΠΎΠ΅ΠΊΡΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ ΡΡΠ°ΡΡΠΉ Π΄ΠΎΠ±ΡΡΠΉ SQL β ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΠ΄Π΅Π»ΠΈΡΠ΅ΡΡ ΠΈΠΌ.
ΠΠΎ ΠΌΠΎΠ΅ΠΌΡ ΠΈΠ΄Π΅Ρ ΠΎΡΠ΅Π½Ρ ΠΊΡΡΡΠ°Ρ ΠΈ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠ°Ρ, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΠ΅ΠΌΡ ΠΏΡΠΎΠ΅ΠΊΡ ΠΎΠ±ΡΠ΅Π» ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ
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" 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 (Π³Π΄Π΅ Π΅ΡΡΡ columnfamilies Π²ΠΌΠ΅ΡΡΠΎ tables ΠΈ keyspace’Ρ Π²ΠΌΠ΅ΡΡΠΎ ΡΡ Π΅ΠΌ):
select columnfamily_name
, compaction_strategy_class -- Π‘ΡΡΠ°ΡΠ΅Π³ΠΈΡ ΡΠ±ΠΎΡΠΊΠΈ ΠΌΡΡΠΎΡΠ°
, gc_grace_seconds -- ΠΡΠ΅ΠΌΡ ΠΆΠΈΠ·Π½ΠΈ ΠΌΡΡΠΎΡΠ°
, ...
from system.schema_columnfamilies
where keyspace_name = 'HR'
ΠΠ»Ρ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π° ΠΎΡΡΠ°Π»ΡΠ½ΡΡ
ΠΠ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠ΄ΡΠΌΠ°ΡΡ ΠΏΠΎΡ
ΠΎΠΆΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΡ (Π΄Π°ΠΆΠ΅ Π² Mongo Π΅ΡΡΡ
Π‘Π°ΠΌΠΎ ΡΠΎΠ±ΠΎΠΉ, ΡΠ°ΠΊΠΈΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΎ ΡΠ°Π±Π»ΠΈΡΠ°Ρ
, Π° Π²ΠΎΠΎΠ±ΡΠ΅ ΠΎ Π»ΡΠ±ΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ΅. ΠΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ Π΄ΠΎΠ±ΡΡΠ΅ Π»ΡΠ΄ΠΈ Π΄Π΅Π»ΡΡΡΡ ΡΠ°ΠΊΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ
ΠΠ, ΠΊΠ°ΠΊ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΡΠ΅ΡΠΈΠΈ Ρ
Π°Π±ΡΠ°-ΡΡΠ°ΡΠ΅ΠΉ "Π€ΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π±Π°Π· Π΄Π°Π½Π½ΡΡ
PostgreSQL" (
Π ΠΈΡΠΎΠ³Π΅ ΡΠ°ΠΊΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± Π½Π°Π²ΠΈΠ³Π°ΡΠΈΠΈ ΠΈ ΠΏΠΎΠΈΡΠΊΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π³ΠΎΡΠ°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΎΠΊ, ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈ Π² ΡΠΎΠΌ Π²ΠΈΠ΄Π΅, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠ΅ΠΉΡΠ°Ρ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ (ΠΊΠ°ΠΊ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π² ΠΏΠΎΡΡΠ΅
ΠΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ
ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΌΡ Π½Π°ΡΠ»ΠΈ ΠΈ ΠΈΠ·ΡΡΠΈΠ»ΠΈ Π½ΡΠΆΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΡΠ°ΠΌΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Ρ Π½ΠΈΠΌΠΈ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅. ΠΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ, ΡΠ°ΠΊΠΆΠ΅ Π½Π΅ ΠΎΡΡΡΠ²Π°Ρ ΠΏΠ°Π»ΡΡΠ΅Π² ΠΎΡ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΡ.
ΠΠ΅ ΡΠ΅ΠΊΡΠ΅Ρ, ΡΡΠΎ ΠΏΡΠΎΡΡΠΎΠ΅ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΈΡΡ Π±ΡΠ΄Π΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ ΠΏΠΎΡΡΠΈ Π²ΠΎ Π²ΡΠ΅Ρ ΠΠ:
drop table hr.persons
Π Π²ΠΎΡ Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ΠΌ ΡΠ°Π±Π»ΠΈΡΡ ΡΠΆΠ΅ ΠΏΠΎΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π΅Π΅. ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π»ΡΠ±Π°Ρ Π‘Π£ΠΠ (Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ NoSQL) Π² ΡΠΎΠΌ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΌ Π²ΠΈΠ΄Π΅ ΡΠΌΠ΅Π΅Ρ "create table", ΠΈ ΠΎΡΠ½ΠΎΠ²Π½Π°Ρ Π΅Π³ΠΎ ΡΠ°ΡΡΡ Π΄Π°ΠΆΠ΅ ΠΌΠ°Π»ΠΎ Π±ΡΠ΄Π΅Ρ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ (ΠΈΠΌΡ, ΡΠΏΠΈΡΠΎΠΊ ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ, ΡΠΈΠΏΡ Π΄Π°Π½Π½ΡΡ
), Π½ΠΎ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ Π΄Π΅ΡΠ°Π»ΠΈ ΠΌΠΎΠ³ΡΡ ΡΠ°Π·ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ ΠΈ Π·Π°Π²ΠΈΡΡΡ ΠΎΡ Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π³ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΉ Π‘Π£ΠΠ. ΠΠΎΠΉ Π»ΡΠ±ΠΈΠΌΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ β Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Oracle ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΈ "Π³ΠΎΠ»ΡΠ΅" ΠΠΠ€’Ρ Π΄Π»Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° "create table"
Π’Π°ΠΊΠΆΠ΅ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ Π‘Π£ΠΠ Π΅ΡΡΡ ΡΠ²ΠΎΠΈ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΡΠ΅ ΡΠΈΠΏΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΡΡΡΡΡΡΠ²ΡΡΡ Π² Π΄ΡΡΠ³ΠΈΡ Π‘Π£ΠΠ. ΠΡΠΈΡΠ΅ΠΌ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π½Π°Π΄ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ ΠΠ, Π½ΠΎ ΠΈ Π½Π°Π΄ ΡΠ°ΠΌΠΎΠΉ Π‘Π£ΠΠ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ "ΡΠ±ΠΈΡΡ" ΠΏΡΠΎΡΠ΅ΡΡ, ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡΡ ΠΊΠ°ΠΊΡΡ-Π»ΠΈΠ±ΠΎ ΠΎΠ±Π»Π°ΡΡΡ ΠΏΠ°ΠΌΡΡΠΈ, Π²ΠΊΠ»ΡΡΠΈΡΡ ΡΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΡ, ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ Π² ΡΠ΅ΠΆΠΈΠΌ "read only" ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄ΡΡΠ³ΠΎΠ΅.
Π ΡΠ΅ΠΏΠ΅ΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΈΡΡΠ΅ΠΌ
ΠΠ΄Π½Π° ΠΈΠ· ΡΠ°ΠΌΡΡ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΡΡ Π·Π°Π΄Π°Ρ β ΠΏΠΎΡΡΡΠΎΠΈΡΡ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΡ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ ΠΠ, Π½Π° ΠΊΡΠ°ΡΠΈΠ²ΠΎΠΉ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠ΅ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΈ ΡΠ²ΡΠ·ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π½ΠΈΠΌΠΈ. ΠΡΠΎ ΡΠΌΠ΅Π΅Ρ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π»ΡΠ±Π°Ρ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ IDE, ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ Β«command lineΒ»-ΡΡΠΈΠ»ΠΈΡΡ, ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΡΠ»Ρ ΠΈ ΠΌΠΎΠ΄Π΅Π»Π»Π΅ΡΡ. ΠΠΎΡΠΎΡΡΠ΅ Π²Π°ΠΌ ΡΡΠΎ-ΡΠΎ Π½Π°ΡΠΈΡΡΡΡ "ΠΊΠ°ΠΊ ΡΠΌΠ΅ΡΡ", Π° Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ²Π»ΠΈΡΡΡ Π½Π° ΡΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ ΠΈΠ»ΠΈ Π³Π°Π»ΠΎΡΠ΅ΠΊ Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅.
ΠΠΎ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅ΡΠΈΡΡ Π³ΠΎΡΠ°Π·Π΄ΠΎ ΠΏΡΠΎΡΠ΅, Π³ΠΈΠ±ΡΠ΅ ΠΈ ΡΠ»Π΅Π³Π°Π½ΡΠ½Π΅Π΅, ΠΈ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ ΠΆΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠ΄Π°. ΠΠ»Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌ Π»ΡΠ±ΠΎΠΉ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ Ρ Π½Π°Ρ Π΅ΡΡΡ ΡΡΠ°Π·Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΠ·ΡΠΊΠΎΠ² ΡΠ°Π·ΠΌΠ΅ΡΠΊΠΈ (DOT, GraphML etc), Π° ΠΊ Π½ΠΈΠΌ β ΡΠ΅Π»Π°Ρ ΡΠΎΡΡΡΠΏΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ (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'
ΠΡΠ»ΠΈ Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΈΡΠΌΠΎΡΡΠ΅ΡΡΡΡ, ΡΠΎ ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡΠΎΠΌ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ-Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΎΡΡ ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΏΠΎΡ
ΠΎΠΆΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΡ. ΠΡΠ°Π²Π΄Π°, Π·Π°ΠΏΡΠΎΡΡ ΡΡΠΈ ΠΎΠ±ΡΡΠ½ΠΎ Π³Π»ΡΠ±ΠΎΠΊΠΎ
ΠΠ΅ΡΡΠΈΠΊΠΈ ΠΈ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³
ΠΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΠΉ ΡΠ΅ΠΌΠ΅ β ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΠ. ΠΡΠΏΠΎΠΌΠ½Ρ Π½Π΅Π±ΠΎΠ»ΡΡΡΡ true story, ΡΠ°ΡΡΠΊΠ°Π·Π°Π½Π½ΡΡ ΠΌΠ½Π΅ "ΠΎΠ΄Π½ΠΈΠΌ ΠΌΠΎΠΈΠΌ Π΄ΡΡΠ³ΠΎΠΌ". ΠΠ° ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅ ΠΆΠΈΠ»-Π±ΡΠ» Π½Π΅ΠΊΠΈΠΉ ΠΌΠΎΠ³ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΉ DBA, ΠΈ ΠΌΠ°Π»ΠΎ ΠΊΡΠΎ ΠΈΠ· ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² Π±ΡΠ» Ρ Π½ΠΈΠΌ Π·Π½Π°ΠΊΠΎΠΌ Π»ΠΈΡΠ½ΠΎ, Π΄Π° ΠΈ Π²ΠΎΠΎΠ±ΡΠ΅ Π²ΠΈΠ΄Π΅Π» ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡΠ΄Ρ Π΅Π³ΠΎ Π² Π³Π»Π°Π·Π° (Π½Π΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΎ, ΡΡΠΎ ΡΡΡΠ΄ΠΈΠ»ΡΡ ΠΎΠ½, ΠΏΠΎ ΡΠ»ΡΡ Π°ΠΌ, Π³Π΄Π΅-ΡΠΎ Π² ΡΠΎΡΠ΅Π΄Π½Π΅ΠΌ ΠΊΠΎΡΠΏΡΡΠ΅). Π ΡΠ°Ρ "X", ΠΊΠΎΠ³Π΄Π° poduction-ΡΠΈΡΡΠ΅ΠΌΠ° ΠΊΡΡΠΏΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΠ΅ΠΉΠ»Π΅ΡΠ° Π½Π°ΡΠΈΠ½Π°Π»Π° Π² ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠΉ ΡΠ°Π· "ΠΏΠ»ΠΎΡ ΠΎ ΡΠ΅Π±Ρ ΡΡΠ²ΡΡΠ²ΠΎΠ²Π°ΡΡ", ΠΎΠ½ ΠΌΠΎΠ»ΡΠ° ΠΏΡΠΈΡΡΠ»Π°Π» ΡΠΊΡΠΈΠ½ΡΠΎΡΡ Π³ΡΠ°ΡΠΈΠΊΠΎΠ² ΠΈΠ· ΠΎΡΠ°ΠΊΠ»ΠΎΠ²ΠΎΠ³ΠΎ Enterprise Manager, Π½Π° ΠΊΠΎΡΠΎΡΡΡ Π±Π΅ΡΠ΅ΠΆΠ½ΠΎ Π²ΡΠ΄Π΅Π»ΡΠ» ΠΊΡΠΈΡΠΈΡΠ½ΡΠ΅ ΠΌΠ΅ΡΡΠ° ΠΊΡΠ°ΡΠ½ΡΠΌ ΠΌΠ°ΡΠΊΠ΅ΡΠΎΠΌ Π΄Π»Ρ "ΠΏΠΎΠ½ΡΡΠ½ΠΎΡΡΠΈ" (ΡΡΠΎ, ΠΌΡΠ³ΠΊΠΎ Π³ΠΎΠ²ΠΎΡΡ, ΠΌΠ°Π»ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π»ΠΎ). Π Π²ΠΎΡ ΠΏΠΎ ΡΡΠΎΠΉ "ΡΠΎΡΠΎΠΊΠ°ΡΡΠΎΡΠΊΠ΅" ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΠ»ΠΎΡΡ Π»Π΅ΡΠΈΡΡ. ΠΡΠΈ ΡΡΠΎΠΌ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π΄ΡΠ°Π³ΠΎΡΠ΅Π½Π½ΠΎΠΌΡ (Π² ΠΎΠ±ΠΎΠΈΡ ΡΠΌΡΡΠ»Π°Ρ ΡΡΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π°) Enterprise Manager Π½ΠΈ Ρ ΠΊΠΎΠ³ΠΎ Π½Π΅ Π±ΡΠ»ΠΎ, Ρ.ΠΊ. ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠ»ΠΎΠΆΠ½Π°Ρ ΠΈ Π΄ΠΎΡΠΎΠ³Π°Ρ, Π²Π΄ΡΡΠ³ "ΡΠ°Π·ΡΠ°Π±Ρ ΡΠ΅Π³ΠΎ-Π½ΠΈΡΡ Π½Π°ΡΡΠΊΠ°ΡΡ ΠΈ Π²ΡΠ΅ ΠΏΠΎΠ»ΠΎΠΌΠ°ΡΡ". ΠΠΎΡΡΠΎΠΌΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ "ΡΠΌΠΏΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΌ" ΠΏΡΡΠ΅ΠΌ Π½Π°Ρ ΠΎΠ΄ΠΈΠ»ΠΈ ΠΌΠ΅ΡΡΠΎ ΠΈ ΠΏΡΠΈΡΠΈΠ½Ρ ΡΠΎΡΠΌΠΎΠ·ΠΎΠ² ΠΈ Π²ΡΠΏΡΡΠΊΠ°Π»ΠΈ ΠΏΠ°ΡΡ. ΠΡΠ»ΠΈ Π³ΡΠΎΠ·Π½ΠΎΠ΅ ΠΏΠΈΡΡΠΌΠΎ ΠΎΡ DBA Π½Π΅ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΠ»ΠΎ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Π² Π±Π»ΠΈΠΆΠ°ΠΉΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ, ΡΠΎ Π²ΡΠ΅ Ρ ΠΎΠ±Π»Π΅Π³ΡΠ΅Π½ΠΈΠ΅ΠΌ Π²ΡΠ΄ΡΡ Π°Π»ΠΈ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π»ΠΈΡΡ ΠΊ ΡΠ²ΠΎΠΈΠΌ ΡΠ΅ΠΊΡΡΠΈΠΌ Π·Π°Π΄Π°ΡΠ°ΠΌ (Π΄ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΠΈΡΡΠΌΠ°).
ΠΠΎ ΠΏΡΠΎΡΠ΅ΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ Π±ΠΎΠ»Π΅Π΅ Π²Π΅ΡΠ΅Π»ΠΎ ΠΈ Π΄ΡΡΠΆΠ΅Π»ΡΠ±Π½ΠΎ, Π° ΡΠ°ΠΌΠΎΠ΅ Π³Π»Π°Π²Π½ΠΎΠ΅ β Π΄ΠΎΡΡΡΠΏΠ½ΠΎ ΠΈ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΎ Π΄Π»Ρ Π²ΡΠ΅Ρ
. Π₯ΠΎΡΡ Π±Ρ Π±Π°Π·ΠΎΠ²Π°Ρ Π΅Π³ΠΎ ΡΠ°ΡΡΡ, ΠΊΠ°ΠΊ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌ ΡΠΈΡΡΠ΅ΠΌΠ°ΠΌ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° (ΠΊΠΎΡΠΎΡΡΠ΅ Π±Π΅Π·ΡΡΠ»ΠΎΠ²Π½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Ρ ΠΈ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ
ΡΠ»ΡΡΠ°ΡΡ
Π½Π΅Π·Π°ΠΌΠ΅Π½ΠΈΠΌΡ). ΠΡΠ±Π°Ρ Π‘Π£ΠΠ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎ ΠΈ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ Π±Π΅Π·Π²ΠΎΠ·ΠΌΠ΅Π·Π΄Π½ΠΎ Π³ΠΎΡΠΎΠ²Π° ΠΏΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ ΠΎ ΡΠ²ΠΎΠ΅ΠΌ ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ. Π ΡΠΎΠΉ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠΉ "ΠΊΡΠΎΠ²Π°Π²ΠΎΠΉ" Oracle DB ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π»ΡΠ±ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΈΠ· ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ
ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΉ, Π½Π°ΡΠΈΠ½Π°Ρ ΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΈ ΡΠ΅ΡΡΠΈΠΉ ΠΈ Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ Π±ΡΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ΅ΡΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,
Π’.ΠΎ., Π²ΠΎΠΎΡΡΠΆΠΈΠ²ΡΠΈΡΡ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΡΠ±ΠΎΡΡΠΈΠΊΠΎΠΌ ΠΌΠ΅ΡΡΠΈΠΊ (Telegraf, Metricbeat, Collectd), ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΌΠ΅Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΠ΅ sql-Π·Π°ΠΏΡΠΎΡΡ, Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΠΌ ΡΡΠΈΡ
ΠΌΠ΅ΡΡΠΈΠΊ (InfluxDB, Elasticsearch, Timescaledb) ΠΈ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΎΡΠΎΠΌ (Grafana, Kibana), ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π»Π΅Π³ΠΊΡΡ ΠΈ Π³ΠΈΠ±ΠΊΡΡ ΡΠΈΡΡΠ΅ΠΌΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π°, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ ΡΠ΅ΡΠ½ΠΎ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°Π½Π° Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΎΠ±ΡΠ΅ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΌΠΈ ΠΌΠ΅ΡΡΠΈΠΊΠ°ΠΌΠΈ (ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌΡΠΌΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΎΡ ΠΠ‘ ΠΈ ΠΏΡ.). ΠΠ°ΠΊ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠΎ ΡΠ΄Π΅Π»Π°Π½ΠΎ Π² pgwatch2, Π³Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠ²ΡΠ·ΠΊΠ° InfluxDB + Grafana ΠΈ Π½Π°Π±ΠΎΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΊ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΌ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡΠΌ, ΠΊ ΠΊΠΎΡΠΎΡΡΠΌ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ
ΠΡΠΎΠ³ΠΎ
Π ΡΡΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈΠ±Π»ΠΈΠ·ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΏΠ΅ΡΠ΅ΡΠ΅Π½Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Ρ Π½Π°ΡΠ΅ΠΉ ΠΠ ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ SQL-ΠΊΠΎΠ΄Π°. Π£Π²Π΅ΡΠ΅Π½, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π΅ΡΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΠΏΠΈΡΠΈΡΠ΅ Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ . Π ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ (ΠΈ ΡΠ°ΠΌΠΎΠ΅ Π³Π»Π°Π²Π½ΠΎΠ΅ Π·Π°ΡΠ΅ΠΌ) ΡΡΠΎ Π²ΡΠ΅ Π·Π°Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΈ Π²ΠΊΠ»ΡΡΠΈΡΡ Π² ΡΠ²ΠΎΠΉ CI/CD pipeline ΠΌΡ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ Π² ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ°Π·.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com