ื—ื•ื•ื™ื™ืช "ืžืกื“ ื ืชื•ื ื™ื ื›ืงื•ื“".

ื—ื•ื•ื™ื™ืช "ืžืกื“ ื ืชื•ื ื™ื ื›ืงื•ื“".

SQL, ืžื” ื™ื›ื•ืœ ืœื”ื™ื•ืช ื™ื•ืชืจ ืคืฉื•ื˜? ื›ืœ ืื—ื“ ืžืื™ืชื ื• ื™ื›ื•ืœ ืœื›ืชื•ื‘ ื‘ืงืฉื” ืคืฉื•ื˜ื” - ืื ื• ืžืงืœื™ื“ื™ื ื‘ื—ืจ, ืจืฉื•ื ืืช ื”ืขืžื•ื“ื•ืช ื”ื ื“ืจืฉื•ืช, ืœืื—ืจ ืžื›ืŸ ื”ื—ืœ ืž-, ืฉื ื”ื˜ื‘ืœื”, ื›ืžื” ืชื ืื™ื ื‘ ืื™ืคื” ื•ื–ื” ื”ื›ืœ - ื ืชื•ื ื™ื ืฉื™ืžื•ืฉื™ื™ื ื ืžืฆืื™ื ื‘ื›ื™ืก ืฉืœื ื•, ื•(ื›ืžืขื˜) ื‘ืœื™ ืงืฉืจ ืœืื™ื–ื” DBMS ื ืžืฆื ืžืชื—ืช ืœืžื›ืกื” ื”ืžื ื•ืข ื‘ืื•ืชื• ื–ืžืŸ (ืื• ืื•ืœื™ ืœื DBMS ื‘ื›ืœืœ). ื›ืชื•ืฆืื” ืžื›ืš, ืขื‘ื•ื“ื” ืขื ื›ืžืขื˜ ื›ืœ ืžืงื•ืจ ื ืชื•ื ื™ื (ื™ื—ืกื™ ื•ืœื ื›ืš) ื™ื›ื•ืœื” ืœื”ื™ื—ืฉื‘ ืžื ืงื•ื“ืช ืžื‘ื˜ ืฉืœ ืงื•ื“ ืจื’ื™ืœ (ืขืœ ื›ืœ ื”ืžืฉืชืžืข ืžื›ืš - ื‘ืงืจืช ื’ืจืกืื•ืช, ืกืงื™ืจืช ืงื•ื“, ื ื™ืชื•ื— ืกื˜ื˜ื™, ื‘ื“ื™ืงื•ืช ืื•ื˜ื•ืžื˜ื™ื•ืช, ื•ื–ื” ื”ื›ืœ). ื•ื–ื” ื—ืœ ืœื ืจืง ืขืœ ื”ื ืชื•ื ื™ื ืขืฆืžื, ืกื›ืžื•ืช ื•ื”ื’ื™ืจื•ืช, ืืœื ื‘ืื•ืคืŸ ื›ืœืœื™ ืขืœ ื›ืœ ื—ื™ื™ ื”ืื—ืกื•ืŸ. ื‘ืžืืžืจ ื–ื” ื ื“ื‘ืจ ืขืœ ืžืฉื™ืžื•ืช ื™ื•ืžื™ื•ืžื™ื•ืช ื•ื‘ืขื™ื•ืช ื‘ืขื‘ื•ื“ื” ืขื ืžืกื“ื™ ื ืชื•ื ื™ื ืฉื•ื ื™ื ืชื—ืช ื”ืขื“ืฉื” ืฉืœ "ื‘ืกื™ืก ื ืชื•ื ื™ื ื›ืงื•ื“".

ื•ื‘ื•ืื• ื ืชื—ื™ืœ ืžืžืฉ ืž ORM. ื”ืงืจื‘ื•ืช ื”ืจืืฉื•ื ื™ื ืžืกื•ื’ "SQL vs ORM" ื”ื•ื‘ื—ื™ื ื• ื‘ื—ื–ืจื” ืคืจื”-ืคื˜ืจื™ืŸ ืจื•ืก'.

ืžื™ืคื•ื™ ื™ื—ืกื™ ืื•ื‘ื™ื™ืงื˜

ืชื•ืžื›ื™ ORM ืžืขืจื™ื›ื™ื ื‘ืื•ืคืŸ ืžืกื•ืจืชื™ ืžื”ื™ืจื•ืช ื•ืงืœื•ืช ืคื™ืชื•ื—, ืขืฆืžืื•ืช ืž-DBMS ื•ืงื•ื“ ื ืงื™. ืขื‘ื•ืจ ืจื‘ื™ื ืžืื™ืชื ื•, ื”ืงื•ื“ ืœืขื‘ื•ื“ื” ืขื ืžืกื“ ื”ื ืชื•ื ื™ื (ื•ืœืจื•ื‘ ื’ื ืžืกื“ ื”ื ืชื•ื ื™ื ืขืฆืžื•)

ื‘ื“ืจืš ื›ืœืœ ื–ื” ื ืจืื” ืžืฉื”ื• ื›ื–ื”...

@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".

ื‘ืฆื“ ื”ืฉื ื™ ืฉืœ ื”ืžืชืจืก, ื—ืกื™ื“ื™ SQL ื˜ื”ื•ืจ "ืขื‘ื•ื“ืช ื™ื“" ืžืฆื™ื™ื ื™ื ืืช ื”ื™ื›ื•ืœืช ืœืกื—ื•ื˜ ืืช ื›ืœ ื”ืžื™ืฅ ืžื”-DBMS ืฉืœื”ื ืœืœื ืฉื›ื‘ื•ืช ื•ื”ืคืฉื˜ื•ืช ื ื•ืกืคื•ืช. ื›ืชื•ืฆืื” ืžื›ืš, ืžื•ืคื™ืขื™ื ืคืจื•ื™ืงื˜ื™ื "ืžืžื•ืงื“ื™ ื ืชื•ื ื™ื", ืฉื‘ื”ื ืžืขื•ืจื‘ื™ื ื‘ืžืกื“ ื”ื ืชื•ื ื™ื ืื ืฉื™ื ืฉืขื‘ืจื• ื”ื›ืฉืจื” ืžื™ื•ื—ื“ืช (ื”ื ื’ื "ื‘ืกื™ืกื™ืกื˜ื™ื", ื”ื ื’ื "ื‘ืกื™ืกื™ืกื˜ื™ื", ื”ื ื’ื "ื‘ืกื™ืกื ื™ื" ื•ื›ื•'), ื•ื”ืžืคืชื—ื™ื ืฆืจื™ืš ืจืง "ืœืžืฉื•ืš" ืืช ื”ืชืฆื•ื’ื•ืช ื•ื”ื ื”ืœื™ื ื”ืžืื•ื—ืกื ื™ื ื”ืžื•ื›ื ื™ื, ืžื‘ืœื™ ืœื”ื™ื›ื ืก ืœืคืจื˜ื™ื.

ืžื” ืื ื”ื™ื” ืœื ื• ื”ื˜ื•ื‘ ืžืฉื ื™ ื”ืขื•ืœืžื•ืช? ืื™ืš ื–ื” ื ืขืฉื” ื‘ื›ืœื™ ื ืคืœื ืขื ืฉื ืฉืžืืฉืจ ื—ื™ื™ื Yesql. ืื ื™ ืืชืŸ ื›ืžื” ืฉื•ืจื•ืช ืžื”ืžื•ืฉื’ ื”ื›ืœืœื™ ื‘ืชืจื’ื•ื ื”ื—ื•ืคืฉื™ ืฉืœื™, ื•ืชื•ื›ืœื• ืœื”ื›ื™ืจ ืื•ืชื• ื‘ื™ืชืจ ืคื™ืจื•ื˜ ื›ืืŸ.

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 ื‘ืคื ื™ ืขืฆืžื•", ืืชื” ืžืงื‘ืœ:

  • ืื™ืŸ ื”ืคืชืขื•ืช ืชื—ื‘ื™ืจื™ื•ืช. ืžืกื“ ื”ื ืชื•ื ื™ื ืฉืœืš (ื›ืžื• ื›ืœ ื‘ืกื™ืก ืื—ืจ) ืื™ื ื• ืชื•ืื ื‘-100% ืœืชืงืŸ SQL - ืื‘ืœ ื–ื” ืœื ืžืฉื ื” ืขื‘ื•ืจ Yesql. ืœืขื•ืœื ืœื ืชื‘ื–ื‘ื– ื–ืžืŸ ื‘ื—ื™ืคื•ืฉ ืื—ืจ ืคื•ื ืงืฆื™ื•ืช ืขื ืชื—ื‘ื™ืจ ืžืงื‘ื™ืœ ืœ-SQL. ืœืขื•ืœื ืœื ืชืฆื˜ืจืš ืœื—ื–ื•ืจ ืœืคื•ื ืงืฆื™ื” (raw-sql "some('funky'::SYNTAX)")).
  • ื”ืชืžื™ื›ื” ื”ื˜ื•ื‘ื” ื‘ื™ื•ืชืจ ื‘ืขื•ืจืš. ืœืขื•ืจืš ืฉืœืš ื›ื‘ืจ ื™ืฉ ืชืžื™ื›ื” ืžืฆื•ื™ื ืช ื‘-SQL. ืขืœ ื™ื“ื™ ืฉืžื™ืจืช SQL ื‘ืชื•ืจ SQL ืืชื” ื™ื›ื•ืœ ืคืฉื•ื˜ ืœื”ืฉืชืžืฉ ื‘ื•.
  • ืชืื™ืžื•ืช ืœืฆื•ื•ืช. ื”-DBAs ืฉืœืš ื™ื›ื•ืœื™ื ืœืงืจื•ื ื•ืœื›ืชื•ื‘ ืืช ื”-SQL ืฉืืชื” ืžืฉืชืžืฉ ื‘ืคืจื•ื™ืงื˜ Clojure ืฉืœืš.
  • ื›ื•ื•ื ื•ืŸ ื‘ื™ืฆื•ืขื™ื ืงืœ ื™ื•ืชืจ. ืฆืจื™ื›ื™ื ืœื‘ื ื•ืช ืชื•ื›ื ื™ืช ืœืฉืื™ืœืชื” ื‘ืขื™ื™ืชื™ืช? ื–ื• ืœื ื‘ืขื™ื” ื›ืืฉืจ ื”ืฉืื™ืœืชื” ืฉืœืš ื”ื™ื SQL ืจื’ื™ืœื”.
  • ืฉื™ืžื•ืฉ ื—ื•ื–ืจ ื‘ืฉืื™ืœืชื•ืช. ื’ืจื•ืจ ื•ืฉื—ืจืจ ืืช ืื•ืชื ืงื‘ืฆื™ SQL ืœืคืจื•ื™ืงื˜ื™ื ืื—ืจื™ื ื›ื™ ื–ื” ืคืฉื•ื˜ SQL ื™ืฉืŸ - ืคืฉื•ื˜ ืฉืชืฃ ืื•ืชื•.

ืœื“ืขืชื™ ื”ืจืขื™ื•ืŸ ืžืื•ื“ ืžื’ื ื™ื‘ ื•ื™ื—ื“ ืขื ื–ืืช ืคืฉื•ื˜ ืžืื•ื“, ืฉื‘ื–ื›ื•ืชื• ื”ืคืจื•ื™ืงื˜ ืฆื‘ืจ ืจื‘ื™ื ืขื•ืงื‘ื™ื ื‘ืžื’ื•ื•ืŸ ืฉืคื•ืช. ื•ื‘ื”ืžืฉืš ื ื ืกื” ืœื™ื™ืฉื ืคื™ืœื•ืกื•ืคื™ื” ื“ื•ืžื” ืฉืœ ื”ืคืจื“ืช ืงื•ื“ SQL ืžื›ืœ ื“ื‘ืจ ืื—ืจ ื”ืจื‘ื” ืžืขื‘ืจ ืœ-ORM.

ืžื ื”ืœื™ IDE ื•-DB

ื ืชื—ื™ืœ ื‘ืžืฉื™ืžื” ื™ื•ืžื™ื•ืžื™ืช ืคืฉื•ื˜ื”. ืœืขืชื™ื ืงืจื•ื‘ื•ืช ืขืœื™ื ื• ืœื—ืคืฉ ืื•ื‘ื™ื™ืงื˜ื™ื ืžืกื•ื™ืžื™ื ื‘ืžืกื“ ื”ื ืชื•ื ื™ื, ืœืžืฉืœ, ืœืžืฆื•ื ื˜ื‘ืœื” ื‘ืกื›ืžื” ื•ืœืœืžื•ื“ ืืช ื”ืžื‘ื ื” ืฉืœื” (ืื™ืœื• ืขืžื•ื“ื•ืช, ืžืคืชื—ื•ืช, ืื™ื ื“ืงืกื™ื, ืื™ืœื•ืฆื™ื ื•ื›ื•' ืžืฉืžืฉื™ื). ื•ืžื›ืœ IDE ื’ืจืคื™ ืื• ืงืฆืช DB-manager, ืงื•ื“ื ื›ืœ, ืื ื—ื ื• ืžืฆืคื™ื ื‘ื“ื™ื•ืง ืœื™ื›ื•ืœื•ืช ื”ืืœื”. ื›ื“ื™ ืฉื–ื” ื™ื”ื™ื” ืžื”ื™ืจ ื•ืœื ืชืฆื˜ืจื›ื• ืœื—ื›ื•ืช ื—ืฆื™ ืฉืขื” ืขื“ ืฉื™ืฆื•ื™ืจ ื—ืœื•ืŸ ืขื ื”ืžื™ื“ืข ื”ื“ืจื•ืฉ (ื‘ืžื™ื•ื—ื“ ื‘ื—ื™ื‘ื•ืจ ืื™ื˜ื™ ืœืžืื’ืจ ืžื™ื“ืข ืžืจื•ื—ืง), ื•ื™ื—ื“ ืขื ื–ืืช, ื”ืžื™ื“ืข ื”ืžืชืงื‘ืœ ื˜ืจื™ ื•ืจืœื•ื•ื ื˜ื™, ื•ืœื ื–ื‘ืœ ืฉืžื•ืจ. ื™ืชืจื” ืžื›ืš, ื›ื›ืœ ืฉื‘ืกื™ืก ื”ื ืชื•ื ื™ื ืžื•ืจื›ื‘ ื•ื’ื“ื•ืœ ื™ื•ืชืจ ื•ื›ื›ืœ ืฉืžืกืคืจื ื’ื“ื•ืœ ื™ื•ืชืจ, ื›ืš ืงืฉื” ื™ื•ืชืจ ืœืขืฉื•ืช ื–ืืช.

ืื‘ืœ ื‘ื“ืจืš ื›ืœืœ ืื ื™ ื–ื•ืจืง ืืช ื”ืขื›ื‘ืจ ื•ืคืฉื•ื˜ ื›ื•ืชื‘ ืงื•ื“. ื ื ื™ื— ืฉืืชื” ืฆืจื™ืš ืœื‘ืจืจ ืื™ืœื• ื˜ื‘ืœืื•ืช (ื•ืขื ืื™ืœื• ืžืืคื™ื™ื ื™ื) ื›ืœื•ืœื™ื ื‘ืกื›ื™ืžืช "HR". ื‘ืจื•ื‘ ื”-DBMSs, ื ื™ืชืŸ ืœื”ืฉื™ื’ ืืช ื”ืชื•ืฆืื” ื”ืจืฆื•ื™ื” ื‘ืืžืฆืขื•ืช ืฉืื™ืœืชื” ืคืฉื•ื˜ื” ื–ื• ืž-information_schema:

select table_name
     , ...
  from information_schema.tables
 where schema = 'HR'

ืžืžืกื“ ื ืชื•ื ื™ื ืœืžืกื“ ื ืชื•ื ื™ื, ื”ืชื•ื›ืŸ ืฉืœ ื˜ื‘ืœืื•ืช ื”ืชื™ื™ื—ืกื•ืช ื›ืืœื” ืžืฉืชื ื” ื‘ื”ืชืื ืœื™ื›ื•ืœื•ืช ืฉืœ ื›ืœ DBMS. ื•ืœื“ื•ื’ืžื”, ืขื‘ื•ืจ MySQL, ืžืื•ืชื• ืกืคืจ ืขื™ื•ืŸ ืืชื” ื™ื›ื•ืœ ืœืงื‘ืœ ืคืจืžื˜ืจื™ื ืฉืœ ื˜ื‘ืœื” ืกืคืฆื™ืคื™ื™ื ืœ-DBMS ื”ื–ื”:

select table_name
     , storage_engine -- ะ˜ัะฟะพะปัŒะทัƒะตะผั‹ะน "ะดะฒะธะถะพะบ" ("MyISAM", "InnoDB" etc)
     , row_format     -- ะคะพั€ะผะฐั‚ ัั‚ั€ะพะบะธ ("Fixed", "Dynamic" etc)
     , ...
  from information_schema.tables
 where schema = 'HR'

ืื•ืจืงืœ ืœื ืžื›ื™ืจื” info_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'

ื ื™ืชืŸ ืœืขืฉื•ืช ืžืฉื”ื• ื“ื•ืžื” ื‘ืงืกื ื“ืจื” (ืฉื™ืฉ ืœื” ืžืฉืคื—ื•ืช ืขืžื•ื“ื•ืช ื‘ืžืงื•ื ื˜ื‘ืœืื•ืช ื•ืžืจื•ื•ื—ื™ ืžืคืชื— ื‘ืžืงื•ื ืกื›ืžื•ืช):

select columnfamily_name
     , compaction_strategy_class  -- ะกั‚ั€ะฐั‚ะตะณะธั ัะฑะพั€ะบะธ ะผัƒัะพั€ะฐ
     , gc_grace_seconds           -- ะ’ั€ะตะผั ะถะธะทะฝะธ ะผัƒัะพั€ะฐ
     , ...
  from system.schema_columnfamilies
 where keyspace_name = 'HR'

ืขื‘ื•ืจ ืจื•ื‘ ืžืกื“ื™ ื”ื ืชื•ื ื™ื ื”ืื—ืจื™ื, ืืชื” ื™ื›ื•ืœ ื’ื ืœื”ืžืฆื™ื ืฉืื™ืœืชื•ืช ื“ื•ืžื•ืช (ืืคื™ืœื• ืœืžื•ื ื’ื• ื™ืฉ ืื™ืกื•ืฃ ืžืขืจื›ืช ืžื™ื•ื—ื“, ื”ืžื›ื™ืœ ืžื™ื“ืข ืขืœ ื›ืœ ื”ืื•ืกืคื™ื ื‘ืžืขืจื›ืช).

ื›ืžื•ื‘ืŸ ืฉื‘ื“ืจืš ื–ื• ื ื™ืชืŸ ืœืงื‘ืœ ืžื™ื“ืข ืœื ืจืง ืขืœ ื˜ื‘ืœืื•ืช, ืืœื ืขืœ ื›ืœ ืื•ื‘ื™ื™ืงื˜ ื‘ืื•ืคืŸ ื›ืœืœื™. ืžืขืช ืœืขืช, ืื ืฉื™ื ืื“ื™ื‘ื™ื ื—ื•ืœืงื™ื ืงื•ื“ ื›ื–ื” ืขื‘ื•ืจ ืžืกื“ื™ ื ืชื•ื ื™ื ืฉื•ื ื™ื, ื›ืžื•, ืœืžืฉืœ, ื‘ืกื“ืจืช ืžืืžืจื™ ื”ื‘ืจื” "ืคื•ื ืงืฆื™ื•ืช ืœืชื™ืขื•ื“ ืžืื’ืจื™ PostgreSQL" (ืื™ื™ื‘, ื‘ืŸ, ื—ื“ืจ ื›ื•ืฉืจ). ื›ืžื•ื‘ืŸ, ืœืฉืžื•ืจ ืืช ื›ืœ ื”ืจ ื”ืฉืื™ืœืชื•ืช ื”ื–ื” ื‘ืจืืฉ ืฉืœื™ ื•ืœื”ืงืœื™ื“ ืื•ืชืŸ ื›ืœ ื”ื–ืžืŸ ื–ื” ืชืขื ื•ื’ ื›ื–ื”, ืื– ื‘-IDE/ืขื•ืจืš ื”ืื”ื•ื‘ ืขืœื™ื™ ื™ืฉ ืœื™ ืงื‘ื•ืฆื” ืžื•ื›ื ื” ืžืจืืฉ ืฉืœ ืงื˜ืขื™ื ืœืฉืื™ืœืชื•ืช ื‘ืฉื™ืžื•ืฉ ืชื›ื•ืฃ, ื•ื›ืœ ืžื” ืฉื ืฉืืจ ื–ื” ืœื”ืงืœื™ื“ ืืช ืฉืžื•ืช ืื•ื‘ื™ื™ืงื˜ื™ื ืœืชื•ืš ื”ืชื‘ื ื™ืช.

ื›ืชื•ืฆืื” ืžื›ืš, ืฉื™ื˜ื” ื–ื• ืฉืœ ื ื™ื•ื•ื˜ ื•ื—ื™ืคื•ืฉ ืื•ื‘ื™ื™ืงื˜ื™ื ื’ืžื™ืฉื” ื”ืจื‘ื” ื™ื•ืชืจ, ื—ื•ืกื›ืช ื–ืžืŸ ืจื‘ ื•ืžืืคืฉืจืช ืœืงื‘ืœ ื‘ื“ื™ื•ืง ืืช ื”ืžื™ื“ืข ื‘ืฆื•ืจื” ืฉื‘ื” ื”ื•ื ื ื—ื•ืฅ ื›ืขืช (ื›ืคื™ ืฉืžืชื•ืืจ ืœืžืฉืœ ื‘ืคื•ืกื˜ "ื™ื™ืฆื•ื ื ืชื•ื ื™ื ืžืžืกื“ ื ืชื•ื ื™ื ื‘ื›ืœ ืคื•ืจืžื˜: ืžื” IDEs ื™ื›ื•ืœื™ื ืœืขืฉื•ืช ื‘ืคืœื˜ืคื•ืจืžืช IntelliJ").

ืคืขื•ืœื•ืช ืขื ื—ืคืฆื™ื

ืื—ืจื™ ืฉืžืฆืื ื• ื•ืœืžื“ื ื• ืืช ื”ื—ืคืฆื™ื ื”ื“ืจื•ืฉื™ื, ื”ื’ื™ืข ื”ื–ืžืŸ ืœืขืฉื•ืช ืื™ืชื ืžืฉื”ื• ืฉื™ืžื•ืฉื™. ื‘ืื•ืคืŸ ื˜ื‘ืขื™, ื’ื ื‘ืœื™ ืœื”ื•ืจื™ื“ ืืช ื”ืืฆื‘ืขื•ืช ืžื”ืžืงืœื“ืช.

ื–ื” ืœื ืกื•ื“ ืฉืคืฉื•ื˜ ืžื—ื™ืงืช ื˜ื‘ืœื” ืชื™ืจืื” ืื•ืชื• ื”ื“ื‘ืจ ื›ืžืขื˜ ื‘ื›ืœ ืžืกื“ื™ ื”ื ืชื•ื ื™ื:

drop table hr.persons

ืื‘ืœ ืขื ื™ืฆื™ืจืช ื”ืฉื•ืœื—ืŸ ื–ื” ื”ื•ืคืš ืœืžืขื ื™ื™ืŸ ื™ื•ืชืจ. ื›ืžืขื˜ ื›ืœ DBMS (ื›ื•ืœืœ NoSQL ืจื‘ื™ื) ื™ื›ื•ืœ "ืœื™ืฆื•ืจ ื˜ื‘ืœื”" ื‘ืฆื•ืจื” ื›ื–ื• ืื• ืื—ืจืช, ื•ื”ื—ืœืง ื”ืขื™ืงืจื™ ืฉืœื” ืืคื™ืœื• ื™ื”ื™ื” ืฉื•ื ื” ืžืขื˜ (ืฉื, ืจืฉื™ืžืช ืขืžื•ื“ื•ืช, ืกื•ื’ื™ ื ืชื•ื ื™ื), ืื‘ืœ ืคืจื˜ื™ื ืื—ืจื™ื ื™ื›ื•ืœื™ื ืœื”ื™ื•ืช ืฉื•ื ื™ื ื‘ืื•ืคืŸ ื“ืจืžื˜ื™ ื•ืชืœื•ื™ื™ื ื‘- ื”ืชืงืŸ ืคื ื™ืžื™ ื•ื™ื›ื•ืœื•ืช ืฉืœ DBMS ืกืคืฆื™ืคื™. ื”ื“ื•ื’ืžื” ื”ืื”ื•ื‘ื” ืขืœื™ ื”ื™ื ืฉื‘ืชื™ืขื•ื“ ืฉืœ ืื•ืจืงืœ ื™ืฉ ืจืง BNFs "ืขื™ืจื•ืžื™ื" ืขื‘ื•ืจ ืชื—ื‘ื™ืจ "ืฆื•ืจ ื˜ื‘ืœื”" ืชื•ืคืกื™ื 31 ืขืžื•ื“ื™ื. ืœืžืขืจื›ื•ืช DBMS ืื—ืจื•ืช ื™ืฉ ื™ื›ื•ืœื•ืช ืฆื ื•ืขื•ืช ื™ื•ืชืจ, ืื‘ืœ ืœื›ืœ ืื—ืช ืžื”ืŸ ื™ืฉ ื’ื ื”ืจื‘ื” ืชื›ื•ื ื•ืช ืžืขื ื™ื™ื ื•ืช ื•ื™ื™ื—ื•ื“ื™ื•ืช ืœื™ืฆื™ืจืช ื˜ื‘ืœืื•ืช (postgres, MySQL, ืžืงืง, ืงืกื ื“ืจื”). ืื™ืŸ ื–ื” ืกื‘ื™ืจ ืฉื›ืœ "ืืฉืฃ" ื’ืจืคื™ ืž-IDE ืื—ืจ (ื‘ืžื™ื•ื—ื“ ืื•ื ื™ื‘ืจืกืœื™) ื™ื•ื›ืœ ืœื›ืกื•ืช ื‘ืžืœื•ืื• ืืช ื›ืœ ื”ื™ื›ื•ืœื•ืช ื”ืœืœื•, ื•ื’ื ืื ื”ื•ื ื™ื›ื•ืœ, ื–ื” ืœื ื™ื”ื™ื” ืžื—ื–ื” ืœื‘ืขืœื™ ืœื‘ ื—ืœืฉ. ื™ื—ื“ ืขื ื–ืืช, ื”ืฆื”ืจื” ื›ืชื•ื‘ื” ื ื›ื•ืŸ ื•ื‘ื–ืžืŸ ืœื™ืฆื•ืจ ื˜ื‘ืœื” - - ื™ืืคืฉืจ ืœืš ืœื”ืฉืชืžืฉ ื‘ื›ื•ืœื ื‘ืงืœื•ืช, ืœื”ืคื•ืš ืืช ื”ืื—ืกื•ืŸ ื•ื”ื’ื™ืฉื” ืœื ืชื•ื ื™ื ืฉืœืš ืœืืžื™ื ื™ื, ืื•ืคื˜ื™ืžืœื™ื™ื ื•ื ื•ื—ื™ื ื›ื›ืœ ื”ืืคืฉืจ.

ื›ืžื• ื›ืŸ, ืœ-DBMS ืจื‘ื™ื ื™ืฉ ืกื•ื’ื™ื ืกืคืฆื™ืคื™ื™ื ืžืฉืœื”ื ืฉืœ ืื•ื‘ื™ื™ืงื˜ื™ื ืฉืื™ื ื ื–ืžื™ื ื™ื ื‘-DBMS ืื—ืจื™ื. ื™ืชืจื” ืžื›ืš, ืื ื• ื™ื›ื•ืœื™ื ืœื‘ืฆืข ืคืขื•ืœื•ืช ืœื ืจืง ืขืœ ืื•ื‘ื™ื™ืงื˜ื™ ืžืกื“ ื ืชื•ื ื™ื, ืืœื ื’ื ืขืœ ื”-DBMS ืขืฆืžื•, ืœืžืฉืœ, "ืœื”ืจื•ื’" ืชื”ืœื™ืš, ืœืคื ื•ืช ืฉื˜ื— ื–ื™ื›ืจื•ืŸ ื›ืœืฉื”ื•, โ€‹โ€‹ืœืืคืฉืจ ืžืขืงื‘, ืœืขื‘ื•ืจ ืœืžืฆื‘ "ืงืจื™ืื” ื‘ืœื‘ื“" ื•ืขื•ื“ ื•ืขื•ื“.

ืขื›ืฉื™ื• ื‘ื•ืื• ื ืฆื™ื™ืจ ืงืฆืช

ืื—ืช ื”ืžืฉื™ืžื•ืช ื”ื ืคื•ืฆื•ืช ื‘ื™ื•ืชืจ ื”ื™ื ืœื‘ื ื•ืช ืชืจืฉื™ื ืขื ืื•ื‘ื™ื™ืงื˜ื™ ืžืกื“ ื ืชื•ื ื™ื ื•ืœืจืื•ืช ืืช ื”ืื•ื‘ื™ื™ืงื˜ื™ื ื•ื”ืงืฉืจื™ื ื‘ื™ื ื™ื”ื ื‘ืชืžื•ื ื” ื™ืคื”. ื›ืžืขื˜ ื›ืœ 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) >>
        !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, ืขืœื™ื”ื ื”ื“ื’ื™ืฉ ื‘ืงืคื™ื“ื” ืžืงื•ืžื•ืช ืงืจื™ื˜ื™ื™ื ืขื ืกืžืŸ ืื“ื•ื ืœ"ืžื•ื‘ื ื•ืช" ( ื–ื”, ื‘ืœืฉื•ืŸ ื”ืžืขื˜ื”, ืœื ืขื–ืจ ื”ืจื‘ื”). ื•ืขืœ ืกืžืš "ื›ืจื˜ื™ืก ื”ืฆื™ืœื•ื" ื”ื–ื” ื”ื™ื™ืชื™ ืฆืจื™ืš ืœื˜ืคืœ. ื™ื—ื“ ืขื ื–ืืช, ืœืืฃ ืื—ื“ ืœื ื”ื™ื™ืชื” ื’ื™ืฉื” ืœืžื ื”ืœ ื”ืืจื’ื•ื ื™ ื”ื™ืงืจ (ื‘ืฉื ื™ ืžื•ื‘ื ื™ื ืฉืœ ื”ืžื™ืœื”), ื›ื™ ื”ืžืขืจื›ืช ืžื•ืจื›ื‘ืช ื•ื™ืงืจื”, ืคืชืื•ื "ื”ืžืคืชื—ื™ื ื ืชืงืœื™ื ื‘ืžืฉื”ื• ื•ืฉื•ื‘ืจื™ื ื”ื›ืœ". ืœื›ืŸ, ื”ืžืคืชื—ื™ื ืžืฆืื• ื‘ืื•ืคืŸ "ืืžืคื™ืจื™" ืืช ื”ืžื™ืงื•ื ื•ื”ื’ื•ืจื ืœื‘ืœืžื™ื ื•ืฉื—ืจืจื• ืชื™ืงื•ืŸ. ืื ื”ืžื›ืชื‘ ื”ืžืื™ื™ื ืžื”-DBA ืœื ื™ื’ื™ืข ืฉื•ื‘ ื‘ื–ืžืŸ ื”ืงืจื•ื‘, ืื– ื›ื•ืœื ื”ื™ื• ื ื•ืฉืžื™ื ืœืจื•ื•ื—ื” ื•ื—ื•ื–ืจื™ื ืœืžืฉื™ืžื•ืช ื”ื ื•ื›ื—ื™ื•ืช ืฉืœื”ื (ืขื“ ื”ืžื›ืชื‘ ื”ื—ื“ืฉ).

ืื‘ืœ ืชื”ืœื™ืš ื”ื ื™ื˜ื•ืจ ื™ื›ื•ืœ ืœื”ื™ืจืื•ืช ืžื”ื ื” ื•ื™ื“ื™ื“ื•ืชื™ ื™ื•ืชืจ, ื•ื”ื›ื™ ื—ืฉื•ื‘, ื ื’ื™ืฉ ื•ืฉืงื•ืฃ ืœื›ื•ืœื. ืœืคื—ื•ืช ื”ื—ืœืง ื”ื‘ืกื™ืกื™ ืฉืœื•, ื›ืชื•ืกืคืช ืœืžืขืจื›ื•ืช ื”ื ื™ื˜ื•ืจ ื”ืจืืฉื™ื•ืช (ืฉื”ืŸ ื‘ื”ื—ืœื˜ ืฉื™ืžื•ืฉื™ื•ืช ื•ื‘ืžืงืจื™ื ืจื‘ื™ื ืฉืื™ืŸ ืœื”ื ืชื—ืœื™ืฃ). ื›ืœ DBMS ื”ื•ื ื‘ื—ื™ื ื ื•ืœืœื ืชืฉืœื•ื ืœื—ืœื•ื˜ื™ืŸ ื›ื“ื™ ืœืฉืชืฃ ืžื™ื“ืข ืขืœ ืžืฆื‘ื• ื•ื‘ื™ืฆื•ืขื™ื• ื”ื ื•ื›ื—ื™ื™ื. ื‘ืื•ืชื• Oracle DB "ืขืงื•ื‘ ืžื“ื", ื ื™ืชืŸ ืœืงื‘ืœ ื›ืžืขื˜ ื›ืœ ืžื™ื“ืข ืขืœ ื‘ื™ืฆื•ืขื™ื ืžืชืฆื•ื’ื•ืช ืžืขืจื›ืช, ื”ื—ืœ ืžืชื”ืœื™ื›ื™ื ื•ื”ืคืขืœื•ืช ื•ืขื“ ืœืžืฆื‘ ืฉืœ ืžื˜ืžื•ืŸ ื”ืžืื’ืจ (ืœื“ื•ื’ืžื”, ืกืงืจื™ืคื˜ื™ื ืฉืœ DBA, ืกืขื™ืฃ "ื ื™ื˜ื•ืจ"). ืœ-Postgresql ื™ืฉ ื’ื ื—ื‘ื•ืจื” ืฉืœืžื” ืฉืœ ืชืฆื•ื’ื•ืช ืžืขืจื›ืช ืขื‘ื•ืจ ื ื™ื˜ื•ืจ ืžืกื“ื™ ื ืชื•ื ื™ื, ื‘ืžื™ื•ื—ื“ ืืœื” ื”ื›ืจื—ื™ื™ื ื‘ื—ื™ื™ ื”ื™ื•ืžื™ื•ื ืฉืœ ื›ืœ DBA, ื›ื’ื•ืŸ pg_stat_activity, pg_stat_database, pg_stat_bgwriter. ืœ-MySQL ื™ืฉ ืืคื™ืœื• ืกื›ืžื” ื ืคืจื“ืช ืœื›ืš. performance_schema. A In Mongo ืžื•ื‘ื ื” ืžืืคื™ื™ืŸ ืื•ืกืฃ ื ืชื•ื ื™ ื‘ื™ืฆื•ืขื™ื ืœืื•ืกืฃ ืžืขืจื›ืช system.profile.

ื›ืš, ื—ืžื•ืฉ ื‘ืกื•ื’ ืฉืœ ืืกืคืŸ ืžื“ื“ื™ื (Telegraf, Metricbeat, Collectd) ืฉื™ื›ื•ืœ ืœื‘ืฆืข ืฉืื™ืœืชื•ืช sql ืžื•ืชืืžื•ืช ืื™ืฉื™ืช, ืื—ืกื•ืŸ ืฉืœ ืžื“ื“ื™ื ืืœื” (InfluxDB, Elasticsearch, Timescaledb) ื•-Visualizer (Grafana, Kibana), ืืชื” ื™ื›ื•ืœ ืœืงื‘ืœ ื’ื™ืฉื” ืงืœื” ืœืžื“ื™. ื•ืžืขืจื›ืช ื ื™ื˜ื•ืจ ื’ืžื™ืฉื” ืฉืชืฉื•ืœื‘ ื‘ืื•ืคืŸ ื”ื“ื•ืง ืขื ืžื“ื“ื™ื ื ื•ืกืคื™ื ื›ืœืœ-ืžืขืจื›ืชื™ื™ื (ืฉืžืชืงื‘ืœื™ื, ืœืžืฉืœ, ืžืฉืจืช ื”ืืคืœื™ืงืฆื™ื•ืช, ืžืžืขืจื›ืช ื”ื”ืคืขืœื” ื•ื›ื•'). ื›ืžื•, ืœืžืฉืœ, ื–ื” ื ืขืฉื” ื‘-pgwatch2, ืฉืžืฉืชืžืฉ ื‘ืฉื™ืœื•ื‘ InfluxDB + Grafana ื•ื‘ืกื˜ ืฉืœ ืฉืื™ืœืชื•ืช ืœืชืฆื•ื’ื•ืช ืžืขืจื›ืช, ืฉืืœื™ื”ืŸ ื ื™ืชืŸ ืœื’ืฉืช ื’ื ื”ื•ืกืฃ ืฉืื™ืœืชื•ืช ืžื•ืชืืžื•ืช ืื™ืฉื™ืช.

ื‘ืกืš ื”ื›ืœ

ื•ื–ื• ืจืง ืจืฉื™ืžื” ืžืฉื•ืขืจืช ืฉืœ ืžื” ืฉื ื™ืชืŸ ืœืขืฉื•ืช ืขื ืžืกื“ ื”ื ืชื•ื ื™ื ืฉืœื ื• ื‘ืืžืฆืขื•ืช ืงื•ื“ SQL ืจื’ื™ืœ. ืื ื™ ื‘ื˜ื•ื— ืฉืชื•ื›ืœื• ืœืžืฆื•ื ืขื•ื“ ื”ืจื‘ื” ืฉื™ืžื•ืฉื™ื, ื›ืชื‘ื• ื‘ืชื’ื•ื‘ื•ืช. ื•ืื ื—ื ื• ื ื“ื‘ืจ ืขืœ ืื™ืš (ื•ื”ื›ื™ ื—ืฉื•ื‘ ืœืžื”) ืœื”ืคื•ืš ืืช ื›ืœ ื–ื” ืœืื•ื˜ื•ืžื˜ื™ ื•ืœื›ืœื•ืœ ืื•ืชื• ื‘ืฆื™ื ื•ืจ ื”-CI/CD ืฉืœืš ื‘ืคืขื ื”ื‘ืื”.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”