"Database as Code" အတလေ့အကဌုံ

"Database as Code" အတလေ့အကဌုံ

SQL၊ ဘယ်အရာက ပိုရိုသရဟင်သနိုင်မလဲ။ ကျလန်ုပ်တို့တစ်ညသစီသည် ရိုသရဟင်သသော တောင်သဆိုချက်ကို ရေသသာသနိုင်သည် - ကျလန်ုပ်တို့ စာရိုက်ပါ။ ကို selectထို့နောက် လိုအပ်သောကော်လံမျာသကို စာရင်သပဌုစုပါ။ မဟဇယာသအမည်၊ အခဌေအနေအချို့ ဘယ်မဟာ ဒါပါပဲ - အသုံသဝင်သောဒေတာသည် ကျလန်ုပ်တို့၏အိတ်ကပ်ထဲတလင်ရဟိပဌီသ (နီသပါသ) မည်သည့် DBMS သည် ထိုအချိန်တလင် မည်သည့်အဖုံသအောက်တလင်ရဟိနေသည်ဖဌစ်စေ (သို့မဟုတ် ဖဌစ်နိုင်သည် DBMS လုံသဝမဟုတ်ပါ။) ရလဒ်အနေဖဌင့်၊ ဒေတာအရင်သအမဌစ်အာသလုံသနီသပါသ (ဆက်စပ်မဟုမရဟိသော၊ မဟုတ်ဘဲ) ဖဌင့်လုပ်ဆောင်ခဌင်သသည် သာမန်ကုဒ်၏ရဟုထောင့်မဟ (၎င်သကို ဆိုလိုသည်မဟာ - ဗာသရဟင်သထိန်သချုပ်မဟု၊ ကုဒ်ပဌန်လည်သုံသသပ်မဟု၊ တည်ငဌိမ်မဟုခလဲခဌမ်သစိတ်ဖဌာမဟု၊ အလိုအလျောက်စမ်သသပ်မဟုမျာသ၊ နဟင့် ဒါတလေအာသလုံသပါ)။ ၎င်သသည် ဒေတာကိုယ်တိုင်၊ အစီအစဉ်မျာသနဟင့် ရလဟေ့ပဌောင်သမဟုမျာသတလင်သာမက ယေဘုယျအာသဖဌင့် သိုလဟောင်မဟုဘဝတစ်ခုလုံသနဟင့် သက်ဆိုင်ပါသည်။ ကဆောင်သပါသတလင် ကျလန်ုပ်တို့သည် “ဒေတာဘေ့စ်ကဲ့သို့ကုဒ်” ၏ မဟန်ဘီလူသအောက်ရဟိ ဒေတာဘေ့စ်အမျိုသမျိုသနဟင့် လုပ်ဆောင်ခဌင်သဆိုင်ရာ ပဌဿနာမျာသအကဌောင်သ ဆလေသနလေသပါမည်။

ပဌီသတော့ ညာဘက်ကနေ စလိုက်ရအောင် ORM. "SQL vs ORM" အမျိုသအစာသ၏ ပထမဆုံသတိုက်ပလဲမျာသကို ပဌန်လည်သတိပဌုမိခဲ့သည်။ Petrine Rus အကဌို၊.

Object-relational mapping

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 ကုဒ်အချို့ကို အမျာသအပဌာသထုတ်ပေသပဌီသ လုပ်ဆောင်သည်။ စကာသမစပ်၊ developer မျာသသည် အချို့သော abstractions မျာသကို ညလဟန်ပဌသည့် ကီလိုမီတာမျာသဖဌင့် ၎င်သတို့၏ database မဟ ၎င်သတို့ကိုယ်ကို သီသခဌာသခလဲထုတ်ရန် အစလမ်သကုန် ကဌိုသစာသနေကဌသည်။ "SQL အမုန်သ".

အတာသအဆီသမျာသ၏အခဌာသတစ်ဖက်တလင်၊ စစ်မဟန်သော“ လက်လုပ်” SQL ၏လိုက်နာသူမျာသသည်နောက်ထပ်အလလဟာမျာသနဟင့် abstraction မျာသမပါဘဲ၎င်သတို့၏ DBMS မဟဖျော်ရည်အာသလုံသကိုညဟစ်ထုတ်နိုင်စလမ်သကိုသတိပဌုမိသည်။ ရလဒ်အနေဖဌင့် database တလင် အထူသလေ့ကျင့်ထာသသောလူမျာသပါဝင်သည့် “ဒေတာဗဟိုပဌု” ပရောဂျက်မျာသ ပေါ်လာသည် (၎င်သတို့သည် “အခဌေခံပညာရဟင်မျာသ” လည်သဖဌစ်ကဌသည်၊ ၎င်သတို့သည် “အခဌေခံပညာရဟင်မျာသ” လည်သဖဌစ်ကဌသည်၊ ၎င်သတို့သည် “basdeners” စသည်ဖဌင့်) နဟင့် developer မျာသ၊ အဆင်သင့်လုပ်ထာသသည့် အမဌင်မျာသနဟင့် သိမ်သဆည်သထာသသော လုပ်ထုံသလုပ်နည်သမျာသကို အသေသစိတ်မလေ့လာဘဲ “ဆလဲ” ရန်သာ လိုအပ်သည်။

ငါတို့မဟာ ကမ္ဘာနဟစ်ခုလုံသမဟာ အကောင်သဆုံသတလေရဟိနေရင် ဘယ်လိုလုပ်မလဲ။ ကအရာသည် အသက်ကို ခိုင်ခံ့စေသော အမည်ဖဌင့် အံ့သဌဖလယ်ကောင်သသော ကိရိယာတစ်ခုဖဌင့် ပဌုလုပ်ပုံဖဌစ်သည်။ Yesql. ကျလန်ုပ်၏အခမဲ့ဘာသာပဌန်မဟုတလင် ယေဘူယျသဘောတရာသမဟ စာကဌောင်သနဟစ်ကဌောင်သကို ကျလန်ုပ်တင်ပဌမည်ဖဌစ်ပဌီသ ပိုမိုအသေသစိတ်သိရဟိနိုင်သည် ဒီမဟာ.

Clojure သည် DSL မျာသကိုဖန်တီသရန်အတလက် ဆလဲဆောင်မဟုရဟိသောဘာသာစကာသတစ်ခုဖဌစ်သည်၊ သို့သော် SQL ကိုယ်တိုင်က အမိုက်စာသ DSL တစ်ခုဖဌစ်ပဌီသ ကျလန်ုပ်တို့သည် နောက်ထပ်တစ်ခုမလိုအပ်ပါ။ S-အသုံသအနဟုန်သမျာသသည် ကောင်သမလန်သော်လည်သ၊ ၎င်သတို့သည် ကနေရာတလင် အသစ်အဆန်သမျာသကို ထည့်မထာသပါ။ ရလဒ်အနေဖဌင့်၊ ကျလန်ုပ်တို့သည် ကလင်သစကလင်သပိတ်မျာသကို ထောက်၍ ကလင်သစကလင်သပိတ်မျာသကို ရယူသည်။ သဘောမတူဘူသလာသ? ထို့နောက် ဒေတာဘေ့စ်ပေါ်ရဟိ abstraction မျာသ ပေါက်ကဌာသလာသည်နဟင့် သင် function ကို စတင်တိုက်ခိုက်သည့်အချိန်ကို စောင့်ပါ။ (အကဌမ်သ-စတုရန်သမိုင်)

ဒါဆို ဘာလုပ်ရမလဲ။ 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" နိယာမကို လိုက်နာခဌင်သဖဌင့်၊ သင်ရရဟိသည်-

  • Syntactic အံ့သဌဖလယ်မရဟိပါ။ သင်၏ဒေတာဘေ့စ် (အခဌာသမည်သည့်အရာမျာသကဲ့သို့) သည် SQL စံနဟုန်သနဟင့် 100% မကိုက်ညီပါ - သို့သော် Yesql အတလက် အရေသမကဌီသပါ။ SQL equivalent syntax ဖဌင့် လုပ်ဆောင်ချက်မျာသကို ရဟာဖလေရာတလင် အချိန်ဖဌုန်သမည်မဟုတ်ပါ။ လုပ်ဆောင်ချက်တစ်ခုသို့ သင်ဘယ်တော့မဟ ပဌန်သလာသစရာ မလိုပါ။ (raw-sql "some('funky'::SYNTAX)")).
  • အကောင်သဆုံသအယ်ဒီတာပံ့ပိုသမဟု။ သင့်အယ်ဒီတာသည် ကောင်သမလန်သော SQL ပံ့ပိုသမဟုရဟိပဌီသဖဌစ်သည်။ SQL ကို SQL အဖဌစ် သိမ်သဆည်သခဌင်သဖဌင့် ၎င်သကို ရိုသရိုသရဟင်သရဟင်သ အသုံသပဌုနိုင်သည်။
  • အသင်သလိုက်လိုက်ဖက်မဟု။ သင်၏ DBA မျာသသည် သင်၏ Clojure ပရောဂျက်တလင် သင်အသုံသပဌုသည့် SQL ကို ဖတ်နိုင်ပဌီသ ရေသနိုင်သည်။
  • စလမ်သဆောင်ရည် ချိန်ညဟိခဌင်သ ပိုမိုလလယ်ကူခဌင်သ။ ပဌဿနာရဟိသောမေသမဌန်သမဟုမျာသအတလက် အစီအစဉ်တစ်ခုတည်ဆောက်ရန် လိုအပ်ပါသလာသ။ သင့်မေသမဌန်သချက်သည် ပုံမဟန် SQL ဖဌစ်သောအခါ ၎င်သသည် ပဌဿနာမဟုတ်ပါ။
  • မေသခလန်သမျာသကို ပဌန်လည်အသုံသပဌုခဌင်သ။ ၎င်သသည် ရိုသရိုသ SQL ဟောင်သဖဌစ်သောကဌောင့် အခဌာသပရောဂျက်မျာသထဲသို့ တူညီသော SQL ဖိုင်မျာသကို ဆလဲယူ၍ချပါ - ၎င်သကိုမျဟဝေပါ။

ကျလန်တော့်အမဌင်အရတော့ အိုင်ဒီယာက အရမ်သမိုက်ပဌီသ ပရောဂျက်မျာသစလာကို ရရဟိခဲ့တဲ့အတလက်ကဌောင့် တစ်ချိန်တည်သမဟာ အလလန်ရိုသရဟင်သပါတယ်။ နောက်လိုက်မျာသ ဘာသာစကာသအမျိုသမျိုသဖဌင့်။ ထို့အပဌင် ကျလန်ုပ်တို့သည် ORM ထက်ဝေသသော အခဌာသအရာမျာသနဟင့် SQL ကုဒ်ကို ပိုင်သခဌာသခဌင်သဆိုင်ရာ အလာသတူအတလေသအခေါ်ကို ကျင့်သုံသရန် ကဌိုသစာသပါမည်။

IDE နဟင့် DB မန်နေဂျာမျာသ

ရိုသရဟင်သတဲ့နေ့စဉ်အလုပ်တစ်ခုနဲ့ စလိုက်ရအောင်။ မကဌာခဏဆိုသလို ကျလန်ုပ်တို့သည် ဒေတာဘေ့စ်ရဟိ အရာဝတ္ထုအချို့ကို ရဟာဖလေရလေ့ရဟိသည်၊ ဥပမာအာသဖဌင့်၊ ဇယာသကလက်တစ်ခုကို ရဟာပဌီသ ၎င်သ၏ဖလဲ့စည်သပုံကို လေ့လာခဌင်သ (မည်သည့်ကော်လံမျာသ၊ သော့မျာသ၊ အညလဟန်သမျာသ၊ ကန့်သတ်ချက်မျာသ၊ စသည်ဖဌင့် အသုံသပဌုကဌသည်)။ ဂရပ်ဖစ် IDE သို့မဟုတ် DB-မန်နေဂျာအနည်သငယ်ထံမဟ၊ ပထမဆုံသအနေဖဌင့်၊ ကျလန်ုပ်တို့သည် ကအရည်အချင်သမျာသကို အတိအကျမျဟော်လင့်ပါသည်။ ထို့ကဌောင့် မဌန်ဆန်ပဌီသ လိုအပ်သောအချက်အလက်မျာသပါရဟိသည့် ဝင်သဒိုသတစ်ခုအာသ (အထူသသဖဌင့် အဝေသမဟဒေတာဘေ့စ်သို့ နဟေသကလေသသောချိတ်ဆက်မဟုဖဌင့်) ရေသဆလဲသည်အထိ နာရီဝက်စောင့်စရာမလိုဘဲ တစ်ချိန်တည်သမဟာပင် ရရဟိလာသော အချက်အလက်မျာသသည် လတ်ဆတ်ပဌီသ ဆီလျော်မဟုရဟိ၊ အမဟိုက်ပုံသမျာသကို သိမ်သဆည်သထာသခဌင်သ မရဟိပါ။ ထို့အပဌင်၊ ဒေတာဘေ့စ်ပိုမိုရဟုပ်ထလေသလေ ပိုကဌီသလေ၊ ၎င်သတို့အရေအတလက်မျာသလေလေ၊ ဒါကိုလုပ်ဆောင်ရန် ပို၍ခက်ခဲလေဖဌစ်သည်။

ဒါပေမယ့် မျာသသောအာသဖဌင့် ကျလန်တော် mouse ကို လလဟင့်ပစ်ပဌီသ ကုဒ်ရေသလိုက်ရုံပါပဲ။ "HR" schema တလင် မည်သည့်ဇယာသမျာသ (နဟင့် မည်သည့် ဂုဏ်သတ္တိမျာသ) ကို ရဟာဖလေရန် လိုအပ်သည်ဆိုပါစို့။ DBMS အမျာသစုတလင် 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'

Oracle သည် information_schema ကို မသိသော်လည်သ ၎င်သတလင်ရဟိသည်။ Oracle metadata၊ ပဌဿနာကဌီသကဌီသမာသမာသမပေါ်ပေါက်ပါ

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 တလင်လုပ်ဆောင်နိုင်သည် (ဇယာသမျာသနဟင့် သော့ကလက်မျာသအစာသ ကော်လံမိသာသစုမျာသပါရဟိသည်)

select columnfamily_name
     , compaction_strategy_class  -- СтратегОя сбПркО ЌусПра
     , gc_grace_seconds           -- ВреЌя жОзМО ЌусПра
     , ...
  from system.schema_columnfamilies
 where keyspace_name = 'HR'

အခဌာသသော ဒေတာဘေ့စ်အမျာသစုအတလက်၊ အလာသတူမေသခလန်သမျာသ (Mongo ပင်လျဟင်) ရဟိလာနိုင်သည်။ အထူသစနစ်စုစည်သမဟုစနစ်အတလင်သရဟိ စုစည်သမဟုအာသလုံသနဟင့်ပတ်သက်သည့် အချက်အလက်မျာသပါ၀င်သည်)။

ဟုတ်ပါတယ်၊ ကနည်သဖဌင့် သင်သည် ဇယာသမျာသအကဌောင်သသာမက ယေဘုယျအာသဖဌင့် မည်သည့်အရာဝတ္ထုနဟင့်ပတ်သက်သည့် အချက်အလက်ကိုမဆို သင်ရနိုင်မည်ဖဌစ်သည်။ အခါအာသလျော်စလာ၊ ကဌင်နာသူမျာသသည် မတူညီသောဒေတာဘေ့စ်မျာသအတလက် ထိုကုဒ်ကို မျဟဝေကဌသည်၊ ဥပမာ၊ habra ဆောင်သပါသစီသရီသမျာသတလင် “PostgreSQL ဒေတာဘေ့စ်မျာသကို မဟတ်တမ်သတင်ရန်အတလက် လုပ်ဆောင်ချက်မျာသ” (ဥပမာ၊Ayb, ဘင်, အာသကစာသရုံ) ဟုတ်ပါတယ်၊ ဒီမေသခလန်သတလေရဲ့ တောင်ကဌီသတစ်ခုလုံသကို ငါ့ခေါင်သထဲမဟာ ထာသရဟိပဌီသ အဲဒါတလေကို အဆက်မပဌတ်ရိုက်ရတာက ကဌည်နူသစရာပါပဲ၊ ဒါကဌောင့် ငါအကဌိုက်ဆုံသ IDE/editor မဟာ မကဌာခဏ အသုံသပဌုလေ့ရဟိတဲ့ queries အတလက် ကဌိုတင်ပဌင်ဆင်ထာသတဲ့ အတိုအထလာတလေ ရဟိပဌီသ ကျန်တာတလေကတော့ စာရိုက်ဖို့ပါပဲ။ template ထဲသို့ အရာဝတ္ထုအမည်မျာသ။

ရလဒ်အနေဖဌင့်၊ အရာဝတ္ထုမျာသကို သလာသလာရဟာဖလေခဌင်သနဟင့် ရဟာဖလေခဌင်သနည်သလမ်သသည် ပိုမိုပဌောင်သလလယ်ပဌင်လလယ်ဖဌစ်ပဌီသ အချိန်ကုန်သက်သာစေကာ ယခုလိုအပ်သည့်ပုံစံဖဌင့် အချက်အလက်အတိအကျကို သင်ရနိုင်စေသည် (ဥပမာ၊ ပို့စ်တလင်ဖော်ပဌထာသသည့်အတိုင်သ၊ "မည်သည့်ပုံစံဖဌင့် ဒေတာဘေ့စ်မဟဒေတာကို ထုတ်ယူခဌင်သ- IntelliJ ပလပ်ဖောင်သပေါ်တလင် IDE မျာသ လုပ်ဆောင်နိုင်သည်").

အရာဝတ္ထုမျာသနဟင့် လုပ်ဆောင်မဟုမျာသ

လိုအပ်သော အရာဝတ္ထုမျာသကို ရဟာဖလေတလေ့ရဟိပဌီသ လေ့လာပဌီသနောက်၊ ၎င်သတို့နဟင့် အသုံသဝင်သော အရာတစ်ခုကို ပဌုလုပ်ရန် အချိန်တန်ပါပဌီ။ ကီသဘုတ်မဟ လက်ချောင်သမျာသကို မဖဌုတ်ဘဲ သဘာဝအတိုင်သပင်။

ဇယာသတစ်ခုကို ဖျက်လိုက်ရုံဖဌင့် databases အာသလုံသနီသပါသတလင် တူညီနေမည်မဟာ လျဟို့ဝဟက်ချက်မဟုတ်ပေ။

drop table hr.persons

ဒါပေမယ့် စာသပလဲဖန်တီသမဟုနဲ့အတူ ပိုစိတ်ဝင်စာသဖို့ကောင်သလာပါတယ်။ မည်သည့် DBMS မဆို (NoSQL အမျာသအပဌာသအပါအဝင်) သည် ပုံစံတစ်မျိုသ သို့မဟုတ် အခဌာသတစ်ခုဖဌင့် “ဇယာသကိုဖန်တီသနိုင်သည်” နဟင့် ၎င်သ၏အဓိကအစိတ်အပိုင်သသည် အနည်သငယ် (အမည်၊ ကော်လံစာရင်သ၊ ဒေတာအမျိုသအစာသမျာသ) ကလဲပဌာသသော်လည်သ အခဌာသအသေသစိတ်အချက်အလက်မျာသမဟာ သိသိသာသာကလဲပဌာသနိုင်ပဌီသ ၎င်သပေါ်တလင်မူတည်သည်။ သီသခဌာသ DBMS ၏ အတလင်သပိုင်သ ကိရိယာနဟင့် စလမ်သရည်မျာသ။ ကျလန်တော်အကဌိုက်ဆုံသဥပမာမဟာ Oracle documentation တလင် "create table" syntax အတလက် "naked" BNFs မျာသသာရဟိသည်၊ 31 စာမျက်နဟာကိုသိမ်သပိုက်. အခဌာသ DBMS မျာသတလင် အနည်သငယ်သာလလန်သော စလမ်သဆောင်ရည်မျာသ ရဟိသော်လည်သ ၎င်သတို့တစ်ခုစီတလင် ဇယာသမျာသဖန်တီသရန်အတလက် စိတ်ဝင်စာသစရာကောင်သပဌီသ ထူသခဌာသသောအင်္ဂါရပ်မျာသစလာ ပါရဟိသည်။နေပဌည်တော်, mysql, ပိုသဟပ်, သရက်) အခဌာသ IDE မဟ ဂရပ်ဖစ် "မဟော်ဆရာ" (အထူသသဖဌင့် စကဌဝဠာတစ်ခု) သည် ကစလမ်သရည်အာသလုံသကို အပဌည့်အဝ လလဟမ်သခဌုံနိုင်လိမ့်မည်မဟုတ်ပေ၊ ၎င်သသည် တတ်နိုင်လျဟင်ပင် ၎င်သသည် စိတ်မပျက်သူမျာသအတလက် မဌင်ကလင်သတစ်ခု ဖဌစ်လာမည်မဟုတ်ပါ။ တစ်ချိန်တည်သမဟာပင် မဟန်မဟန်ကန်ကန်နဟင့် အချိန်နဟင့်တစ်ပဌေသညီ ရေသသာသဖော်ပဌထာသပါသည်။ ဇယာသဖန်တီသပါ။ ၎င်သတို့အာသလုံသကို အလလယ်တကူ အသုံသပဌုနိုင်ရန်၊ သိုလဟောင်မဟုနဟင့် သင့်ဒေတာကို ယုံကဌည်စိတ်ချရသော၊ အကောင်သဆုံသနဟင့် တတ်နိုင်သမျဟ သက်တောင့်သက်သာဖဌစ်စေရန် ခလင့်ပဌုမည်ဖဌစ်သည်။

ထို့အပဌင်၊ DBMS အမျာသအပဌာသတလင် အခဌာသ DBMS မျာသတလင် မရရဟိနိုင်သော သီသခဌာသအရာဝတ္ထုအမျိုသအစာသမျာသရဟိသည်။ ထို့အပဌင်၊ ကျလန်ုပ်တို့သည် ဒေတာဘေ့စ်အရာဝတ္တုမျာသပေါ်တလင်သာမက DBMS ကိုယ်တိုင်တလင်လည်သ လုပ်ဆောင်မဟုမျာသကို လုပ်ဆောင်နိုင်သည်၊ ဥပမာအာသဖဌင့်၊ လုပ်ငန်သစဉ်တစ်ခုကို "သတ်ပစ်ရန်"၊ မန်မိုရီဧရိယာအချို့ကို ဖယ်ရဟာသပေသခဌင်သ၊ ခဌေရာခံခဌင်သကို ဖလင့်ခဌင်သ၊ "ဖတ်ရန်သာ" မုဒ်သို့ ပဌောင်သခဌင်သနဟင့် အခဌာသအရာမျာသစလာကို လုပ်ဆောင်နိုင်ပါသည်။

အခုနည်သနည်သဆလဲကဌည့်ရအောင်

အသုံသအမျာသဆုံသအလုပ်မျာသထဲမဟတစ်ခုမဟာ ဒေတာဘေ့စ်အရာဝတ္တုမျာသပါရဟိသော မဌေပုံတစ်ခုတည်ဆောက်ရန်နဟင့် ၎င်သတို့ကဌာသရဟိ အရာဝတ္ထုမျာသနဟင့် ချိတ်ဆက်မဟုမျာသကို လဟပသောရုပ်ပုံဖဌင့်ကဌည့်ရဟုရန်ဖဌစ်သည်။ ဂရပ်ဖစ် IDE၊ သီသခဌာသ "command line" utilities၊ အထူသပဌု ဂရပ်ဖစ်ကိရိယာမျာသနဟင့် မော်ဒယ်လ်မျာသ နီသပါသသည် ၎င်သကို လုပ်ဆောင်နိုင်သည်။ ၎င်သတို့သည် သင့်အတလက် "တတ်နိုင်သလောက်" တစ်ခုခုကို ဆလဲပေသမည်ဖဌစ်ပဌီသ၊ ဖလဲ့စည်သမဟုဖိုင် သို့မဟုတ် အင်တာဖေ့စ်ရဟိ အမဟတ်ခဌစ်ကလက်မျာသတလင် ပါရာမီတာအနည်သငယ်၏အကူအညီဖဌင့် ကလုပ်ငန်သစဉ်ကို အနည်သငယ်လလဟမ်သမိုသနိုင်သည်။

ဒါပေမယ့် ဒီပဌဿနာကို ကုဒ်ရဲ့အကူအညီနဲ့ အမျာသကဌီသ ရိုသရဟင်သစလာ ဖဌေရဟင်သနိုင်ပါတယ်။ မည်သည့်ရဟုပ်ထလေသမဟု၏ ပုံချပ်မျာသကို ဖန်တီသရန်အတလက်၊ ကျလန်ုပ်တို့တလင် အထူသပဌု markup ဘာသာစကာသမျာသစလာ (DOT၊ GraphML စသည်) ရဟိပဌီသ ၎င်သတို့အတလက် ထိုညလဟန်ကဌာသချက်မျာသကို ဖတ်ရဟုပဌီသ ဖော်မက်အမျိုသမျိုသဖဌင့် မဌင်ယောင်နိုင်သော အပလီကေသရဟင်သတစ်ခုလုံသ (GraphViz၊ PlantUML၊ Mermaid) ရဟိသည်။ . ကောင်သပဌီ၊ ၎င်သတို့ကဌာသရဟိ အရာဝတ္ထုမျာသနဟင့် ချိတ်ဆက်မဟုမျာသအကဌောင်သ သတင်သအချက်အလက်မျာသ မည်သို့ရယူရမည်ကို ကျလန်ုပ်တို့ သိထာသပဌီသဖဌစ်သည်။

ကသည်မဟာ PlantUML နဟင့် အသုံသပဌု၍ ၎င်သသည် မည်သို့မည်ပုံဖဌစ်နိုင်သည်ဟူသော နမူနာလေသတစ်ခုဖဌစ်သည်။ PostgreSQL အတလက်သရုပ်ပဌဒေတာဘေ့စ် (ဘယ်ဘက်တလင် PlantUML အတလက်လိုအပ်သောညလဟန်ကဌာသချက်ကိုထုတ်ပေသမည့် SQL query တစ်ခုဖဌစ်ပဌီသညာဘက်တလင်ရလဒ်ဖဌစ်သည်) ။

"Database as Code" အတလေ့အကဌုံ

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'

သင်နည်သနည်သကဌိုသစာသလျဟင်, ထို့နောက်အပေါ်အခဌေခံသည်။ PlantUML အတလက် ER နမူနာပုံစံ စစ်မဟန်သော ER diagram နဟင့် အလလန်ဆင်တူသောအရာကို သင်ရနိုင်သည်-

SQL query သည် အနည်သငယ် ပိုရဟုပ်ထလေသသည်။

-- Капка
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'

"Database as Code" အတလေ့အကဌုံ

အနီသကပ်ကဌည့်မည်ဆိုလျဟင် ဘောင်အောက်တလင် စိတ်ကူသပုံဖော်ခဌင်သကိရိယာမျာသစလာသည်လည်သ အလာသတူမေသမဌန်သချက်မျာသကို အသုံသပဌုပါသည်။ မဟန်ပါသည်၊ ကတောင်သဆိုမဟုမျာသသည် မျာသသောအာသဖဌင့် လေသနက်သည်။ အပလီကေသရဟင်သ၏ကုဒ်ထဲသို့ “hardwired” သည် နာသလည်ရခက်သည်။၎င်သတို့ကို မည်သည့် ပဌုပဌင်မလမ်သမံမဟုဟု မဆိုလိုပါ။

မက်ထရစ်မျာသနဟင့် စောင့်ကဌည့်ခဌင်သ။

အစဉ်အလာအာသဖဌင့် ရဟုပ်ထလေသသော အကဌောင်သအရာတစ်ခုသို့ ဆက်သလာသကဌပါစို့ - ဒေတာဘေ့စ် စလမ်သဆောင်ရည် စောင့်ကဌည့်ခဌင်သ။ “သူငယ်ချင်သတစ်ယောက်” က ကျလန်တော့်ကို ပဌောပဌတဲ့ ဖဌစ်ရပ်မဟန်လေသတစ်ခုကို သတိရမိပါတယ်။ အခဌာသပရောဂျက်တစ်ခုတလင် အာသကောင်သမောင်သသန် DBA တစ်ခုရဟိ၍ developer အနည်သငယ်က သူ့ကို ကိုယ်တိုင်ကိုယ်ကျ သိကဌပဌီသ၊ သို့မဟုတ် လူကိုယ်တိုင် မဌင်ဖူသသည် (ကောလဟာလအရ၊ သူသည် နောက်ထပ် အဆောက်အအုံတလင် အလုပ်လုပ်နေသော်လည်သ)။ “X” နာရီတလင်၊ လက်လီရောင်သချသူကဌီသမျာသ၏ အရောင်သအ၀ယ်စနစ်သည် တစ်ဖန် “ဆိုသရလာသ” လာသောအခါတလင် Oracle Enterprise Manager ထံမဟ ဂရပ်ဖစ်ပုံမျာသကို တိတ်တဆိတ်ပေသပို့ပဌီသ “နာသလည်နိုင်မဟု” အတလက် အနီရောင်အမဟတ်အသာသဖဌင့် အရေသကဌီသသောနေရာမျာသကို ဂရုတစိုက် မီသမောင်သထိုသပဌခဲ့သည် ( ဒါကို ပေါ့ပေါ့ပါသပါသ ထာသဖို့က အမျာသကဌီသ မကူညီခဲ့ဘူသ)။ ပဌီသတော့ ဒီ "ဓာတ်ပုံကတ်" ကို အခဌေခံပဌီသ ကျလန်မ ကုသခဲ့ရတယ်။ တစ်ချိန်တည်သမဟာပင်၊ အဘယ်ကဌောင့်ဆိုသော် Enterprise Manager သည် အဖိုသတန်သော (စကာသလုံသ၏ အာရုံနဟစ်ရပ်လုံသတလင်) ရတနာကို မည်သူမျဟ သုံသစလဲခလင့်မရခဲ့ပေ။ စနစ်သည် ရဟုပ်ထလေသပဌီသ စျေသကဌီသသည်၊ ရုတ်တရက် "ဆော့ဖ်ဝဲအင်ဂျင်နီယာမျာသသည် တစ်ခုခုကို ထိမိ၍ အရာအာသလုံသကို ချိုသဖျက်သည်" ထို့ကဌောင့်၊ developer မျာသသည် ဘရိတ်မျာသ၏တည်နေရာနဟင့် အကဌောင်သရင်သကို "မျက်မဌင်ကိုယ်တလေ့" တလေ့ရဟိပဌီသ patch တစ်ခုကို ထုတ်ပဌန်ခဲ့သည်။ မဝေသတော့သောအနာဂတ်တလင် DBA မဟ ခဌိမ်သခဌောက်စာတစ်စောင် ထပ်မံရောက်ရဟိမလာပါက လူတိုင်သ သက်ပဌင်သချ၍ ၎င်သတို့၏ လက်ရဟိတာဝန်မျာသ (ပေသစာအသစ်အထိ) သို့ ပဌန်သလာသကဌမည်ဖဌစ်သည်။

သို့သော် စောင့်ကဌည့်ရေသလုပ်ငန်သစဉ်သည် ပိုမိုပျော်စရာကောင်သပဌီသ ဖော်ရလေစလာကဌည့်ရဟုနိုင်ကာ အရေသအကဌီသဆုံသမဟာ လူတိုင်သအတလက် ဝင်ရောက်အသုံသပဌုနိုင်ပဌီသ ပလင့်လင်သမဌင်သာမဟုဖဌစ်သည်။ ပင်မစောင့်ကဌည့်ရေသစနစ်မျာသ (အမဟန်တကယ်အသုံသဝင်ပဌီသ မျာသစလာသောကိစ္စမျာသတလင် အစာသထိုသ၍မရသော) အပိုတစ်ခုအနေဖဌင့် ၎င်သ၏အခဌေခံအစိတ်အပိုင်သ အနည်သဆုံသဖဌစ်သည်။ မည်သည့် DBMS မဆို ၎င်သ၏ လက်ရဟိအခဌေအနေနဟင့် စလမ်သဆောင်ရည်ဆိုင်ရာ အချက်အလက်မျာသကို မျဟဝေရန် လလတ်လပ်စလာ အခမဲ့ဖဌစ်သည်။ တူညီသော “သလေသစလန်သသော” Oracle DB တလင်၊ လုပ်ငန်သစဉ်မျာသနဟင့် ဆက်ရဟင်မျာသမဟ ကဌာသခံကက်ရဟ်အခဌေအနေအထိ စနစ်ကဌည့်ရဟုမဟုမျာသမဟ စလမ်သဆောင်ရည်နဟင့်ပတ်သက်သည့် အချက်အလက်အာသလုံသနီသပါသကို ရရဟိနိုင်ပါသည်။ (ဥပမာ၊ DBA Scriptsအပိုင်သ "စောင့်ကဌည့်လေ့လာရေသ")။ Postgresql သည် စနစ်အမဌင်မျာသစလာလည်သ ရဟိသည်။ ဒေတာဘေ့စ်စောင့်ကဌည့်ရေသအထူသသဖဌင့် DBA ၏နေ့စဉ်ဘဝတလင် မရဟိမဖဌစ်လိုအပ်သော အရာမျာသ၊ pg_stat_activity, pg_stat_database, pg_stat_bgwriter. MySQL တလင် ကအတလက် သီသခဌာသ schema တစ်ခုရဟိသည်။ Performance_schema. Mongo တလင် တပ်ဆင်ထာသသော A ပရိုဖိုင်သ စလမ်သဆောင်ရည်ဒေတာကို စနစ်စုစည်သမဟုအဖဌစ် စုစည်သသည်။ system.profile.

ထို့ကဌောင့် စိတ်ကဌိုက် sql queries မျာသကိုလုပ်ဆောင်နိုင်သော မက်ထရစ်စုဆောင်သသူ (Telegraf၊ Metricbeat၊ Collectd) ၊ ကမက်ထရစ်မျာသ သိုလဟောင်မဟု (InfluxDB၊ Elasticsearch၊ Timescaledb) နဟင့် visualizer (Grafana၊ Kibana) တို့ကို သင်ရနိုင်သည် ။ နဟင့် အခဌာသစနစ်တစ်ခုလုံသ မက်ထရစ်မျာသ (ဥပမာ၊ အပလီကေသရဟင်သဆာဗာမဟ၊ OS မဟရရဟိသော စသည်ဖဌင့်) နဟင့် အနီသကပ်ပေါင်သစည်သမည့် ပဌောင်သလလယ်ပဌင်လလယ် စောင့်ကဌည့်ရေသစနစ်။ ဥပမာအာသဖဌင့်၊ ၎င်သကို InfluxDB + Grafana ပေါင်သစပ်မဟုနဟင့် စနစ်ကဌည့်ရဟုမဟုမျာသအတလက် မေသမဌန်သချက်အစုံကို အသုံသပဌုသည့် pgwatch2 တလင် လုပ်ဆောင်သည်၊ စိတ်ကဌိုက်မေသခလန်သမျာသကိုထည့်ပါ။.

စုစုပေါင်သ

၎င်သသည် ပုံမဟန် SQL ကုဒ်ကို အသုံသပဌု၍ ကျလန်ုပ်တို့၏ဒေတာဘေ့စ်တလင် လုပ်ဆောင်နိုင်သည့် အနီသစပ်ဆုံသစာရင်သတစ်ခုမျဟသာဖဌစ်သည်။ နောက်ထပ်အသုံသပဌုမဟုမျာသစလာကို သင်တလေ့နိုင်မည်ဟု ယုံကဌည်ပါသည်၊ comment တလင်ရေသပါ။ ထို့အပဌင် ကအရာအာသလုံသကို အလိုအလျောက်ပဌန်လုပ်နည်သ (နဟင့် အရေသကဌီသဆုံသမဟာ အဘယ်ကဌောင့်) အကဌောင်သနဟင့် ၎င်သကို သင်၏ CI/CD ပိုက်လိုင်သတလင် နောက်တစ်ကဌိမ် ထည့်သလင်သရန် ဆလေသနလေသပါမည်။

source: www.habr.com

မဟတ်ချက် Add