ΠžΠΏΠΈΡ‚ Β«Π‘Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΊΠ°Ρ‚ΠΎ ΠΊΠΎΠ΄Β»

ΠžΠΏΠΈΡ‚ Β«Π‘Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΊΠ°Ρ‚ΠΎ ΠΊΠΎΠ΄Β»

SQL, ΠΊΠ°ΠΊΠ²ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΏΠΎ-лСсно? ВсСки ΠΎΡ‚ нас ΠΌΠΎΠΆΠ΅ Π΄Π° напишС ΠΏΡ€ΠΎΡΡ‚ΠΈΡ‡ΡŠΠΊ заявка β€” просто въвСТдамС select, изброявамС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈΡ‚Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΈ, слСд ΠΊΠΎΠ΅Ρ‚ΠΎ from, ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π°, ΠΌΠ°Π»ΠΊΠΎ условия Π² where ΠΈ всичко β€” ΠΏΠΎΠ»Π΅Π·Π½ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ са Π² нашия Π΄ΠΆΠΎΠ±, ΠΊΠ°Ρ‚ΠΎ (ΠΏΠΎΡ‡Ρ‚ΠΈ) нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ²Π° коя Π‘Π£Π‘Π” Ρ€Π°Π±ΠΎΡ‚ΠΈ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° (Π° ΠΌΠΎΠΆΠ΅ ΠΈ Π΄Π° Π½Π΅ Π΅ Π‘Π£Π‘Π” ΠΈΠ·ΠΎΠ±Ρ‰ΠΎ). Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΠΎΡ‡Ρ‚ΠΈ с всСки ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ Π½Π° Π΄Π°Π½Π½ΠΈ (Ρ€Π΅Π»Π°Ρ†ΠΈΠΎΠ½Π΅Π½ ΠΈ Π½Π΅ ΠΌΠ½ΠΎΠ³ΠΎ) ΠΌΠΎΠΆΠ΅ Π΄Π° сС Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π° ΠΎΡ‚ Π³Π»Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ ΠΊΠΎΠ΄ (с всички прСдпоставки β€” ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° вСрсиитС, ΠΏΡ€Π΅Π³Π»Π΅Π΄ Π½Π° ΠΊΠΎΠ΄Π°, статичСн Π°Π½Π°Π»ΠΈΠ·, Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ тСстовС ΠΈ всичко Ρ‚ΠΎΠ²Π°). И Ρ‚ΠΎΠ²Π° сС отнася Π½Π΅ само Π΄ΠΎ самитС Π΄Π°Π½Π½ΠΈ, схСми ΠΈ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ, Π° Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ Π΄ΠΎ цялостната дСйност Π½Π° Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ. Π’ Ρ‚Π°Π·ΠΈ статия Ρ‰Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π·Π° Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π‘Π” ΠΏΠΎΠ΄ ΡƒΠ³Π»Π΅Π΄Π° Π½Π° "Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΊΠ°Ρ‚ΠΎ ΠΊΠΎΠ΄".

И Π·Π°ΠΏΠΎΡ‡Π²Π°ΠΌΠ΅ Π½Π°ΠΏΡ€Π°Π²ΠΎ с ORM. ΠŸΡŠΡ€Π²ΠΈΡ‚Π΅ ΡΠ±Π»ΡŠΡΡŠΡ†ΠΈ Ρ‚ΠΈΠΏ "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 ΠΊΠΎΠ΄. ΠšΠ°Ρ‚ΠΎ Π·Π°ΡƒΠ΄ΠΊΠ°, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ ΠΏΠΎΠ»Π°Π³Π°Ρ‚ усилия Π΄Π° сС Ρ€Π°Π·Π³Ρ€Π°Π½ΠΈΡ‡Π°Ρ‚ ΠΎΡ‚ своята Π‘Π” с ΠΊΠΈΠ»ΠΎΠΌΠ΅Ρ‚Ρ€ΠΈ абстракции, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΏΠΎΠΊΠ°Π·Π²Π° Π·Π° извСстна "ΠžΠœΠ ΠΠ—Π КΠͺМ SQL".

ΠžΡ‚ Π΄Ρ€ΡƒΠ³Π°Ρ‚Π° страна Π½Π° Π±Π°Ρ€ΠΈΠΊΠ°Π΄Π°Ρ‚Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠ½ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° чистия "handmade"-SQL отбСлязват Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° Π΄Π° ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ максимума ΠΎΡ‚ своята Π‘Π£Π‘Π” Π±Π΅Π· Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ слоСвС ΠΈ абстракции. Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° ΠΊΠΎΠ΅Ρ‚ΠΎ сС появяват "data-centric" ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ сС Π³Ρ€ΠΈΠΆΠΈ Π·Π° спСциално ΠΎΠ±ΡƒΡ‡Π΅Π½ Π΅ΠΊΠΈΠΏ (Ρ‚Π΅ ΡΡŠΡ‰ΠΎ са "даннисти", Ρ‚Π΅ ΡΡŠΡ‰ΠΎ са "Π±Π°Π·ΠΎΠ²Ρ†ΠΈ", Ρ‚Π΅ ΡΡŠΡ‰ΠΎ са "Π±Π°Π·Π΄Π΅Π½ΡŒΡ‰ΠΈΠΊΠΈ" ΠΈ Ρ‚.Π½.), Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ само трябва Π΄Π° "Π²Π·Π΅ΠΌΠ°Ρ‚" Π³ΠΎΡ‚ΠΎΠ²ΠΈ ΠΈΠ·Π³Π»Π΅Π΄ΠΈ ΠΈ ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΈ, Π±Π΅Π· Π΄Π° Π½Π°Π²Π»ΠΈΠ·Π°Ρ‚ Π² подробности.

А ΠΊΠ°ΠΊΠ²ΠΎ Π°ΠΊΠΎ Π²Π·Π΅ΠΌΠ΅ΠΌ Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€ΠΎΡ‚ΠΎ ΠΎΡ‚ Π΄Π²Π°Ρ‚Π° свята? ΠšΠ°ΠΊΡ‚ΠΎ Π΅ Π½Π°ΠΏΡ€Π°Π²Π΅Π½ΠΎ Π² чудСсния инструмСнт с ΠΆΠΈΠ·Π½Π΅ΡƒΡ‚Π²ΡŠΡ€Π΄ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΈΠΌΠ΅ Yesql. Π©Π΅ Ρ†ΠΈΡ‚ΠΈΡ€Π°ΠΌ няколко Ρ€Π΅Π΄Π° ΠΎΡ‚ ΠΎΠ±Ρ‰Π°Ρ‚Π° концСпция Π² моя свободСн ΠΏΡ€Π΅Π²ΠΎΠ΄, Π° ΠΏΠΎ-ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ с нСя ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° сС Π·Π°ΠΏΠΎΠ·Π½Π°Π΅Ρ‚Π΅ Ρ‚ΡƒΠΊ..

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, Π½ΠΎ вмСсто Ρ‚ΠΎΠ²Π° ΠΈΠΌΠ° ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½ΠΈ Π½Π° Oracle, ΠΈ Π½Π΅ Π²ΡŠΠ·Π½ΠΈΠΊΠ²Π°Ρ‚ Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ:

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/Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ ΠΈΠΌΠ°ΠΌ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²Π΅Π½ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ снипСти Π·Π° чСсто ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ заявки, ΠΈ остава само Π΄Π° впиша ΠΈΠΌΠ΅Π½Π°Ρ‚Π° Π½Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈΡ‚Π΅ Π² шаблона.

Π’ ΠΊΡ€Π°ΠΉΠ½Π° смСтка, Ρ‚Π°ΠΊΡŠΠ² Π½Π°Ρ‡ΠΈΠ½ Π½Π° навигация ΠΈ Ρ‚ΡŠΡ€ΡΠ΅Π½Π΅ Π½Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-гъвкав, спСстява ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅, позволява Π΄Π° сС ΠΏΠΎΠ»ΡƒΡ‡ΠΈ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°Π·ΠΈ информация ΠΈ Π² Ρ‚ΠΎΠ·ΠΈ Π²ΠΈΠ΄, Π² ΠΊΠΎΠΉΡ‚ΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° (ΠΊΠ°ΠΊΡ‚ΠΎ Π΅ описано Π² поста "Експорт Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ Π‘Π” Π² ΠΊΠ°ΠΊΡŠΠ²Ρ‚ΠΎ ΠΈ Π΄Π° Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚: ΠΊΠ°ΠΊΠ²ΠΎ умСят IDE Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° IntelliJ").

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΠΎΠ±Π΅ΠΊΡ‚ΠΈ

Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ Π½Π°ΠΌΠ΅Ρ€ΠΈΡ…ΠΌΠ΅ ΠΈ ΠΈΠ·ΡƒΡ‡ΠΈΡ…ΠΌΠ΅ Π½ΡƒΠΆΠ½ΠΈΡ‚Π΅ ΠΎΠ±Π΅ΠΊΡ‚ΠΈ, Π΅ Π²Ρ€Π΅ΠΌΠ΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ Π½Π΅Ρ‰ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ с тях. ЕстСствСно, ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ°, Π±Π΅Π· Π΄Π° отлСпямС ΠΏΡ€ΡŠΡΡ‚ΠΈΡ‚Π΅ ΠΎΡ‚ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π°Ρ‚Π°.

НС Π΅ Ρ‚Π°ΠΉΠ½Π°, Ρ‡Π΅ простото ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎ Π΅Π΄ΠΈΠ½ ΠΈ ΡΡŠΡ‰ Π½Π°Ρ‡ΠΈΠ½ ΠΏΠΎΡ‡Ρ‚ΠΈ във всички Π‘Π”:

drop table hr.persons

А ΡΡŠΠ·Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° Π²Π΅Ρ‡Π΅ Π΅ ΠΏΠΎ-интСрСсно. ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈ всяка Π‘Π£Π‘Π” (Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ NoSQL) ΠΏΠΎ Π΅Π΄ΠΈΠ½ ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ Π½Π°Ρ‡ΠΈΠ½ ΡƒΠΌΠ΅Π΅ "create table", Π° основната ΠΌΡƒ част Π΄ΠΎΡ€ΠΈ Ρ‰Π΅ сС Ρ€Π°Π·Π»ΠΈΡ‡Π°Π²Π° ΠΌΠ°Π»ΠΊΠΎ (ΠΈΠΌΠ΅, списък с ΠΊΠΎΠ»ΠΎΠ½ΠΈ, Ρ‚ΠΈΠΏΠΎΠ²Π΅ Π΄Π°Π½Π½ΠΈ), Π½ΠΎ останалитС Π΄Π΅Ρ‚Π°ΠΉΠ»ΠΈ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС Ρ€Π°Π·Π»ΠΈΡ‡Π°Π²Π°Ρ‚ драстично ΠΈ зависят ΠΎΡ‚ Π²ΡŠΡ‚Ρ€Π΅ΡˆΠ½Π°Ρ‚Π° структура ΠΈ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈΡ‚Π΅ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Π°Ρ‚Π° Π‘Π£Π‘Π”. ΠœΠΎΡΡ‚ любим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ β€” Π² докумСнтацията Π½Π° Oracle само "Π³ΠΎΠ»ΠΈ" БНЀ’и Π·Π° синтаксиса "create table" ΠΎΡ‚Π½Π΅ΠΌΠ°Ρ‚ 31 страница. Π”Ρ€ΡƒΠ³ΠΈ Π‘Π£Π‘Π” Ρ€Π°Π·ΠΏΠΎΠ»Π°Π³Π°Ρ‚ с ΠΏΠΎ-скромни Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ, Π½ΠΎ всяка ΠΎΡ‚ тях ΡΡŠΡ‰ΠΎ ΠΈΠΌΠ° мноТСство интСрСсни ΠΈ ΡƒΠ½ΠΈΠΊΠ°Π»Π½ΠΈ функционалности Π·Π° създаванС Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ (postgres, mysql, cockroach, cassandra). Малко вСроятно Π΅ някой Π³Ρ€Π°Ρ„ΠΈΡ‡Π΅Π½ "wizard" ΠΎΡ‚ ΠΏΠΎΡ€Π΅Π΄Π½Π°Ρ‚Π° IDE (особСно унивСрсалната) Π΄Π° ΠΌΠΎΠΆΠ΅ напълно Π΄Π° ΠΏΠΎΠΊΡ€ΠΈΠ΅ всичкитС Ρ‚Π΅Π·ΠΈ способности, Π° Π°ΠΊΠΎ ΠΈ успСС, Ρ‚ΠΎ Ρ‚ΠΎΠ²Π° Ρ‰Π΅ Π΅ Π·Ρ€Π΅Π»ΠΈΡ‰Π΅ Π½Π΅ Π·Π° слабонСрвни. Π’ ΡΡŠΡ‰ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅, ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ ΠΈ Π½Π°Π²Ρ€Π΅ΠΌΠ΅ написаният ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ create table Ρ‰Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π±Π΅Π· Ρ‚Ρ€ΡƒΠ΄Π° Π΄Π° сС Π²ΡŠΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ ΠΎΡ‚ всички тях, Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΈ Π΄ΠΎΡΡ‚ΡŠΠΏΠ° Π΄ΠΎ Π²Π°ΡˆΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ Π½Π°Π΄Π΅ΠΆΠ΄Π½ΠΈ, ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»Π½ΠΈ ΠΈ максимално ΡƒΠ΄ΠΎΠ±Π½ΠΈ.

Π‘ΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‚ ΠΈ спСцифични Ρ‚ΠΈΠΏΠΎΠ²Π΅ ΠΎΠ±Π΅ΠΊΡ‚ΠΈ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π‘Π£Π‘Π”, ΠΊΠΎΠΈΡ‚ΠΎ липсват Π² Π΄Ρ€ΡƒΠ³ΠΈ. МоТСм Π΄Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°ΠΌΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π΅ само с ΠΎΠ±Π΅ΠΊΡ‚ΠΈΡ‚Π΅ Π½Π° Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ, Π½ΠΎ ΠΈ със самата Π‘Π£Π‘Π”, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π΄Π° "ΡƒΠ±ΠΈΠ΅ΠΌ" процСс, Π΄Π° освободим ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° област ΠΎΡ‚ ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π°, Π΄Π° Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°ΠΌΠ΅ трасировка, Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ΠΌ Π² Ρ€Π΅ΠΆΠΈΠΌ "read only" ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈ.

А сСга ΠΌΠ°Π»ΠΊΠΎ Π΄Π° нарисувамС

Π•Π΄Π½Π° ΠΎΡ‚ Π½Π°ΠΉ-чСсто срСщанитС Π·Π°Π΄Π°Ρ‡ΠΈ Π΅ Π΄Π° сС построи Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠ° с ΠΎΠ±Π΅ΠΊΡ‚ΠΈΡ‚Π΅ Π½Π° Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ, Π·Π° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΎΠ±Π΅ΠΊΡ‚ΠΈΡ‚Π΅ ΠΈ Π²Ρ€ΡŠΠ·ΠΊΠΈΡ‚Π΅ ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρƒ ΠΈΠΌ Π² красив ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. Π’ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈ ΠΏΠΎΡ‡Ρ‚ΠΈ всяка Π³Ρ€Π°Ρ„ΠΈΡ‡Π½Π° IDE, ΠΎΡ‚Π΄Π΅Π»Π½ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΈ инструмСнти ΠΈ спСциализирани Π³Ρ€Π°Ρ„ΠΈΡ‡Π½ΠΈ инструмСнти ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€Π°Ρ‰ΠΈ прилоТСния. ΠšΠΎΠΈΡ‚ΠΎ Ρ‰Π΅ нарисуват Π½Π΅Ρ‰ΠΎ "ΠΊΠ°ΠΊΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚", Π° ΠΌΠ°Π»ΠΊΠΎ Π΄Π° повлияСтС Π½Π° Ρ‚ΠΎΠ·ΠΈ процСс ΠΌΠΎΠΆΠ΅Ρ‚Π΅ само с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° няколко ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€Π° Π² конфигурационния Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΊΠΈ Π² интСрфСйса.

Но Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Ρ€Π΅ΡˆΠ΅Π½ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-просто, ΠΏΠΎ-гъвкаво ΠΈ Π΅Π»Π΅Π³Π°Π½Ρ‚Π½ΠΎ, Ρ€Π°Π·Π±ΠΈΡ€Π° сС с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΊΠΎΠ΄. Π—Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΈ с всякаква слоТност ΠΈΠΌΠ°ΠΌΠ΅ няколко спСциализирани Π΅Π·ΠΈΠΊΠ° Π·Π° ΠΌΠ°Ρ€ΠΊΠΈΡ€Π°Π½Π΅ (DOT, GraphML ΠΈ Ρ‚.Π½.), Π° към тях - цял ΠΊΡƒΠΏ прилоТСния (GraphViz, PlantUML, Mermaid), ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Ρ‡Π΅Ρ‚Π°Ρ‚ Ρ‚Π°ΠΊΠΈΠ²Π° инструкции ΠΈ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚ Π² Π½Π°ΠΉ-Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈ. А информацията Π·Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈΡ‚Π΅ ΠΈ Π²Ρ€ΡŠΠ·ΠΊΠΈΡ‚Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ тях Π²Π΅Ρ‡Π΅ Π·Π½Π°Π΅ΠΌ ΠΊΠ°ΠΊ Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ.

НСка ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ малък ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊ Π±ΠΈ ΠΌΠΎΠ³Π»ΠΎ Π΄Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°, ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ PlantUML ΠΈ дСмонстрационна Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ Π·Π° PostgreSQL (вляво 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 шаблона Π·Π° PlantUML ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π½Π΅Ρ‰ΠΎ, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π° Π½Π° истинска ER Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠ°:

SQL заявката Π΅ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-слоТна

-- Π—Π°Π³Π»Π°Π²ΠΈΠ΅
select '@startuml
        !define Table(name,desc) class name as "desc" << (T,#FFAAAA) >&gt;
        !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" --&gt; "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 ΠΏΠΎΡ‡Ρ‚ΠΈ всяка информация Π·Π° производитСлността ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π° ΠΎΡ‚ систСмнитС прСдставлСния, Π·Π°ΠΏΠΎΡ‡Π²Π°ΠΉΠΊΠΈ ΠΎΡ‚ процСситС ΠΈ сСсиитС ΠΈ Π·Π°Π²ΡŠΡ€ΡˆΠ²Π°ΠΉΠΊΠΈ със ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅Ρ‚ΠΎ Π½Π° буфСрния кСш (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, DBA Π‘ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ²Π΅, Ρ€Π°Π·Π΄Π΅Π» "ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³"). Π’ PostgreSQL ΡΡŠΡ‰ΠΎ ΠΈΠΌΠ° мноТСство систСмни прСдставлСния Π·Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° Π‘Π”, Π² частност Ρ‚Π°ΠΊΠΈΠ²Π° Π½Π΅Π·Π°ΠΌΠ΅Π½ΠΈΠΌΠΈ Π² Π΅ΠΆΠ΅Π΄Π½Π΅Π²ΠΈΠ΅Ρ‚ΠΎ Π½Π° всСки DBA, ΠΊΠ°Ρ‚ΠΎ pg_stat_activity, pg_stat_database, pg_stat_bgwriter. Π—Π° MySQL Π΅ създадСна Π΄ΠΎΡ€ΠΈ ΠΎΡ‚Π΄Π΅Π»Π½Π° схСма performance_schema. А Π² Mongo Π²Π³Ρ€Π°Π΄Π΅Π½ ΠΏΡ€ΠΎΡ„Π°ΠΉΠ»Π΅Ρ€ Π°Π³Ρ€Π΅Π³ΠΈΡ€Π° Π΄Π°Π½Π½ΠΈ Π·Π° производитСлността Π² систСмната колСкция system.profile.

Π’Π°ΠΊΠ°, Π²ΡŠΠΎΡ€ΡŠΠΆΠ΅Π½ΠΈ с някакъв ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ сборник (Telegraf, Metricbeat, Collectd), ΠΊΠΎΠΉΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° изпълнява пСрсонализирани SQL заявки, Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π½Π° Ρ‚Π΅Π·ΠΈ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ (InfluxDB, Elasticsearch, Timescaledb) ΠΈ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ (Grafana, Kibana), ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ доста лСсна ΠΈ гъвкава систСма Π·Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³, която Ρ‰Π΅ бъдС тясно ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€Π°Π½Π° с Π΄Ρ€ΡƒΠ³ΠΈ общосистСмни ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ (ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΡ‚ прилоТСния, ΠΎΡ‚ ОБ ΠΈ Ρ‚.Π½.). ΠšΠ°ΠΊΡ‚ΠΎ Π΅ Π½Π°ΠΏΡ€Π°Π²Π΅Π½ΠΎ Π² pgwatch2, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° комбинация ΠΎΡ‚ InfluxDB + Grafana ΠΈ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ заявки към систСмнитС прСдставяния, към ΠΊΠΎΠΈΡ‚ΠΎ ΡΡŠΡ‰ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС добавят пСрсонализирани заявки.

ΠžΠ±Ρ‰ΠΎ

И Ρ‚ΠΎΠ²Π° Π΅ само ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»Π΅Π½ списък Π½Π° Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ с Π½Π°ΡˆΠ°Ρ‚Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ Ρ‡Ρ€Π΅Π· ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ SQL ΠΊΠΎΠ΄. Π‘ΠΈΠ³ΡƒΡ€Π΅Π½ съм, Ρ‡Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΠΌ ΠΎΡ‰Π΅ ΠΌΠ½ΠΎΠ³ΠΎ прилоТСния, ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Π² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡ‚Π΅. А Π·Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊ (ΠΈ Π½Π°ΠΉ-Π²Π΅Ρ‡Π΅ Π·Π°Ρ‰ΠΎ) Π΄Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ всичко Ρ‚ΠΎΠ²Π° ΠΈ Π΄Π° Π³ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΠΌ Π² своя CI/CD pipeline Ρ‰Π΅ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ слСдващия ΠΏΡŠΡ‚.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster